summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/gsm/protocol/gsm_04_08.h3
-rw-r--r--src/gsm/gsm48.c25
-rw-r--r--src/gsm/libosmogsm.map1
3 files changed, 28 insertions, 1 deletions
diff --git a/include/osmocom/gsm/protocol/gsm_04_08.h b/include/osmocom/gsm/protocol/gsm_04_08.h
index 074c2589..e442c7f9 100644
--- a/include/osmocom/gsm/protocol/gsm_04_08.h
+++ b/include/osmocom/gsm/protocol/gsm_04_08.h
@@ -6,7 +6,6 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/endian.h>
-
/* GSM TS 04.08 definitions */
struct gsm_lchan;
@@ -925,6 +924,8 @@ struct gsm48_rr_status {
#define GSM48_PDISC_MASK 0x0f
#define GSM48_PDISC_USSD 0x11
+bool gsm48_hdr_gmm_cipherable(const struct gsm48_hdr *hdr);
+
static inline uint8_t gsm48_hdr_pdisc(const struct gsm48_hdr *hdr)
{
/*
diff --git a/src/gsm/gsm48.c b/src/gsm/gsm48.c
index 8a46f769..b4740cf0 100644
--- a/src/gsm/gsm48.c
+++ b/src/gsm/gsm48.c
@@ -35,6 +35,7 @@
#include <osmocom/gsm/gsm_utils.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/protocol/gsm_08_58.h>
+#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
const struct tlv_definition gsm48_att_tlvdef = {
.def = {
@@ -302,6 +303,30 @@ static void to_bcd(uint8_t *bcd, uint16_t val)
val = val / 10;
}
+/*! \brief Checks is particular message is cipherable in A/Gb mode according to
+ * 3GPP TS 24.008 ยง 4.7.1.2
+ * \param[in] hdr Message header
+ * \return true if message can be encrypted, false otherwise
+ */
+bool gsm48_hdr_gmm_cipherable(const struct gsm48_hdr *hdr)
+{
+ switch(hdr->msg_type) {
+ case GSM48_MT_GMM_ATTACH_REQ:
+ case GSM48_MT_GMM_ATTACH_REJ:
+ case GSM48_MT_GMM_AUTH_CIPH_REQ:
+ case GSM48_MT_GMM_AUTH_CIPH_RESP:
+ case GSM48_MT_GMM_AUTH_CIPH_REJ:
+ case GSM48_MT_GMM_AUTH_CIPH_FAIL:
+ case GSM48_MT_GMM_ID_REQ:
+ case GSM48_MT_GMM_ID_RESP:
+ case GSM48_MT_GMM_RA_UPD_REQ:
+ case GSM48_MT_GMM_RA_UPD_REJ:
+ return false;
+ default:
+ return true;
+ }
+}
+
/* Convert given mcc and mnc to BCD and write to *bcd_dst, which must be an
* allocated buffer of (at least) 3 bytes length. */
void gsm48_mcc_mnc_to_bcd(uint8_t *bcd_dst, uint16_t mcc, uint16_t mnc)
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 19ebb5b3..c68cf2a5 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -124,6 +124,7 @@ gsm48_att_tlvdef;
gsm48_cc_msg_name;
gsm48_cc_state_name;
gsm48_construct_ra;
+gsm48_hdr_gmm_cipherable;
gsm48_decode_bcd_number;
gsm48_decode_bearer_cap;
gsm48_decode_called;