aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-kerberos.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2008-10-03 05:21:28 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2008-10-03 05:21:28 +0000
commit24b76bdc14a64a150388f5cb4efee0fbcf3682a0 (patch)
treeb6ac214f3c77ab87beb5e9609e288993ed5e30df /epan/dissectors/packet-kerberos.c
parent5c82d9b784df05d32f94e63fc0faa168c96bae6a (diff)
add a -K command line option to provide the name of the kerberos keytab
file to use for decryption of Krb5 and GSS-KRB svn path=/trunk/; revision=26343
Diffstat (limited to 'epan/dissectors/packet-kerberos.c')
-rw-r--r--epan/dissectors/packet-kerberos.c78
1 files changed, 46 insertions, 32 deletions
diff --git a/epan/dissectors/packet-kerberos.c b/epan/dissectors/packet-kerberos.c
index d83102c5a8..bff55eefe8 100644
--- a/epan/dissectors/packet-kerberos.c
+++ b/epan/dissectors/packet-kerberos.c
@@ -422,24 +422,36 @@ printf("added key in %u\n",pinfo->fd->num);
#ifdef HAVE_MIT_KERBEROS
-static void
-read_keytab_file(const char *filename, krb5_context *context)
+static krb5_context krb5_ctx;
+
+void
+read_keytab_file(const char *filename)
{
krb5_keytab keytab;
- krb5_keytab_entry key;
krb5_error_code ret;
+ krb5_keytab_entry key;
krb5_kt_cursor cursor;
enc_key_t *new_key;
+ static int first_time=1;
+
+printf("read keytab file %s\n", filename);
+ if(first_time){
+ first_time=0;
+ ret = krb5_init_context(&krb5_ctx);
+ if(ret){
+ return;
+ }
+ }
/* should use a file in the wireshark users dir */
- ret = krb5_kt_resolve(*context, filename, &keytab);
+ ret = krb5_kt_resolve(krb5_ctx, filename, &keytab);
if(ret){
fprintf(stderr, "KERBEROS ERROR: Could not open keytab file :%s\n",filename);
return;
}
- ret = krb5_kt_start_seq_get(*context, keytab, &cursor);
+ ret = krb5_kt_start_seq_get(krb5_ctx, keytab, &cursor);
if(ret){
fprintf(stderr, "KERBEROS ERROR: Could not read from keytab file :%s\n",filename);
return;
@@ -448,7 +460,7 @@ read_keytab_file(const char *filename, krb5_context *context)
do{
new_key=g_malloc(sizeof(enc_key_t));
new_key->next=enc_key_list;
- ret = krb5_kt_next_entry(*context, keytab, &key, &cursor);
+ ret = krb5_kt_next_entry(krb5_ctx, keytab, &key, &cursor);
if(ret==0){
int i;
char *pos;
@@ -472,9 +484,9 @@ read_keytab_file(const char *filename, krb5_context *context)
}
}while(ret==0);
- ret = krb5_kt_end_seq_get(*context, keytab, &cursor);
+ ret = krb5_kt_end_seq_get(krb5_ctx, keytab, &cursor);
if(ret){
- krb5_kt_close(*context, keytab);
+ krb5_kt_close(krb5_ctx, keytab);
}
}
@@ -488,7 +500,6 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
int keytype)
{
static int first_time=1;
- static krb5_context context;
krb5_error_code ret;
enc_key_t *ek;
static krb5_data data = {0,0,NULL};
@@ -505,11 +516,7 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
/* should this have a destroy context ? MIT people would know */
if(first_time){
first_time=0;
- ret = krb5_init_context(&context);
- if(ret){
- return NULL;
- }
- read_keytab_file(keytab_filename, &context);
+ read_keytab_file(keytab_filename);
}
for(ek=enc_key_list;ek;ek=ek->next){
@@ -533,7 +540,7 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
key.key.enctype=ek->keytype;
key.key.length=ek->keylength;
key.key.contents=ek->keyvalue;
- ret = krb5_c_decrypt(context, &(key.key), usage, 0, &input, &data);
+ ret = krb5_c_decrypt(krb5_ctx, &(key.key), usage, 0, &input, &data);
if((ret == 0) && (length>0)){
char *user_data;
@@ -550,24 +557,36 @@ printf("woohoo decrypted keytype:%d in frame:%u\n", keytype, pinfo->fd->num);
}
#elif defined(HAVE_HEIMDAL_KERBEROS)
-static void
-read_keytab_file(const char *filename, krb5_context *context)
+static krb5_context krb5_ctx;
+
+void
+read_keytab_file(const char *filename)
{
krb5_keytab keytab;
+ krb5_error_code ret;
krb5_keytab_entry key;
krb5_error_code ret;
krb5_kt_cursor cursor;
enc_key_t *new_key;
+ static int first_time=1;
+
+ if(first_time){
+ first_time=0;
+ ret = krb5_init_context(&krb5_ctx);
+ if(ret){
+ return;
+ }
+ }
/* should use a file in the wireshark users dir */
- ret = krb5_kt_resolve(*context, filename, &keytab);
+ ret = krb5_kt_resolve(krb5_ctx, filename, &keytab);
if(ret){
fprintf(stderr, "KERBEROS ERROR: Could not open keytab file :%s\n",filename);
return;
}
- ret = krb5_kt_start_seq_get(*context, keytab, &cursor);
+ ret = krb5_kt_start_seq_get(krb5_ctx, keytab, &cursor);
if(ret){
fprintf(stderr, "KERBEROS ERROR: Could not read from keytab file :%s\n",filename);
return;
@@ -576,7 +595,7 @@ read_keytab_file(const char *filename, krb5_context *context)
do{
new_key=g_malloc(sizeof(enc_key_t));
new_key->next=enc_key_list;
- ret = krb5_kt_next_entry(*context, keytab, &key, &cursor);
+ ret = krb5_kt_next_entry(krb5_ctx, keytab, &key, &cursor);
if(ret==0){
unsigned int i;
char *pos;
@@ -599,9 +618,9 @@ read_keytab_file(const char *filename, krb5_context *context)
}
}while(ret==0);
- ret = krb5_kt_end_seq_get(*context, keytab, &cursor);
+ ret = krb5_kt_end_seq_get(krb5_ctx, keytab, &cursor);
if(ret){
- krb5_kt_close(*context, keytab);
+ krb5_kt_close(krb5_ctx, keytab);
}
}
@@ -615,7 +634,6 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
int keytype)
{
static int first_time=1;
- static krb5_context context;
krb5_error_code ret;
krb5_data data;
enc_key_t *ek;
@@ -631,11 +649,7 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
/* should this have a destroy context ? Heimdal people would know */
if(first_time){
first_time=0;
- ret = krb5_init_context(&context);
- if(ret){
- return NULL;
- }
- read_keytab_file(keytab_filename, &context);
+ read_keytab_file(keytab_filename);
}
for(ek=enc_key_list;ek;ek=ek->next){
@@ -651,7 +665,7 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
key.keyblock.keytype=ek->keytype;
key.keyblock.keyvalue.length=ek->keylength;
key.keyblock.keyvalue.data=ek->keyvalue;
- ret = krb5_crypto_init(context, &(key.keyblock), 0, &crypto);
+ ret = krb5_crypto_init(krb5_ctx, &(key.keyblock), 0, &crypto);
if(ret){
return NULL;
}
@@ -664,7 +678,7 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
*/
cryptocopy=g_malloc(length);
memcpy(cryptocopy, cryptotext, length);
- ret = krb5_decrypt_ivec(context, crypto, usage,
+ ret = krb5_decrypt_ivec(krb5_ctx, crypto, usage,
cryptocopy, length,
&data,
NULL);
@@ -674,13 +688,13 @@ decrypt_krb5_data(proto_tree *tree, packet_info *pinfo,
printf("woohoo decrypted keytype:%d in frame:%u\n", keytype, pinfo->fd->num);
proto_tree_add_text(tree, NULL, 0, 0, "[Decrypted using: %s]", ek->key_origin);
- krb5_crypto_destroy(context, crypto);
+ krb5_crypto_destroy(krb5_ctx, crypto);
/* return a private g_malloced blob to the caller */
user_data=g_malloc(data.length);
memcpy(user_data, data.data, data.length);
return user_data;
}
- krb5_crypto_destroy(context, crypto);
+ krb5_crypto_destroy(krb5_ctx, crypto);
}
return NULL;
}