summaryrefslogtreecommitdiffstats
path: root/src/simutil.h
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-02-23 00:37:55 -0600
committerDenis Kenzior <denkenz@gmail.com>2010-02-23 12:03:00 -0600
commit0d163e6295d1cd6dd5e1162bed404582824cbfe6 (patch)
tree52f87cb01737a916dd466699f41355dfeec72388 /src/simutil.h
parent6e03aa7c0b2cd8f8e945eff611a1c8d8406114f4 (diff)
downloadofono-0d163e6295d1cd6dd5e1162bed404582824cbfe6.tar.bz2
Add BER-TLV iterator utilities
Diffstat (limited to 'src/simutil.h')
-rw-r--r--src/simutil.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/simutil.h b/src/simutil.h
index 70570bcd..e0a7c646 100644
--- a/src/simutil.h
+++ b/src/simutil.h
@@ -55,6 +55,18 @@ enum sim_file_access {
#define SIM_EFSPN_DC_HOME_PLMN_BIT 0x1
#define SIM_EFSPN_DC_ROAMING_SPN_BIT 0x2
+enum ber_tlv_data_type {
+ BER_TLV_DATA_TYPE_UNIVERSAL = 0,
+ BER_TLV_DATA_TYPE_APPLICATION = 1,
+ BER_TLV_DATA_TYPE_CONTEXT_SPECIFIC = 2,
+ BER_TLV_DATA_TYPE_PRIVATE = 3,
+};
+
+enum ber_tlv_data_encoding_type {
+ BER_TLV_DATA_ENCODING_TYPE_PRIMITIVE = 0,
+ BER_TLV_DATA_ENCODING_TYPE_CONSTRUCTED = 1,
+};
+
struct sim_eons_operator_info {
char *longname;
gboolean long_ci;
@@ -72,8 +84,47 @@ struct sim_ef_info {
enum sim_file_access perm_update;
};
+struct ber_tlv_iter {
+ unsigned int max;
+ unsigned int pos;
+ const unsigned char *pdu;
+ unsigned int tag;
+ enum ber_tlv_data_type class;
+ enum ber_tlv_data_encoding_type encoding;
+ unsigned int len;
+ const unsigned char *data;
+};
+
#define ROOTMF 0x3F00
+void ber_tlv_iter_init(struct ber_tlv_iter *iter, const unsigned char *pdu,
+ unsigned int len);
+/*
+ * Returns the tag value of the TLV. Note that the tag value can be either
+ * short (0-30) or long
+ */
+unsigned int ber_tlv_iter_get_tag(struct ber_tlv_iter *iter);
+
+enum ber_tlv_data_type ber_tlv_iter_get_class(struct ber_tlv_iter *iter);
+enum ber_tlv_data_encoding_type
+ ber_tlv_iter_get_encoding(struct ber_tlv_iter *iter);
+
+/*
+ * This will return the short tag along with class and encoding information.
+ * This is more convenient to use for TLV contents of SIM Elementary Files
+ * and SIM toolkit since these elements only use short tags. In case of an
+ * error (e.g. not a short tag) a zero is returned. According to ISO 7816,
+ * a tag value of '00' is invalid.
+ */
+unsigned char ber_tlv_iter_get_short_tag(struct ber_tlv_iter *iter);
+unsigned int ber_tlv_iter_get_length(struct ber_tlv_iter *iter);
+
+const unsigned char *ber_tlv_iter_get_data(struct ber_tlv_iter *iter);
+
+gboolean ber_tlv_iter_next(struct ber_tlv_iter *iter);
+void ber_tlv_iter_recurse(struct ber_tlv_iter *iter,
+ struct ber_tlv_iter *recurse);
+
struct sim_eons *sim_eons_new(int pnn_records);
void sim_eons_add_pnn_record(struct sim_eons *eons, int record,
const guint8 *tlv, int length);