diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2017-03-28 18:36:52 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-04-08 07:44:46 +0000 |
commit | 14e76b9958b6cb93944a991ffaa5125f601f3d20 (patch) | |
tree | 2786a32ba58f56531d1ffb1e1b397bf08f753cd2 /src/gsm | |
parent | e0c65301d5786be04cf4731f1cdeed05c4442482 (diff) |
gsm0808: Add utils for Encryption Information
The planned support for true A over IP requires the encoding of
the an Encryption Information element (see also BSS_MAP_MSG_CIPHER_MODE_CMD).
This commt adds encoding/decoding functionality and tests for
the element mentioned above, however, it is not yet actively used.
Change-Id: I8262050a9d9fd3f17462cfbb046c6e034dccc6fb
Diffstat (limited to 'src/gsm')
-rw-r--r-- | src/gsm/gsm0808_utils.c | 71 | ||||
-rw-r--r-- | src/gsm/libosmogsm.map | 2 |
2 files changed, 73 insertions, 0 deletions
diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c index ef0f9431..19156050 100644 --- a/src/gsm/gsm0808_utils.c +++ b/src/gsm/gsm0808_utils.c @@ -33,6 +33,7 @@ #define CHANNEL_TYPE_ELEMENT_MAXLEN 11 #define CHANNEL_TYPE_ELEMENT_MINLEN 3 +#define ENCRYPT_INFO_ELEMENT_MINLEN 1 /* Encode AoIP transport address element */ uint8_t gsm0808_enc_aoip_trasp_addr(struct msgb *msg, @@ -379,3 +380,73 @@ int gsm0808_dec_channel_type(struct gsm0808_channel_type *ct, return (int)(elem - old_elem); } + +/* Encode Encryption Information element */ +uint8_t gsm0808_enc_encrypt_info(struct msgb *msg, + const struct gsm0808_encrypt_info *ei) +{ + unsigned int i; + uint8_t perm_algo = 0; + uint8_t *ptr; + uint8_t *old_tail; + uint8_t *tlv_len; + + OSMO_ASSERT(msg); + OSMO_ASSERT(ei); + OSMO_ASSERT(ei->key_len <= ARRAY_SIZE(ei->key)); + OSMO_ASSERT(ei->perm_algo_len <= ENCRY_INFO_PERM_ALGO_MAXLEN); + + msgb_put_u8(msg, GSM0808_IE_ENCRYPTION_INFORMATION); + tlv_len = msgb_put(msg, 1); + old_tail = msg->tail; + + for (i = 0; i < ei->perm_algo_len; i++) { + /* Note: gsm_08_08.h defines the permitted algorithms + * as an enum which ranges from 0x01 to 0x08 */ + OSMO_ASSERT(ei->perm_algo[i] != 0); + OSMO_ASSERT(ei->perm_algo[i] <= ENCRY_INFO_PERM_ALGO_MAXLEN); + perm_algo |= (1 << (ei->perm_algo[i] - 1)); + } + + msgb_put_u8(msg, perm_algo); + ptr = msgb_put(msg, ei->key_len); + memcpy(ptr, ei->key, ei->key_len); + + *tlv_len = (uint8_t) (msg->tail - old_tail); + return *tlv_len + 2; +} + +/* Decode Encryption Information element */ +int gsm0808_dec_encrypt_info(struct gsm0808_encrypt_info *ei, + const uint8_t *elem, uint8_t len) +{ + uint8_t perm_algo; + unsigned int i; + unsigned int perm_algo_len = 0; + const uint8_t *old_elem = elem; + + OSMO_ASSERT(ei); + if (!elem) + return -EINVAL; + if (len <= 0) + return -EINVAL; + + memset(ei, 0, sizeof(*ei)); + + perm_algo = *elem; + elem++; + + for (i = 0; i < ENCRY_INFO_PERM_ALGO_MAXLEN; i++) { + if (perm_algo & (1 << i)) { + ei->perm_algo[perm_algo_len] = i + 1; + perm_algo_len++; + } + } + ei->perm_algo_len = perm_algo_len; + + ei->key_len = len - 1; + memcpy(ei->key, elem, ei->key_len); + elem+=ei->key_len; + + return (int)(elem - old_elem); +} diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index 2ba0c427..323ad5ad 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -148,6 +148,8 @@ gsm0808_enc_speech_codec_list; gsm0808_dec_speech_codec_list; gsm0808_enc_channel_type; gsm0808_dec_channel_type; +gsm0808_enc_encrypt_info; +gsm0808_dec_encrypt_info; gsm0858_rsl_ul_meas_enc; |