summaryrefslogtreecommitdiffstats
path: root/src/simutil.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-02-23 00:57:35 -0600
committerDenis Kenzior <denkenz@gmail.com>2010-02-23 12:03:03 -0600
commit5a86a7408aa248d9f3eb5bd5dc790f18ff03e0ec (patch)
tree527eb359110574b58f3fe6594e1d5461f2e5cc60 /src/simutil.c
parent9f6847b6b256e9f20b0216360b9ca24f5e78369c (diff)
downloadofono-5a86a7408aa248d9f3eb5bd5dc790f18ff03e0ec.tar.bz2
Rewrite ber_tlv_find_tag to use ber_tlv iterator
Diffstat (limited to 'src/simutil.c')
-rw-r--r--src/simutil.c39
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;
}