]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/emv/tlv.c
fix #532. looks at length of parameters.
[proxmark3-svn] / client / emv / tlv.c
index d78f049e07bb7577cf7265fc0d12707420e01926..1be917776f20a7bc8c951ae60dd554e692b3e09e 100644 (file)
@@ -299,6 +299,40 @@ void tlvdb_free(struct tlvdb *tlvdb)
        }
 }
 
+struct tlvdb *tlvdb_find_next(struct tlvdb *tlvdb, tlv_tag_t tag) {
+       if (!tlvdb)
+               return NULL;
+       
+       return tlvdb_find(tlvdb->next, tag);
+}
+
+struct tlvdb *tlvdb_find(struct tlvdb *tlvdb, tlv_tag_t tag) {
+       if (!tlvdb)
+               return NULL;
+       
+       for (; tlvdb; tlvdb = tlvdb->next) {
+               if (tlvdb->tag.tag == tag)
+                       return tlvdb;
+       }
+
+       return NULL;
+}
+
+struct tlvdb *tlvdb_find_path(struct tlvdb *tlvdb, tlv_tag_t tag[]) {
+       int i = 0;
+       struct tlvdb *tnext = tlvdb;
+       
+       while (tnext && tag[i]) {
+               tnext = tlvdb_find(tnext, tag[i]);
+               i++;
+               if (tag[i] && tnext) {
+                       tnext = tnext->children;
+               }
+       }
+       
+       return tnext;
+}
+
 void tlvdb_add(struct tlvdb *tlvdb, struct tlvdb *other)
 {
        while (tlvdb->next) {
@@ -308,7 +342,7 @@ void tlvdb_add(struct tlvdb *tlvdb, struct tlvdb *other)
        tlvdb->next = other;
 }
 
-void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data)
+void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data, int level)
 {
        struct tlvdb *next = NULL;
 
@@ -317,8 +351,8 @@ void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data)
 
        for (; tlvdb; tlvdb = next) {
                next = tlvdb->next;
-               cb(data, &tlvdb->tag);
-               tlvdb_visit(tlvdb->children, cb, data);
+               cb(data, &tlvdb->tag, level, (tlvdb->children == NULL));
+               tlvdb_visit(tlvdb->children, cb, data, level + 1);
        }
 }
 
@@ -355,6 +389,11 @@ const struct tlv *tlvdb_get(const struct tlvdb *tlvdb, tlv_tag_t tag, const stru
        return NULL;
 }
 
+const struct tlv *tlvdb_get_inchild(const struct tlvdb *tlvdb, tlv_tag_t tag, const struct tlv *prev) {
+       tlvdb = tlvdb->children;
+       return tlvdb_get(tlvdb, tag, prev);
+}
+
 unsigned char *tlv_encode(const struct tlv *tlv, size_t *len)
 {
        size_t size = tlv->len;
Impressum, Datenschutz