diff options
author | Roman Khassraf <roman@khassraf.at> | 2015-07-17 18:32:22 +0200 |
---|---|---|
committer | Roman Khassraf <roman@khassraf.at> | 2015-07-17 18:32:22 +0200 |
commit | 4dec540b6e997289173b8486e51ef249c9d0fbfc (patch) | |
tree | 8ff555c96561166939b5ef5a4a74601013d2d3df /lib/decryption | |
parent | c51f12bb4eeb43416da93ea64ed33537c79af671 (diff) |
Added support for A5/2, A5/3, A5/4. Issue #85
Diffstat (limited to 'lib/decryption')
-rw-r--r-- | lib/decryption/decryption_impl.cc | 57 | ||||
-rw-r--r-- | lib/decryption/decryption_impl.h | 9 |
2 files changed, 47 insertions, 19 deletions
diff --git a/lib/decryption/decryption_impl.cc b/lib/decryption/decryption_impl.cc index 836d9d2..9e6112b 100644 --- a/lib/decryption/decryption_impl.cc +++ b/lib/decryption/decryption_impl.cc @@ -25,6 +25,7 @@ #include <gnuradio/io_signature.h> #include <grgsm/gsmtap.h> #include <grgsm/endian.h> +#include <numeric> #include "decryption_impl.h" extern "C" { @@ -37,21 +38,24 @@ namespace gr { namespace gsm { decryption::sptr - decryption::make(const std::vector<uint8_t> & k_c) + decryption::make(const std::vector<uint8_t> & k_c, unsigned int a5_version) { return gnuradio::get_initial_sptr - (new decryption_impl(k_c)); + (new decryption_impl(k_c, a5_version)); } /* * The private constructor */ - decryption_impl::decryption_impl(const std::vector<uint8_t> & k_c) + decryption_impl::decryption_impl(const std::vector<uint8_t> & k_c, unsigned int a5_version) : gr::block("decryption", gr::io_signature::make(0, 0, 0), - gr::io_signature::make(0, 0, 0)) + gr::io_signature::make(0, 0, 0)), + d_k_c_valid(false) { set_k_c(k_c); + set_a5_version(a5_version); + validate_k_c(); // std::cout << "Be careful with decryption block - it wasn't tested yet!" << std::endl; message_port_register_in(pmt::mp("bursts")); @@ -68,29 +72,50 @@ namespace gr { void decryption_impl::set_k_c(const std::vector<uint8_t> & k_c) { - if (k_c.size() == 8) + d_k_c = k_c; + } + + void decryption_impl::set_a5_version(unsigned int a5_version) + { + d_a5_version = 1; + if (a5_version >= 1 && a5_version <= 4) { - for (int i=0; i<8; i++) - { - d_k_c[i] = k_c[i]; - } + d_a5_version = a5_version; + } + } + + void decryption_impl::validate_k_c() + { + if (d_k_c.size() == 0) + { + d_k_c_valid = false; + return; + } + else if ((d_a5_version < 4 && d_k_c.size() != 8) || (d_a5_version == 4 && d_k_c.size() != 16)) + { + d_k_c_valid = false; + return; } else { - for (int i=0; i<8; i++) + for (int i=0; i<d_k_c.size(); i++) { - d_k_c[i] = 0; + if (d_k_c[i] != 0) + { + d_k_c_valid = true; + return; + } } } } void decryption_impl::decrypt(pmt::pmt_t msg) { - if(d_k_c[0] == 0 && d_k_c[1] == 0 && d_k_c[2] == 0 && d_k_c[3] == 0 & - d_k_c[4] == 0 && d_k_c[5] == 0 && d_k_c[6] == 0 && d_k_c[7] == 0) + if (!d_k_c_valid) { message_port_pub(pmt::mp("bursts"), msg); - } else + } + else { uint8_t decrypted_data[BURST_SIZE]; uint8_t keystream[114]; @@ -104,10 +129,10 @@ namespace gr { if(uplink_burst){ //process uplink burst - osmo_a5(1, d_k_c, frame_number, NULL, keystream); + osmo_a5(d_a5_version, &d_k_c[0], frame_number, NULL, keystream); } else { //process downlink burst - osmo_a5(1, d_k_c, frame_number, keystream, NULL); + osmo_a5(d_a5_version, &d_k_c[0], frame_number, keystream, NULL); } /* guard bits */ for (int i = 0; i < 3; i++) { diff --git a/lib/decryption/decryption_impl.h b/lib/decryption/decryption_impl.h index fff028b..68fbb9c 100644 --- a/lib/decryption/decryption_impl.h +++ b/lib/decryption/decryption_impl.h @@ -30,13 +30,16 @@ namespace gr { class decryption_impl : public decryption { private: -// std::vector<uint8_t> d_k_c; - uint8_t d_k_c[8]; + std::vector<uint8_t> d_k_c; + bool d_k_c_valid; + uint8_t d_a5_version; void decrypt(pmt::pmt_t msg); + void validate_k_c(); public: - decryption_impl(const std::vector<uint8_t> & k_c); + decryption_impl(const std::vector<uint8_t> & k_c, unsigned int a5_version); ~decryption_impl(); virtual void set_k_c(const std::vector<uint8_t> & k_c); + virtual void set_a5_version(unsigned int a5_version); }; } // namespace gsm } // namespace gr |