diff options
-rw-r--r-- | grc/decryption/gsm_decryption.xml | 16 | ||||
-rw-r--r-- | include/grgsm/decryption/decryption.h | 11 | ||||
-rw-r--r-- | lib/decryption/decryption_impl.cc | 57 | ||||
-rw-r--r-- | lib/decryption/decryption_impl.h | 9 |
4 files changed, 66 insertions, 27 deletions
diff --git a/grc/decryption/gsm_decryption.xml b/grc/decryption/gsm_decryption.xml index ae91408..4f3de22 100644 --- a/grc/decryption/gsm_decryption.xml +++ b/grc/decryption/gsm_decryption.xml @@ -3,15 +3,25 @@ <name>Decryption</name> <key>gsm_decryption</key> <import>import grgsm</import> - <make>grgsm.decryption($k_c)</make> + <make>grgsm.decryption($k_c, $a5_version)</make> <param> <name>Kc session key</name> <key>k_c</key> - <value>[0,0,0,0,0,0,0,0]</value> + <value>[0,0,0,0,0,0,0,0]</value> <type>int_vector</type> </param> + <param> + <name>A5 version</name> + <key>a5_version</key> + <value>1</value> + <type>int</type> + </param> + + <check>$a5_version > 0</check> + <check>$a5_version < 5</check> + <sink> <name>bursts</name> <type>message</type> @@ -20,5 +30,5 @@ <name>bursts</name> <type>message</type> </source> - + </block> diff --git a/include/grgsm/decryption/decryption.h b/include/grgsm/decryption/decryption.h index be0f7cd..51328b1 100644 --- a/include/grgsm/decryption/decryption.h +++ b/include/grgsm/decryption/decryption.h @@ -1,14 +1,14 @@ /* -*- c++ -*- */ -/* +/* * @file * @author Piotr Krysik <ptrkrysik@gmail.com> * @section LICENSE - * + * * Gr-gsm is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * Gr-gsm is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,7 +18,7 @@ * along with gr-gsm; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. - * + * */ @@ -50,8 +50,9 @@ namespace gr { * class. gsm::decryption::make is the public interface for * creating new instances. */ - static sptr make(const std::vector<uint8_t> & k_c); + static sptr make(const std::vector<uint8_t> & k_c, unsigned int a5_version); virtual void set_k_c(const std::vector<uint8_t> & k_c) = 0; + virtual void set_a5_version(unsigned int a5_version) = 0; }; } // namespace gsm 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 |