move utils.h functions to libosmocore
This needs the corresponding commit in libosmocore which imports the related functions
This commit is contained in:
parent
eff215a8bb
commit
50f1c0af56
|
@ -14,7 +14,7 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \
|
|||
osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
|
||||
bss.h gsm_data_shared.h ipaccess.h mncc_int.h \
|
||||
arfcn_range_encode.h nat_rewrite_trie.h bsc_nat_callstats.h \
|
||||
osmux.h mgcp_transcode.h gprs_utils.h utils.h \
|
||||
osmux.h mgcp_transcode.h gprs_utils.h \
|
||||
gprs_gb_parse.h smpp.h meas_feed.h osmo_gsup_messages.h \
|
||||
gprs_gsup_client.h bsc_msg_filter.h \
|
||||
oap.h oap_messages.h \
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
/* OpenBSC kitchen sink */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Compare count bytes of exp to rel. Return 0 if they are identical, 1
|
||||
* otherwise. Do not return a mismatch on the first mismatching byte,
|
||||
* but always compare all bytes, regardless. The idea is that the amount of
|
||||
* matching bytes cannot be inferred from the time the comparison took.*/
|
||||
int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count);
|
||||
|
||||
/* This is like osmo_load64be_ext, except that if data_len is less than
|
||||
* sizeof(uint64_t), the data is interpreted as the least significant bytes
|
||||
* (osmo_load64be_ext loads them as the most significant bytes into the
|
||||
* returned uint64_t). In this way, any integer size up to 64 bits can be
|
||||
* decoded conveniently by using sizeof(), without the need to call specific
|
||||
* numbered functions (osmo_load16, 32, ...). */
|
||||
uint64_t decode_big_endian(const uint8_t *data, size_t data_len);
|
||||
|
||||
/* This is like osmo_store64be_ext, except that this returns a static buffer of
|
||||
* the result (for convenience, but not threadsafe). If data_len is less than
|
||||
* sizeof(uint64_t), only the least significant bytes of value are encoded. */
|
||||
uint8_t *encode_big_endian(uint64_t value, size_t data_len);
|
||||
|
|
@ -20,10 +20,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/crypt/auth.h>
|
||||
|
||||
#include <openbsc/oap.h>
|
||||
#include <openbsc/utils.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/oap_messages.h>
|
||||
|
||||
|
@ -103,7 +103,7 @@ static int oap_evaluate_challenge(const struct oap_state *state,
|
|||
return -3;
|
||||
}
|
||||
|
||||
if (constant_time_cmp(vec.autn, rx_autn, sizeof(vec.autn)) != 0) {
|
||||
if (osmo_constant_time_cmp(vec.autn, rx_autn, sizeof(vec.autn)) != 0) {
|
||||
LOGP(DGPRS, LOGL_ERROR, "OAP: AUTN mismatch!\n");
|
||||
LOGP(DGPRS, LOGL_INFO, "OAP: AUTN from server: %s\n",
|
||||
osmo_hexdump_nospc(rx_autn, sizeof(vec.autn)));
|
||||
|
|
|
@ -20,11 +20,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <openbsc/oap_messages.h>
|
||||
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/gprs_utils.h>
|
||||
#include <openbsc/utils.h>
|
||||
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
#include <osmocom/core/msgb.h>
|
||||
|
@ -51,7 +51,7 @@ int oap_decode(const uint8_t *const_data, size_t data_len,
|
|||
rc = osmo_shift_v_fixed(&data, &data_len, 1, &value);
|
||||
if (rc < 0)
|
||||
return -GMM_CAUSE_INV_MAND_INFO;
|
||||
oap_msg->message_type = decode_big_endian(value, 1);
|
||||
oap_msg->message_type = osmo_decode_big_endian(value, 1);
|
||||
|
||||
/* specific parts */
|
||||
while (data_len > 0) {
|
||||
|
@ -72,7 +72,7 @@ int oap_decode(const uint8_t *const_data, size_t data_len,
|
|||
return -GMM_CAUSE_PROTO_ERR_UNSPEC;
|
||||
}
|
||||
|
||||
oap_msg->client_id = decode_big_endian(value, value_len);
|
||||
oap_msg->client_id = osmo_decode_big_endian(value, value_len);
|
||||
|
||||
if (oap_msg->client_id == 0) {
|
||||
LOGP(DGPRS, LOGL_NOTICE,
|
||||
|
@ -159,7 +159,8 @@ void oap_encode(struct msgb *msg, const struct oap_message *oap_msg)
|
|||
|
||||
if (oap_msg->client_id > 0)
|
||||
msgb_tlv_put(msg, OAP_CLIENT_ID_IE, sizeof(oap_msg->client_id),
|
||||
encode_big_endian(oap_msg->client_id, sizeof(oap_msg->client_id)));
|
||||
osmo_encode_big_endian(oap_msg->client_id,
|
||||
sizeof(oap_msg->client_id)));
|
||||
|
||||
if (oap_msg->rand_present)
|
||||
msgb_tlv_put(msg, OAP_RAND_IE, sizeof(oap_msg->rand), oap_msg->rand);
|
||||
|
|
|
@ -6,4 +6,4 @@ noinst_LIBRARIES = libcommon.a
|
|||
|
||||
libcommon_a_SOURCES = bsc_version.c common_vty.c debug.c gsm_data.c \
|
||||
gsm_data_shared.c socket.c talloc_ctx.c \
|
||||
gsm_subscriber_base.c utils.c
|
||||
gsm_subscriber_base.c
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
/* OpenBSC kitchen sink */
|
||||
|
||||
/* (C) 2015 by sysmocom s.m.f.c GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <openbsc/utils.h>
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/core/bit64gen.h>
|
||||
|
||||
/* Wishful thinking to generate a constant time compare */
|
||||
int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count)
|
||||
{
|
||||
int x = 0, i;
|
||||
|
||||
for (i = 0; i < count; ++i)
|
||||
x |= exp[i] ^ rel[i];
|
||||
|
||||
/* if x is zero, all data was identical */
|
||||
return x? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
uint64_t decode_big_endian(const uint8_t *data, size_t data_len)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
|
||||
while (data_len > 0) {
|
||||
value = (value << 8) + *data;
|
||||
data += 1;
|
||||
data_len -= 1;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint8_t *encode_big_endian(uint64_t value, size_t data_len)
|
||||
{
|
||||
static uint8_t buf[sizeof(uint64_t)];
|
||||
OSMO_ASSERT(data_len <= ARRAY_SIZE(buf));
|
||||
osmo_store64be_ext(value, buf, data_len);
|
||||
return buf;
|
||||
}
|
||||
|
|
@ -48,7 +48,6 @@
|
|||
#include <openbsc/abis_nm.h>
|
||||
#include <openbsc/socket.h>
|
||||
#include <openbsc/vty.h>
|
||||
#include <openbsc/utils.h>
|
||||
|
||||
#include <osmocom/ctrl/control_cmd.h>
|
||||
#include <osmocom/ctrl/control_if.h>
|
||||
|
@ -1023,7 +1022,7 @@ static int verify_key(struct bsc_connection *conn, struct bsc_config *conf, cons
|
|||
return 0;
|
||||
}
|
||||
|
||||
return constant_time_cmp(vec.res, key, 8) == 0;
|
||||
return osmo_constant_time_cmp(vec.res, key, 8) == 0;
|
||||
}
|
||||
|
||||
static void ipaccess_auth_bsc(struct tlv_parsed *tvp, struct bsc_connection *bsc)
|
||||
|
|
|
@ -6,7 +6,6 @@ EXTRA_DIST = gprs_test.ok
|
|||
noinst_PROGRAMS = gprs_test
|
||||
|
||||
gprs_test_SOURCES = gprs_test.c $(top_srcdir)/src/gprs/gprs_utils.c \
|
||||
$(top_srcdir)/src/gprs/gprs_gsup_messages.c \
|
||||
$(top_srcdir)/src/libcommon/utils.c
|
||||
$(top_srcdir)/src/gprs/gprs_gsup_messages.c
|
||||
|
||||
gprs_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
|
||||
|
|
|
@ -146,247 +146,7 @@ static void test_gsm_03_03_apn(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* TODO: Move tlv testing to libosmocore */
|
||||
static void check_tlv_parse(uint8_t **data, size_t *data_len,
|
||||
uint8_t exp_tag, size_t exp_len, const uint8_t *exp_val)
|
||||
{
|
||||
uint8_t *value;
|
||||
size_t value_len;
|
||||
uint8_t tag;
|
||||
int rc;
|
||||
uint8_t *saved_data = *data;
|
||||
size_t saved_data_len = *data_len;
|
||||
|
||||
rc = gprs_match_tlv(data, data_len, exp_tag ^ 1, NULL, NULL);
|
||||
OSMO_ASSERT(rc == 0);
|
||||
|
||||
rc = gprs_match_tlv(data, data_len, exp_tag, &value, &value_len);
|
||||
OSMO_ASSERT(rc == (int)value_len + 2);
|
||||
OSMO_ASSERT(value_len == exp_len);
|
||||
OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
|
||||
|
||||
/* restore data/data_len */
|
||||
*data = saved_data;
|
||||
*data_len = saved_data_len;
|
||||
|
||||
rc = gprs_shift_tlv(data, data_len, &tag, &value, &value_len);
|
||||
OSMO_ASSERT(rc == (int)value_len + 2);
|
||||
OSMO_ASSERT(tag == exp_tag);
|
||||
OSMO_ASSERT(value_len == exp_len);
|
||||
OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
|
||||
}
|
||||
|
||||
static void check_tv_fixed_match(uint8_t **data, size_t *data_len,
|
||||
uint8_t tag, size_t len, const uint8_t *exp_val)
|
||||
{
|
||||
uint8_t *value;
|
||||
int rc;
|
||||
|
||||
rc = gprs_match_tv_fixed(data, data_len, tag ^ 1, len, NULL);
|
||||
OSMO_ASSERT(rc == 0);
|
||||
|
||||
rc = gprs_match_tv_fixed(data, data_len, tag, len, &value);
|
||||
OSMO_ASSERT(rc == (int)len + 1);
|
||||
OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
|
||||
}
|
||||
|
||||
static void check_v_fixed_shift(uint8_t **data, size_t *data_len,
|
||||
size_t len, const uint8_t *exp_val)
|
||||
{
|
||||
uint8_t *value;
|
||||
int rc;
|
||||
|
||||
rc = gprs_shift_v_fixed(data, data_len, len, &value);
|
||||
OSMO_ASSERT(rc == (int)len);
|
||||
OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
|
||||
}
|
||||
|
||||
static void check_lv_shift(uint8_t **data, size_t *data_len,
|
||||
size_t exp_len, const uint8_t *exp_val)
|
||||
{
|
||||
uint8_t *value;
|
||||
size_t value_len;
|
||||
int rc;
|
||||
|
||||
rc = gprs_shift_lv(data, data_len, &value, &value_len);
|
||||
OSMO_ASSERT(rc == (int)value_len + 1);
|
||||
OSMO_ASSERT(value_len == exp_len);
|
||||
OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
|
||||
}
|
||||
|
||||
static void check_tlv_match_data_len(size_t data_len, uint8_t tag, size_t len,
|
||||
const uint8_t *test_data)
|
||||
{
|
||||
uint8_t buf[300] = {0};
|
||||
|
||||
uint8_t *unchanged_ptr = buf - 1;
|
||||
size_t unchanged_len = 0xdead;
|
||||
size_t tmp_data_len = data_len;
|
||||
uint8_t *value = unchanged_ptr;
|
||||
size_t value_len = unchanged_len;
|
||||
uint8_t *data = buf;
|
||||
|
||||
OSMO_ASSERT(data_len <= sizeof(buf));
|
||||
|
||||
tlv_put(data, tag, len, test_data);
|
||||
if (data_len < len + 2) {
|
||||
OSMO_ASSERT(-1 == gprs_match_tlv(&data, &tmp_data_len,
|
||||
tag, &value, &value_len));
|
||||
OSMO_ASSERT(tmp_data_len == 0);
|
||||
OSMO_ASSERT(data == buf + data_len);
|
||||
OSMO_ASSERT(value == unchanged_ptr);
|
||||
OSMO_ASSERT(value_len == unchanged_len);
|
||||
} else {
|
||||
OSMO_ASSERT(0 <= gprs_match_tlv(&data, &tmp_data_len,
|
||||
tag, &value, &value_len));
|
||||
OSMO_ASSERT(value != unchanged_ptr);
|
||||
OSMO_ASSERT(value_len != unchanged_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_tv_fixed_match_data_len(size_t data_len,
|
||||
uint8_t tag, size_t len,
|
||||
const uint8_t *test_data)
|
||||
{
|
||||
uint8_t buf[300] = {0};
|
||||
|
||||
uint8_t *unchanged_ptr = buf - 1;
|
||||
size_t tmp_data_len = data_len;
|
||||
uint8_t *value = unchanged_ptr;
|
||||
uint8_t *data = buf;
|
||||
|
||||
OSMO_ASSERT(data_len <= sizeof(buf));
|
||||
|
||||
tv_fixed_put(data, tag, len, test_data);
|
||||
|
||||
if (data_len < len + 1) {
|
||||
OSMO_ASSERT(-1 == gprs_match_tv_fixed(&data, &tmp_data_len,
|
||||
tag, len, &value));
|
||||
OSMO_ASSERT(tmp_data_len == 0);
|
||||
OSMO_ASSERT(data == buf + data_len);
|
||||
OSMO_ASSERT(value == unchanged_ptr);
|
||||
} else {
|
||||
OSMO_ASSERT(0 <= gprs_match_tv_fixed(&data, &tmp_data_len,
|
||||
tag, len, &value));
|
||||
OSMO_ASSERT(value != unchanged_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_v_fixed_shift_data_len(size_t data_len,
|
||||
size_t len, const uint8_t *test_data)
|
||||
{
|
||||
uint8_t buf[300] = {0};
|
||||
|
||||
uint8_t *unchanged_ptr = buf - 1;
|
||||
size_t tmp_data_len = data_len;
|
||||
uint8_t *value = unchanged_ptr;
|
||||
uint8_t *data = buf;
|
||||
|
||||
OSMO_ASSERT(data_len <= sizeof(buf));
|
||||
|
||||
memcpy(data, test_data, len);
|
||||
|
||||
if (data_len < len) {
|
||||
OSMO_ASSERT(-1 == gprs_shift_v_fixed(&data, &tmp_data_len,
|
||||
len, &value));
|
||||
OSMO_ASSERT(tmp_data_len == 0);
|
||||
OSMO_ASSERT(data == buf + data_len);
|
||||
OSMO_ASSERT(value == unchanged_ptr);
|
||||
} else {
|
||||
OSMO_ASSERT(0 <= gprs_shift_v_fixed(&data, &tmp_data_len,
|
||||
len, &value));
|
||||
OSMO_ASSERT(value != unchanged_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_lv_shift_data_len(size_t data_len,
|
||||
size_t len, const uint8_t *test_data)
|
||||
{
|
||||
uint8_t buf[300] = {0};
|
||||
|
||||
uint8_t *unchanged_ptr = buf - 1;
|
||||
size_t unchanged_len = 0xdead;
|
||||
size_t tmp_data_len = data_len;
|
||||
uint8_t *value = unchanged_ptr;
|
||||
size_t value_len = unchanged_len;
|
||||
uint8_t *data = buf;
|
||||
|
||||
lv_put(data, len, test_data);
|
||||
if (data_len < len + 1) {
|
||||
OSMO_ASSERT(-1 == gprs_shift_lv(&data, &tmp_data_len,
|
||||
&value, &value_len));
|
||||
OSMO_ASSERT(tmp_data_len == 0);
|
||||
OSMO_ASSERT(data == buf + data_len);
|
||||
OSMO_ASSERT(value == unchanged_ptr);
|
||||
OSMO_ASSERT(value_len == unchanged_len);
|
||||
} else {
|
||||
OSMO_ASSERT(0 <= gprs_shift_lv(&data, &tmp_data_len,
|
||||
&value, &value_len));
|
||||
OSMO_ASSERT(value != unchanged_ptr);
|
||||
OSMO_ASSERT(value_len != unchanged_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_tlv_shift_functions()
|
||||
{
|
||||
uint8_t test_data[1024];
|
||||
uint8_t buf[1024];
|
||||
uint8_t *data_end;
|
||||
unsigned i, len;
|
||||
uint8_t *data;
|
||||
size_t data_len;
|
||||
const uint8_t tag = 0x1a;
|
||||
|
||||
printf("Test shift functions\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(test_data); i++)
|
||||
test_data[i] = (uint8_t)i;
|
||||
|
||||
for (len = 0; len < 256; len++) {
|
||||
const unsigned iterations = sizeof(buf) / (len + 2) / 4;
|
||||
|
||||
memset(buf, 0xee, sizeof(buf));
|
||||
data_end = data = buf;
|
||||
|
||||
for (i = 0; i < iterations; i++) {
|
||||
data_end = tlv_put(data_end, tag, len, test_data);
|
||||
data_end = tv_fixed_put(data_end, tag, len, test_data);
|
||||
/* v_fixed_put */
|
||||
memcpy(data_end, test_data, len);
|
||||
data_end += len;
|
||||
data_end = lv_put(data_end, len, test_data);
|
||||
}
|
||||
|
||||
data_len = data_end - data;
|
||||
OSMO_ASSERT(data_len <= sizeof(buf));
|
||||
|
||||
for (i = 0; i < iterations; i++) {
|
||||
check_tlv_parse(&data, &data_len, tag, len, test_data);
|
||||
check_tv_fixed_match(&data, &data_len, tag, len, test_data);
|
||||
check_v_fixed_shift(&data, &data_len, len, test_data);
|
||||
check_lv_shift(&data, &data_len, len, test_data);
|
||||
}
|
||||
|
||||
OSMO_ASSERT(data == data_end);
|
||||
|
||||
/* Test at end of data */
|
||||
|
||||
OSMO_ASSERT(-1 == gprs_match_tlv(&data, &data_len, tag, NULL, NULL));
|
||||
OSMO_ASSERT(-1 == gprs_match_tv_fixed(&data, &data_len, tag, len, NULL));
|
||||
OSMO_ASSERT((len ? -1 : 0) == gprs_shift_v_fixed(&data, &data_len, len, NULL));
|
||||
OSMO_ASSERT(-1 == gprs_shift_lv(&data, &data_len, NULL, NULL));
|
||||
|
||||
/* Test invalid data_len */
|
||||
for (data_len = 0; data_len <= len + 2 + 1; data_len += 1) {
|
||||
check_tlv_match_data_len(data_len, tag, len, test_data);
|
||||
check_tv_fixed_match_data_len(data_len, tag, len, test_data);
|
||||
check_v_fixed_shift_data_len(data_len, len, test_data);
|
||||
check_lv_shift_data_len(data_len, len, test_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Tests for gprs_gsup_messages.c */
|
||||
/* Tests for osmo_gsup_messages.c */
|
||||
|
||||
#define TEST_IMSI_IE 0x01, 0x08, 0x21, 0x43, 0x65, 0x87, 0x09, 0x21, 0x43, 0xf5
|
||||
#define TEST_IMSI_STR "123456789012345"
|
||||
|
@ -705,7 +465,6 @@ int main(int argc, char **argv)
|
|||
|
||||
test_8_4_2();
|
||||
test_gsm_03_03_apn();
|
||||
test_tlv_shift_functions();
|
||||
test_gsup_messages_dec_enc();
|
||||
test_gprs_timer_enc_dec();
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@ N(U) = 511, V(UR) = 511 => new
|
|||
N(U) = 510, V(UR) = 511 => retransmit
|
||||
N(U) = 481, V(UR) = 511 => retransmit
|
||||
N(U) = 479, V(UR) = 511 => new
|
||||
Test shift functions
|
||||
Test GSUP message decoding/encoding
|
||||
Testing Send Authentication Info Request
|
||||
Testing Send Authentication Info Error
|
||||
|
|
Loading…
Reference in New Issue