fc19dc57f66de1e01fbead2d3e674293e425e218
[obnox/wireshark/wip.git] / plugins / opcua / opcua_security_layer.c
1 /******************************************************************************
2 ** $Id$
3 **
4 ** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
5 ** Web: http://www.ascolab.com
6 ** 
7 ** This program is free software; you can redistribute it and/or
8 ** modify it under the terms of the GNU General Public License
9 ** as published by the Free Software Foundation; either version 2
10 ** of the License, or (at your option) any later version.
11 ** 
12 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14 ** 
15 ** Project: OpcUa Wireshark Plugin
16 **
17 ** Description: OpcUa Security Layer Decoder.
18 **
19 ** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
20 ** Last change by: $Author: gergap $
21 **
22 ******************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <gmodule.h>
29 #include <epan/packet.h>
30 #include "opcua_application_layer.h"
31 #include "opcua_simpletypes.h"
32
33 /** NodeClass enum table */
34 static const value_string g_SecSigTable[] = {
35   { 0, "GetSecurityPolcies" },
36   { 1, "OpenSecureChannel" },
37   { 2, "CloseSecureChannel" },
38   { 3, "Message" },
39   { 0, NULL }
40 };
41
42 static int hf_opcua_security_sig = -1;
43 static int hf_opcua_security_policy = -1;
44 static int hf_opcua_security_channel = -1;
45 static int hf_opcua_security_token = -1;
46
47 static hf_register_info hf[] =
48 {
49     { &hf_opcua_security_sig,
50     {  "Security Signature",       "security.sig",     FT_UINT16, BASE_HEX,  VALS(g_SecSigTable), 0x0, "", HFILL }
51     },
52     { &hf_opcua_security_policy,
53     {  "Security Policy",          "security.policy",  FT_STRING, BASE_NONE,  NULL, 0x0,    "",    HFILL }
54     },
55     { &hf_opcua_security_channel,
56     {  "Secure Channel Id",        "security.channel", FT_GUID,   BASE_NONE,  NULL, 0x0,    "",    HFILL }
57     },
58     { &hf_opcua_security_token,
59     {  "Security Token Id",        "security.token",   FT_STRING, BASE_NONE,  NULL, 0x0,    "",    HFILL }
60     }
61 };
62
63 /** Register security layer types. */
64 void registerSecurityLayerTypes(int proto)
65 {
66     proto_register_field_array(proto, hf, array_length(hf));
67 }
68
69
70 /* Security Layer: message parsers
71  * Only works for Security Policy "NoSecurity" at the moment.
72  */
73 void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
74 {
75     guint16 Sig;
76     
77     Sig = tvb_get_letohs(tvb, pOffset[0]);
78     proto_tree_add_item(tree, hf_opcua_security_sig, tvb, *pOffset, 2, TRUE); *pOffset+=2;
79
80     switch (Sig)
81     {
82     case 0: /* GetSecurityPolicies */
83         break;
84     case 1: /* OpenSecureChannel */
85         parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);
86         parseString(tree, tvb, pOffset, hf_opcua_security_policy);
87         break;
88     case 2: /* CloseSecureChannel */
89         parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);
90         parseString(tree, tvb, pOffset, hf_opcua_security_token);
91         break;
92     case 3: /* Other Services Messages */
93         parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);
94         parseString(tree, tvb, pOffset, hf_opcua_security_token);
95         break;
96     }
97 }
98
99