diff options
author | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2003-07-13 01:43:33 +0000 |
---|---|---|
committer | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2003-07-13 01:43:33 +0000 |
commit | e146533cfd8e65cbc3a867954bce5a06d4ec1766 (patch) | |
tree | 7509cef90ef5ef664493e0c1237bce3e5aafbb28 /packet-per.c | |
parent | 6ffb0280ee4da969b26107a53eb6c4f7d26cc0ea (diff) |
Add decoding of NumericString
svn path=/trunk/; revision=8018
Diffstat (limited to 'packet-per.c')
-rw-r--r-- | packet-per.c | 115 |
1 files changed, 113 insertions, 2 deletions
diff --git a/packet-per.c b/packet-per.c index 8e931ee8c8..d7c38fa3ef 100644 --- a/packet-per.c +++ b/packet-per.c @@ -7,7 +7,7 @@ proper helper routines * Routines for dissection of ASN.1 Aligned PER * 2003 Ronnie Sahlberg * - * $Id: packet-per.c,v 1.1 2003/07/12 22:35:20 sahlberg Exp $ + * $Id: packet-per.c,v 1.2 2003/07/13 01:43:33 sahlberg Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -262,6 +262,117 @@ dissect_per_IA5String(tvbuff_t *tvb, guint32 offset, packet_info *pinfo, proto_t return offset; } +/* XXX we dont do >64k length strings yet */ +static guint32 +dissect_per_restricted_character_string(tvbuff_t *tvb, guint32 offset, packet_info *pinfo, proto_tree *tree, int hf_index, int min_len, int max_len, char *alphabet, int alphabet_length) +{ + guint32 length; + gboolean byte_aligned; + static char str[1024]; + int char_pos, bits_per_char; + guint32 old_offset; + +DEBUG_ENTRY("dissect_per_restricted_character_string"); + /* xx.x if the length is 0 bytes there will be no encoding */ + if(max_len==0){ + return offset; + } + + + if(min_len==-1){ + min_len=0; + } + + + /* xx.x */ + length=max_len; + if(min_len!=max_len){ + offset=dissect_per_constrained_integer(tvb, offset, pinfo, + tree, hf_per_octet_string_length, min_len, max_len, + &length, NULL); + } + + + + /* xx.x if length is fixed or constrained to be less than or equal to + two bytes, then it will not be byte aligned. */ + byte_aligned=TRUE; + if((min_len==max_len)&&(max_len<=2)){ + byte_aligned=FALSE; + } + if(max_len<2){ + byte_aligned=FALSE; + } + + if(byte_aligned){ + if(offset&0x07){ + offset=(offset&0xfffffff8)+8; + } + } + + + if(length>=1024){ + NOT_DECODED_YET("restricted char string too long"); + length=1024; + } + + /* 27.5.2 depending of the alphabet length, find how many bits + are used to encode each character */ +/* unaligned PER + if(alphabet_length<=2){ + bits_per_char=1; + } else if(alphabet_length<=4){ + bits_per_char=2; + } else if(alphabet_length<=8){ + bits_per_char=3; + } else if(alphabet_length<=16){ + bits_per_char=4; + } else if(alphabet_length<=32){ + bits_per_char=5; + } else if(alphabet_length<=64){ + bits_per_char=6; + } else if(alphabet_length<=128){ + bits_per_char=7; + } else { + bits_per_char=8; + } +*/ + if(alphabet_length<=2){ + bits_per_char=1; + } else if(alphabet_length<=4){ + bits_per_char=2; + } else if(alphabet_length<=16){ + bits_per_char=4; + } else { + bits_per_char=8; + } + + old_offset=offset; + for(char_pos=0;char_pos<length;char_pos++){ + char val; + int i; + gboolean bit; + + val=0; + for(i=0;i<bits_per_char;i++){ + offset=dissect_per_boolean(tvb, offset, pinfo, tree, -1, &bit, NULL); + val=(val<<1)|bit; + } + str[char_pos]=alphabet[val]; + } + str[char_pos]=0; + proto_tree_add_string(tree, hf_index, tvb, (old_offset>>3), (offset>>3)-(old_offset>>3), str); + + return offset; +} +guint32 +dissect_per_NumericString(tvbuff_t *tvb, guint32 offset, packet_info *pinfo, proto_tree *tree, int hf_index, int min_len, int max_len) +{ + offset=dissect_per_restricted_character_string(tvb, offset, pinfo, tree, hf_index, min_len, max_len, "0123456789 ", 11); + + return offset; +} + /* this function dissects a constrained sequence of */ guint32 @@ -1104,7 +1215,7 @@ DEBUG_ENTRY("dissect_per_octet_string"); } /* 16.6 if length is fixed and less than or equal to two bytes*/ - if((min_len==max_len)&&(min_len<=2)){ + if((min_len==max_len)&&(max_len<=2)){ static char bytes[4]; guint32 i, old_offset=offset; gboolean bit; |