aboutsummaryrefslogtreecommitdiffstats
path: root/src/gsm/gprs_cipher_core.c
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2016-04-21 14:46:30 +0200
committerHarald Welte <laforge@gnumonks.org>2016-04-22 15:09:27 +0200
commitbf990bb8fd5aa27c57416831311bc4b2a9769bef (patch)
tree5bc2a1d0abb7645b2785a6ec61a4f798b274677e /src/gsm/gprs_cipher_core.c
parent402b9b055538737838ce112a99a75401aa4f14c6 (diff)
Update internal GPRS cipher API
Update internal API (for GPRS cipher implementors): make it compliant with ETSI TS 155.22. External API left untouched.
Diffstat (limited to 'src/gsm/gprs_cipher_core.c')
-rw-r--r--src/gsm/gprs_cipher_core.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/gsm/gprs_cipher_core.c b/src/gsm/gprs_cipher_core.c
index b9a22a10..e4fac04b 100644
--- a/src/gsm/gprs_cipher_core.c
+++ b/src/gsm/gprs_cipher_core.c
@@ -53,12 +53,14 @@ int gprs_cipher_register(struct gprs_cipher_impl *ciph)
int gprs_cipher_load(const char *path)
{
/* load all plugins available from path */
- return osmo_plugin_load_all(path);
+ if (path)
+ return osmo_plugin_load_all(path);
+ return 0;
}
/* function to be called by core code */
int gprs_cipher_run(uint8_t *out, uint16_t len, enum gprs_ciph_algo algo,
- uint64_t kc, uint32_t iv, enum gprs_cipher_direction dir)
+ uint8_t *kc, uint32_t iv, enum gprs_cipher_direction dir)
{
if (algo >= ARRAY_SIZE(selected_ciphers))
return -ERANGE;
@@ -73,6 +75,23 @@ int gprs_cipher_run(uint8_t *out, uint16_t len, enum gprs_ciph_algo algo,
return selected_ciphers[algo]->run(out, len, kc, iv, dir);
}
+/*! \brief Obtain key lenght for given GPRS cipher
+ * \param[in] algo Enum representive GPRS cipher
+ * \returns unsigned integer key length for supported algorithms,
+ * for GEA0 and unknown ciphers will return 0
+ */
+unsigned gprs_cipher_key_length(enum gprs_ciph_algo algo)
+{
+ switch (algo) {
+ case GPRS_ALGO_GEA0: return 0;
+ case GPRS_ALGO_GEA1:
+ case GPRS_ALGO_GEA2:
+ case GPRS_ALGO_GEA3: return 8;
+ case GPRS_ALGO_GEA4: return 16;
+ default: return 0;
+ }
+}
+
int gprs_cipher_supported(enum gprs_ciph_algo algo)
{
if (algo >= ARRAY_SIZE(selected_ciphers))