diff options
author | Denis Kenzior <denkenz@gmail.com> | 2010-02-23 00:57:35 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-02-23 12:03:03 -0600 |
commit | 5a86a7408aa248d9f3eb5bd5dc790f18ff03e0ec (patch) | |
tree | 527eb359110574b58f3fe6594e1d5461f2e5cc60 /src/simutil.c | |
parent | 9f6847b6b256e9f20b0216360b9ca24f5e78369c (diff) | |
download | ofono-5a86a7408aa248d9f3eb5bd5dc790f18ff03e0ec.tar.bz2 |
Rewrite ber_tlv_find_tag to use ber_tlv iterator
Diffstat (limited to 'src/simutil.c')
-rw-r--r-- | src/simutil.c | 39 |
1 files changed, 9 insertions, 30 deletions
diff --git a/src/simutil.c b/src/simutil.c index 78846b7f..9b457124 100644 --- a/src/simutil.c +++ b/src/simutil.c @@ -264,43 +264,22 @@ void ber_tlv_iter_recurse(struct ber_tlv_iter *iter, recurse->pos = 0; } -/* Parse ASN.1 Basic Encoding Rules TLVs per ISO/IEC 7816 */ static const guint8 *ber_tlv_find_by_tag(const guint8 *pdu, guint8 in_tag, int in_len, int *out_len) { - guint8 tag; - int len; - const guint8 *end = pdu + in_len; - - do { - while (pdu < end && (*pdu == 0x00 || *pdu == 0xff)) - pdu++; - if (pdu == end) - break; - - tag = *pdu++; - if (!(0x1f & ~tag)) - while (pdu < end && (*pdu++ & 0x80)) - ; - if (pdu == end) - break; + struct ber_tlv_iter iter; - for (len = 0; pdu + 1 < end && (*pdu & 0x80); - len = (len | (*pdu++ & 0x7f)) << 7) - ; + ber_tlv_iter_init(&iter, pdu, in_len); - if (*pdu & 0x80) - break; - len |= *pdu++; + while (ber_tlv_iter_next(&iter)) { + if (ber_tlv_iter_get_short_tag(&iter) != in_tag) + continue; - if (tag == in_tag && pdu + len <= end) { - if (out_len) - *out_len = len; - return pdu; - } + if (out_len) + *out_len = ber_tlv_iter_get_length(&iter); - pdu += len; - } while (pdu < end); + return ber_tlv_iter_get_data(&iter); + } return NULL; } |