2 * Routines for Novell SecretStore Services
3 * Greg Morris <gmorris@novell.com>
4 * Copyright (c) Novell, Inc. 2002-2003
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33 #include <epan/packet.h>
34 #include <epan/strutil.h>
35 #include "packet-ncp-int.h"
36 #include "packet-ncp-sss.h"
38 static guint32 subverb=0;
40 static gint ett_sss = -1;
42 static int proto_sss = -1;
43 static int hf_buffer_size = -1;
44 static int hf_ping_version = -1;
45 static int hf_flags = -1;
46 static int hf_context = -1;
47 static int hf_frag_handle = -1;
48 static int hf_length = -1;
49 static int hf_verb = -1;
50 static int hf_user = -1;
51 static int hf_secret = -1;
52 static int hf_sss_version = -1;
53 static int hf_return_code = -1;
54 static int hf_enc_cred = -1;
55 static int hf_enc_data = -1;
56 static int hfbit1 = -1;
57 static int hfbit2 = -1;
58 static int hfbit3 = -1;
59 static int hfbit4 = -1;
60 static int hfbit5 = -1;
61 static int hfbit6 = -1;
62 static int hfbit7 = -1;
63 static int hfbit8 = -1;
64 static int hfbit9 = -1;
65 static int hfbit10 = -1;
66 static int hfbit11 = -1;
67 static int hfbit12 = -1;
68 static int hfbit13 = -1;
69 static int hfbit14 = -1;
70 static int hfbit15 = -1;
71 static int hfbit16 = -1;
72 static int hfbit17 = -1;
73 static int hfbit18 = -1;
74 static int hfbit19 = -1;
75 static int hfbit20 = -1;
76 static int hfbit21 = -1;
77 static int hfbit22 = -1;
78 static int hfbit23 = -1;
79 static int hfbit24 = -1;
80 static int hfbit25 = -1;
81 static int hfbit26 = -1;
82 static int hfbit27 = -1;
83 static int hfbit28 = -1;
84 static int hfbit29 = -1;
85 static int hfbit30 = -1;
86 static int hfbit31 = -1;
87 static int hfbit32 = -1;
89 static const value_string sss_func_enum[] = {
90 { 0x00000001, "Ping Server" },
91 { 0x00000002, "Fragment" },
92 { 0x00000003, "Write App Secrets" },
93 { 0x00000004, "Add Secret ID" },
94 { 0x00000005, "Remove Secret ID" },
95 { 0x00000006, "Remove SecretStore" },
96 { 0x00000007, "Enumerate Secret IDs" },
97 { 0x00000008, "Unlock Store" },
98 { 0x00000009, "Set Master Password" },
99 { 0x0000000a, "Get Service Information" },
104 static const value_string sss_verb_enum[] = {
105 { 0x00000000, "Query Server" },
106 { 0x00000001, "Read App Secrets" },
107 { 0x00000002, "Write App Secrets" },
108 { 0x00000003, "Add Secret ID" },
109 { 0x00000004, "Remove Secret ID" },
110 { 0x00000005, "Remove SecretStore" },
111 { 0x00000006, "Enumerate Secret IDs" },
112 { 0x00000007, "Unlock Store" },
113 { 0x00000008, "Set Master Password" },
114 { 0x00000009, "Get Service Information" },
115 { 0x000000ff, "Fragment"},
119 static const value_string sss_subverb_enum[] _U_ = {
120 { 0, "Fragmented Ping" },
121 { 2, "Client Put Data" },
122 { 4, "Client Get Data" },
123 { 6, "Client Get User NDS Credentials" },
124 { 8, "Login Store Management" },
125 { 10, "Writable Object Check" },
126 { 1242, "Message Handler" },
130 static const value_string sss_msgverb_enum[] _U_ = {
132 { 3, "Start Session" },
133 { 5, "Client Write Data" },
134 { 7, "Client Read Data" },
135 { 9, "End Session" },
139 static const value_string sss_attribute_enum[] _U_ = {
143 { 11, "Login Sequence" },
147 static const value_string sss_lsmverb_enum[] _U_ = {
148 { 1, "Put Login Configuration" },
149 { 2, "Get Login Configuration" },
150 { 4, "Delete Login Configuration" },
151 { 5, "Put Login Secret" },
152 { 6, "Delete Login Secret" },
156 static const value_string sss_errors_enum[] = {
157 { 0xFFFFFCE0, "(-800) Target object could not be found" },
158 { 0xFFFFFCDF, "(-801) NICI operations have failed" },
159 { 0xFFFFFCDE, "(-802) The Secret ID is not in the user secret store" },
160 { 0xFFFFFCDD, "(-803) Some internal operating system services have not been available" },
161 { 0xFFFFFCDC, "(-804) Access to the target Secret Store has been denied" },
162 { 0xFFFFFCDB, "(-805) NDS internal NDS services have not been available" },
163 { 0xFFFFFCDA, "(-806) Secret has not been initialized with a write" },
164 { 0xFFFFFCD9, "(-807) Size of the buffer is not in a nominal range between minimum and maximum" },
165 { 0xFFFFFCD8, "(-808) Client and server components are not of the compatible versions" },
166 { 0xFFFFFCD7, "(-809) Secret Store data on the server has been corrupted" },
167 { 0xFFFFFCD6, "(-810) Secret ID already exists in the SecretStore" },
168 { 0xFFFFFCD5, "(-811) User NDS password has been changed by the administrator" },
169 { 0xFFFFFCD4, "(-812) Target NDS user object not found" },
170 { 0xFFFFFCD3, "(-813) Target NDS user object does not have a Secret Store" },
171 { 0xFFFFFCD2, "(-814) Secret Store is not on the network" },
172 { 0xFFFFFCD1, "(-815) Length of the Secret ID buffer exceeds the limit" },
173 { 0xFFFFFCD0, "(-816) Length of the enumeration buffer is too short" },
174 { 0xFFFFFCCF, "(-817) User not authenticated" },
175 { 0xFFFFFCCE, "(-818) Not supported operations" },
176 { 0xFFFFFCCD, "(-819) Typed in NDS password not valid" },
177 { 0xFFFFFCCC, "(-820) Session keys of the client and server NICI are out of sync" },
178 { 0xFFFFFCCB, "(-821) Requested service not yet supported" },
179 { 0xFFFFFCCA, "(-822) NDS authentication type not supported" },
180 { 0xFFFFFCC9, "(-823) Unicode text conversion operation failed" },
181 { 0xFFFFFCC8, "(-824) Connection to server is lost" },
182 { 0xFFFFFCC7, "(-825) Cryptographic operation failed" },
183 { 0xFFFFFCC6, "(-826) Opening a connection to the server failed" },
184 { 0xFFFFFCC5, "(-827) Access to server connection failed" },
185 { 0xFFFFFCC4, "(-828) Size of the enumeration buffer exceeds the limit" },
186 { 0xFFFFFCC3, "(-829) Size of the Secret buffer exceeds the limit" },
187 { 0xFFFFFCC2, "(-830) Length of the Secret ID should be greater than zero" },
188 { 0xFFFFFCC1, "(-831) Protocol data corrupted on the wire" },
189 { 0xFFFFFCC0, "(-832) Enhanced protection's password validation failed. Access to the secret denied" },
190 { 0xFFFFFCBF, "(-833) Schema is not extended to support SecretStore on the target tree" },
191 { 0xFFFFFCBE, "(-834) One of the optional service attributes is not instantiated" },
192 { 0xFFFFFCBD, "(-835) Server has been upgraded and the users SecretStore should be updated" },
193 { 0xFFFFFCBC, "(-836) Master password could not be verified to read or unlock the secrets" },
194 { 0xFFFFFCBB, "(-837) Master password has not been set on the SecretStore" },
195 { 0xFFFFFCBA, "(-838) Ability to use master password has been disabled" },
196 { 0xFFFFFCB9, "(-839) Not a writeable replica of NDS" },
197 { 0xFFFFFCB8, "(-840) The API was unable to find a value for an attribute in the Directory" },
198 { 0xFFFFFCB7, "(-841) A parameter passed to the API has not been properly initialized" },
199 { 0xFFFFFCB6, "(-842) The connection to SecretStore requires SSL to be secure" },
200 { 0xFFFFFCB5, "(-843) The client could not locate a server that supports the policy override required by the caller" },
201 { 0xFFFFFCB4, "(-844) Attempt to unlock SecretStore failed because the store is not locked" },
202 { 0xFFFFFCB3, "(-845) NDS Replica on the server that holds SecretStore is out of sync with the replica ring" },
203 { 0xFFFFFC88, "(-888) Feature not yet implemented" },
204 { 0xFFFFFC7D, "(-899) Products BETA life has expired" },
210 process_flags(proto_tree *sss_tree, tvbuff_t *tvb, guint32 foffset)
212 gchar flags_str[1024];
215 proto_tree *flags_tree;
223 flags = tvb_get_ntohl(tvb, foffset);
224 for (i = 0 ; i < 256; i++)
228 g_strlcat(flags_str, sep, 1024);
232 g_strlcat(flags_str, "Enhanced Protection", 1024);
235 g_strlcat(flags_str, "Create ID", 1024);
238 g_strlcat(flags_str, "Remove Lock", 1024);
241 g_strlcat(flags_str, "Repair", 1024);
244 g_strlcat(flags_str, "Unicode", 1024);
247 g_strlcat(flags_str, "EP Master Password Used", 1024);
250 g_strlcat(flags_str, "EP Password Used", 1024);
253 g_strlcat(flags_str, "Set Tree Name", 1024);
256 g_strlcat(flags_str, "Get Context", 1024);
259 g_strlcat(flags_str, "Destroy Context", 1024);
262 g_strlcat(flags_str, "Not Defined", 1024);
265 g_strlcat(flags_str, "Not Defined", 1024);
268 g_strlcat(flags_str, "EP Lock", 1024);
271 g_strlcat(flags_str, "Not Initialized", 1024);
274 g_strlcat(flags_str, "Enhanced Protection", 1024);
277 g_strlcat(flags_str, "Store Not Synced", 1024);
280 g_strlcat(flags_str, "Admin Last Modified", 1024);
283 g_strlcat(flags_str, "EP Password Present", 1024);
286 g_strlcat(flags_str, "EP Master Password Present", 1024);
289 g_strlcat(flags_str, "MP Disabled", 1024);
292 g_strlcat(flags_str, "Not Defined", 1024);
295 g_strlcat(flags_str, "Not Defined", 1024);
298 g_strlcat(flags_str, "Not Defined", 1024);
301 g_strlcat(flags_str, "Not Defined", 1024);
304 g_strlcat(flags_str, "Not Defined", 1024);
307 g_strlcat(flags_str, "Not Defined", 1024);
310 g_strlcat(flags_str, "Not Defined", 1024);
313 g_strlcat(flags_str, "Not Defined", 1024);
316 g_strlcat(flags_str, "Not Defined", 1024);
319 g_strlcat(flags_str, "Not Defined", 1024);
322 g_strlcat(flags_str, "Not Defined", 1024);
325 g_strlcat(flags_str, "Not Defined", 1024);
335 tinew = proto_tree_add_uint_format(sss_tree, hf_flags, tvb, foffset, 4, flags, "%s 0x%08x", "Flags:", flags);
336 flags_tree = proto_item_add_subtree(tinew, ett_nds);
340 for (i = 0 ; i < 256; i++ )
347 proto_tree_add_item(flags_tree, hfbit1, tvb, foffset, 4, FALSE);
350 proto_tree_add_item(flags_tree, hfbit2, tvb, foffset, 4, FALSE);
353 proto_tree_add_item(flags_tree, hfbit3, tvb, foffset, 4, FALSE);
356 proto_tree_add_item(flags_tree, hfbit4, tvb, foffset, 4, FALSE);
359 proto_tree_add_item(flags_tree, hfbit5, tvb, foffset, 4, FALSE);
362 proto_tree_add_item(flags_tree, hfbit6, tvb, foffset, 4, FALSE);
365 proto_tree_add_item(flags_tree, hfbit7, tvb, foffset, 4, FALSE);
368 proto_tree_add_item(flags_tree, hfbit8, tvb, foffset, 4, FALSE);
371 proto_tree_add_item(flags_tree, hfbit9, tvb, foffset, 4, FALSE);
374 proto_tree_add_item(flags_tree, hfbit10, tvb, foffset, 4, FALSE);
377 proto_tree_add_item(flags_tree, hfbit11, tvb, foffset, 4, FALSE);
380 proto_tree_add_item(flags_tree, hfbit12, tvb, foffset, 4, FALSE);
383 proto_tree_add_item(flags_tree, hfbit13, tvb, foffset, 4, FALSE);
386 proto_tree_add_item(flags_tree, hfbit14, tvb, foffset, 4, FALSE);
389 proto_tree_add_item(flags_tree, hfbit15, tvb, foffset, 4, FALSE);
392 proto_tree_add_item(flags_tree, hfbit16, tvb, foffset, 4, FALSE);
395 proto_tree_add_item(flags_tree, hfbit17, tvb, foffset, 4, FALSE);
398 proto_tree_add_item(flags_tree, hfbit18, tvb, foffset, 4, FALSE);
401 proto_tree_add_item(flags_tree, hfbit19, tvb, foffset, 4, FALSE);
404 proto_tree_add_item(flags_tree, hfbit20, tvb, foffset, 4, FALSE);
407 proto_tree_add_item(flags_tree, hfbit21, tvb, foffset, 4, FALSE);
410 proto_tree_add_item(flags_tree, hfbit22, tvb, foffset, 4, FALSE);
413 proto_tree_add_item(flags_tree, hfbit23, tvb, foffset, 4, FALSE);
416 proto_tree_add_item(flags_tree, hfbit24, tvb, foffset, 4, FALSE);
419 proto_tree_add_item(flags_tree, hfbit25, tvb, foffset, 4, FALSE);
422 proto_tree_add_item(flags_tree, hfbit26, tvb, foffset, 4, FALSE);
425 proto_tree_add_item(flags_tree, hfbit27, tvb, foffset, 4, FALSE);
428 proto_tree_add_item(flags_tree, hfbit28, tvb, foffset, 4, FALSE);
431 proto_tree_add_item(flags_tree, hfbit29, tvb, foffset, 4, FALSE);
434 proto_tree_add_item(flags_tree, hfbit30, tvb, foffset, 4, FALSE);
437 proto_tree_add_item(flags_tree, hfbit31, tvb, foffset, 4, FALSE);
440 proto_tree_add_item(flags_tree, hfbit32, tvb, foffset, 4, FALSE);
452 find_delimiter(tvbuff_t *tvb, int foffset)
458 for (i=0; i < 256; i++)
460 c_char = tvb_get_guint8(tvb, foffset);
461 if (c_char == 0x2a || tvb_length_remaining(tvb, foffset)==0)
472 sss_string(tvbuff_t* tvb, int hfinfo, proto_tree *sss_tree, int offset, gboolean little, guint32 length)
474 int foffset = offset;
479 guint32 length_remaining = 0;
484 str_length = tvb_get_letohl(tvb, foffset);
488 str_length = tvb_get_ntohl(tvb, foffset);
496 length_remaining = tvb_length_remaining(tvb, foffset);
497 if(str_length > (guint)length_remaining || str_length > 1024)
499 proto_tree_add_string(sss_tree, hfinfo, tvb, foffset,
500 length_remaining + 4, "<String too long to process>");
501 foffset += length_remaining;
506 proto_tree_add_string(sss_tree, hfinfo, tvb, offset,
507 4, "<Not Specified>");
510 for ( i = 0; i < str_length; i++ )
512 c_char = tvb_get_guint8(tvb, foffset );
513 if (c_char<0x20 || c_char>0x7e)
518 buffer[i] = c_char & 0xff;
528 buffer[i] = c_char & 0xff;
533 if(length_remaining==1)
544 str_length = tvb_get_letohl(tvb, offset);
548 str_length = tvb_get_ntohl(tvb, offset);
556 proto_tree_add_string(sss_tree, hfinfo, tvb, offset,
562 dissect_sss_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ncp_tree, ncp_req_hash_value *request_value)
564 guint8 func, subfunc = 0;
565 guint32 msg_length=0;
571 if (tvb_length_remaining(tvb, foffset)<4) {
575 func = tvb_get_guint8(tvb, foffset);
577 subfunc = tvb_get_guint8(tvb, foffset);
580 /* Fill in the PROTOCOL & INFO columns. */
581 if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
582 col_set_str(pinfo->cinfo, COL_PROTOCOL, "NSSS");
584 if (check_col(pinfo->cinfo, COL_INFO)) {
585 col_add_fstr(pinfo->cinfo, COL_INFO, "C SecretStore - %s", val_to_str(subfunc, sss_func_enum, "Unknown (%d)"));
589 aitem = proto_tree_add_text(ncp_tree, tvb, foffset, tvb_length_remaining(tvb, foffset), "Packet Type: %s", val_to_str(subfunc, sss_func_enum, "Unknown (%d)"));
590 atree = proto_item_add_subtree(aitem, ett_sss);
591 proto_tree_add_item(atree, hf_ping_version, tvb, foffset, 4, TRUE);
593 proto_tree_add_item(atree, hf_flags, tvb, foffset, 4, TRUE);
597 proto_tree_add_item(ncp_tree, hf_frag_handle, tvb, foffset, 4, TRUE);
598 if (tvb_get_letohl(tvb, foffset)==0xffffffff) /* Fragment handle of -1 means no fragment. So process packet */
601 proto_tree_add_item(ncp_tree, hf_buffer_size, tvb, foffset, 4, TRUE);
603 proto_tree_add_item(ncp_tree, hf_length, tvb, foffset, 4, TRUE);
605 foffset += 12; /* Blank Context */
606 subverb = tvb_get_letohl(tvb, foffset);
607 if (check_col(pinfo->cinfo, COL_INFO)) {
608 col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str(subverb, sss_verb_enum, "Unknown (%d)"));
610 aitem = proto_tree_add_item(ncp_tree, hf_verb, tvb, foffset, 4, TRUE);
611 atree = proto_item_add_subtree(aitem, ett_sss);
613 request_value->req_nds_flags=subverb;
616 process_flags(atree, tvb, foffset);
618 proto_tree_add_item(atree, hf_context, tvb, foffset, 4, FALSE);
623 foffset = sss_string(tvb, hf_user, atree, foffset, TRUE, 0);
626 foffset = sss_string(tvb, hf_secret, atree, foffset, TRUE, 0);
627 msg_length = tvb_get_letohl(tvb, foffset);
628 foffset += (msg_length+4); /* Unsure of what this length and parameter are */
629 /* A bad secret of length greater then 256 characters will cause frag
630 packets and then we will see these as malformed packets.
631 So check to make sure we still have data in the packet anytime
633 if (tvb_length_remaining(tvb, foffset) > 4)
635 foffset = sss_string(tvb, hf_user, atree, foffset, TRUE, 0);
640 foffset = sss_string(tvb, hf_secret, atree, foffset, TRUE, 0);
641 if (tvb_length_remaining(tvb, foffset) > 4)
643 msg_length = tvb_get_letohl(tvb, foffset);
645 if (tvb_length_remaining(tvb, foffset) < (gint) msg_length)
647 proto_tree_add_item(atree, hf_enc_data, tvb, foffset, -1, TRUE);
651 proto_tree_add_item(atree, hf_enc_data, tvb, foffset, msg_length, TRUE);
657 foffset = sss_string(tvb, hf_secret, atree, foffset, TRUE, 0);
658 if (tvb_length_remaining(tvb, foffset) > 4)
660 foffset = sss_string(tvb, hf_user, atree, foffset, TRUE, 0);
666 foffset = sss_string(tvb, hf_secret, atree, foffset, TRUE, 0);
667 if (tvb_length_remaining(tvb, foffset) > 4)
669 foffset = sss_string(tvb, hf_user, atree, foffset, TRUE, 0);
673 msg_length = tvb_get_letohl(tvb, foffset);
675 proto_tree_add_item(atree, hf_enc_cred, tvb, foffset, msg_length, FALSE);
686 if (check_col(pinfo->cinfo, COL_INFO)) {
687 col_set_str(pinfo->cinfo, COL_INFO, "C SecretStore - fragment");
688 proto_tree_add_text(ncp_tree, tvb, foffset, 4, "Fragment");
690 /* Fragments don't really carry a subverb so store 0xff as the subverb number */
692 request_value->req_nds_flags=255;
694 if (tvb_length_remaining(tvb, foffset) > 8)
697 proto_tree_add_item(ncp_tree, hf_enc_data, tvb, foffset, tvb_length_remaining(tvb, foffset), TRUE);
710 dissect_sss_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ncp_tree, guint8 subfunc, ncp_req_hash_value *request_value)
715 guint32 msg_length=0;
716 guint32 return_code=0;
717 guint32 number_of_items=0;
718 gint32 length_of_string=0;
723 proto_item *expert_item;
728 subverb = request_value->req_nds_flags;
729 msgverb = request_value->nds_request_verb;
731 if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
732 col_set_str(pinfo->cinfo, COL_PROTOCOL, "NSSS");
734 if (tvb_length_remaining(tvb, foffset)<4) {
737 aitem = proto_tree_add_text(ncp_tree, tvb, foffset, tvb_length_remaining(tvb, foffset), "Function: %s", val_to_str(subfunc, sss_func_enum, "val_to_str"));
738 atree = proto_item_add_subtree(aitem, ett_sss);
741 proto_tree_add_item(atree, hf_flags, tvb, foffset, 4, TRUE);
743 proto_tree_add_item(atree, hf_sss_version, tvb, foffset, 4, TRUE);
747 if (match_strval(subverb, sss_verb_enum)) {
748 proto_tree_add_text(atree, tvb, foffset, tvb_length_remaining(tvb, foffset), "Verb: %s", match_strval(subverb, sss_verb_enum));
750 proto_tree_add_item(atree, hf_length, tvb, foffset, 4, TRUE);
751 msg_length = tvb_get_letohl(tvb, foffset);
752 return_code = tvb_get_ntohl(tvb, foffset+msg_length);
754 proto_tree_add_item(atree, hf_frag_handle, tvb, foffset, 4, TRUE);
757 if ((tvb_get_letohl(tvb, foffset-4)==0xffffffff) && (msg_length > 4))
760 return_code = tvb_get_letohl(tvb, foffset);
761 if ( match_strval(return_code, sss_errors_enum) != NULL )
763 expert_item = proto_tree_add_item(atree, hf_return_code, tvb, foffset, 4, TRUE);
764 expert_add_info_format(pinfo, expert_item, PI_RESPONSE_CODE, PI_ERROR, "SSS Error: %s", match_strval(return_code, sss_errors_enum));
765 if (check_col(pinfo->cinfo, COL_INFO)) {
766 col_add_fstr(pinfo->cinfo, COL_INFO, "R Error - %s", val_to_str(return_code, sss_errors_enum, "Unknown (%d)"));
772 proto_tree_add_text(atree, tvb, foffset, 4, "Return Code: Success (0x00000000)");
773 if (tvb_length_remaining(tvb, foffset) > 8) {
778 number_of_items = tvb_get_letohl(tvb, foffset);
780 for (i=0; i<number_of_items; i++)
782 length_of_string = find_delimiter(tvb, foffset);
783 if (length_of_string > tvb_length_remaining(tvb, foffset))
787 foffset = sss_string(tvb, hf_secret, atree, foffset, TRUE, length_of_string);
788 if (tvb_length_remaining(tvb, foffset) < 8)
798 proto_tree_add_item(atree, hf_enc_data, tvb, foffset, tvb_length_remaining(tvb, foffset), TRUE);
805 proto_tree_add_text(atree, tvb, foffset, 4, "Return Code: Success (0x00000000)");
806 if (tvb_length_remaining(tvb, foffset) > 8) {
808 proto_tree_add_item(atree, hf_enc_data, tvb, foffset, tvb_length_remaining(tvb, foffset), TRUE);
820 proto_register_sss(void)
822 static hf_register_info hf_sss[] = {
824 { "Buffer Size", "sss.buffer", FT_UINT32, BASE_DEC, NULL, 0x0,
828 { "Ping Version", "sss.ping_version", FT_UINT32, BASE_HEX, NULL, 0x0,
832 { "Flags", "sss.flags", FT_UINT32, BASE_HEX, NULL, 0x0,
836 { "Context", "sss.context", FT_UINT32, BASE_HEX, NULL, 0x0,
840 { "Fragment Handle", "sss.frag_handle", FT_UINT32, BASE_HEX, NULL, 0x0,
844 { "Length", "sss.length", FT_UINT32, BASE_DEC, NULL, 0x0,
848 { "Verb", "sss.verb",
849 FT_UINT32, BASE_HEX, VALS(sss_verb_enum), 0x0,
853 { "User", "sss.user",
854 FT_STRING, BASE_NONE, NULL, 0x0,
858 { "Secret ID", "sss.secret",
859 FT_STRING, BASE_NONE, NULL, 0x0,
863 { "SecretStore Protocol Version", "sss.version", FT_UINT32, BASE_HEX, NULL, 0x0,
867 { "Return Code", "sss.return_code", FT_UINT32, BASE_HEX, VALS(sss_errors_enum), 0x0,
871 { "Encrypted Credential", "sss.enc_cred",
872 FT_BYTES, BASE_NONE, NULL, 0x0,
876 { "Encrypted Data", "sss.enc_data",
877 FT_BYTES, BASE_NONE, NULL, 0x0,
881 { "Enhanced Protection", "ncp.sss_bit1", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }},
884 { "Create ID", "ncp.sss_bit2", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }},
887 { "Remove Lock", "ncp.sss_bit3", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }},
890 { "Repair", "ncp.sss_bit4", FT_BOOLEAN, 32, NULL, 0x00000008, NULL, HFILL }},
893 { "Unicode", "ncp.sss_bit5", FT_BOOLEAN, 32, NULL, 0x00000010, NULL, HFILL }},
896 { "EP Master Password Used", "ncp.sss_bit6", FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL }},
899 { "EP Password Used", "ncp.sss_bit7", FT_BOOLEAN, 32, NULL, 0x00000040, NULL, HFILL }},
902 { "Set Tree Name", "ncp.sss_bit8", FT_BOOLEAN, 32, NULL, 0x00000080, NULL, HFILL }},
905 { "Get Context", "ncp.sss_bit9", FT_BOOLEAN, 32, NULL, 0x00000100, NULL, HFILL }},
908 { "Destroy Context", "ncp.sss_bit10", FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL }},
911 { "Not Defined", "ncp.sss_bit11", FT_BOOLEAN, 32, NULL, 0x00000400, NULL, HFILL }},
914 { "Not Defined", "ncp.sss_bit12", FT_BOOLEAN, 32, NULL, 0x00000800, NULL, HFILL }},
917 { "Not Defined", "ncp.sss_bit13", FT_BOOLEAN, 32, NULL, 0x00001000, NULL, HFILL }},
920 { "Not Defined", "ncp.sss_bit14", FT_BOOLEAN, 32, NULL, 0x00002000, NULL, HFILL }},
923 { "Not Defined", "ncp.sss_bit15", FT_BOOLEAN, 32, NULL, 0x00004000, NULL, HFILL }},
926 { "Not Defined", "ncp.sss_bit16", FT_BOOLEAN, 32, NULL, 0x00008000, NULL, HFILL }},
929 { "EP Lock", "ncp.sss_bit17", FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL }},
932 { "Not Initialized", "ncp.sss_bit18", FT_BOOLEAN, 32, NULL, 0x00020000, NULL, HFILL }},
935 { "Enhanced Protection", "ncp.sss_bit19", FT_BOOLEAN, 32, NULL, 0x00040000, NULL, HFILL }},
938 { "Store Not Synced", "ncp.sss_bit20", FT_BOOLEAN, 32, NULL, 0x00080000, NULL, HFILL }},
941 { "Admin Last Modified", "ncp.sss_bit21", FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL }},
944 { "EP Password Present", "ncp.sss_bit22", FT_BOOLEAN, 32, NULL, 0x00200000, NULL, HFILL }},
947 { "EP Master Password Present", "ncp.sss_bit23", FT_BOOLEAN, 32, NULL, 0x00400000, NULL, HFILL }},
950 { "MP Disabled", "ncp.sss_bit24", FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL }},
953 { "Not Defined", "ncp.sss_bit25", FT_BOOLEAN, 32, NULL, 0x01000000, NULL, HFILL }},
956 { "Not Defined", "ncp.sss_bit26", FT_BOOLEAN, 32, NULL, 0x02000000, NULL, HFILL }},
959 { "Not Defined", "ncp.sss_bit27", FT_BOOLEAN, 32, NULL, 0x04000000, NULL, HFILL }},
962 { "Not Defined", "ncp.sss_bit28", FT_BOOLEAN, 32, NULL, 0x08000000, NULL, HFILL }},
965 { "Not Defined", "ncp.sss_bit29", FT_BOOLEAN, 32, NULL, 0x10000000, NULL, HFILL }},
968 { "Not Defined", "ncp.sss_bit30", FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL }},
971 { "Not Defined", "ncp.sss_bit31", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }},
974 { "Not Defined", "ncp.sss_bit32", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }},
978 static gint *ett[] = {
981 /*module_t *sss_module;*/
983 proto_sss = proto_register_protocol("Novell SecretStore Services", "SSS", "sss");
984 proto_register_field_array(proto_sss, hf_sss, array_length(hf_sss));
985 proto_register_subtree_array(ett, array_length(ett));