# HG changeset patch # User Mychaela Falconia # Date 1613088444 0 # Node ID 4a9bf783491de3ae93d8141e4dd0f523f89f4952 # Parent 4360a7906f3402400b3d235cf9d6a607d75800d5 phone number decoding factored out diff -r 4360a7906f34 -r 4a9bf783491d libcommon/Makefile --- a/libcommon/Makefile Thu Feb 11 23:56:13 2021 +0000 +++ b/libcommon/Makefile Fri Feb 12 00:07:24 2021 +0000 @@ -1,8 +1,8 @@ CC= gcc CFLAGS= -O2 -I/usr/include/PCSC OBJS= alpha_decode.o alpha_valid.o apdu.o atr.o cardconnect.o chkblank.o \ - dumpdirfunc.o exit.o hexdump.o hexread.o hexstr.o names.o pinentry.o \ - revnibbles.o + dumpdirfunc.o exit.o hexdump.o hexread.o hexstr.o names.o \ + number_decode.o pinentry.o revnibbles.o LIB= libcommon.a all: ${LIB} diff -r 4360a7906f34 -r 4a9bf783491d libcommon/number_decode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcommon/number_decode.c Fri Feb 12 00:07:24 2021 +0000 @@ -0,0 +1,37 @@ +/* + * This module implements functions for decoding phone numbers. + */ + +#include + +static char gsm_address_digits[16] = + {'0','1','2','3','4','5','6','7','8','9','*','#','a','b','c','?'}; + +decode_phone_number(data, nbytes, out) + u_char *data; + unsigned nbytes; + char *out; +{ + u_char *dp, *endp; + int c; + + dp = data; + endp = data + nbytes; + while (dp < endp) { + c = *dp & 0xF; + if (c == 0xF) + return(-1); + *out++ = gsm_address_digits[c]; + c = *dp >> 4; + if (c == 0xF) { + if (dp + 1 == endp) + break; + else + return(-1); + } + *out++ = gsm_address_digits[c]; + dp++; + } + *out = '\0'; + return(0); +} diff -r 4360a7906f34 -r 4a9bf783491d simtool/pbdump.c --- a/simtool/pbdump.c Thu Feb 11 23:56:13 2021 +0000 +++ b/simtool/pbdump.c Fri Feb 12 00:07:24 2021 +0000 @@ -10,39 +10,6 @@ #include "simresp.h" #include "curfile.h" -static char gsm_address_digits[16] = - {'0','1','2','3','4','5','6','7','8','9','*','#','a','b','c','?'}; - -static -decode_number(data, nbytes, out) - u_char *data; - unsigned nbytes; - char *out; -{ - u_char *dp, *endp; - int c; - - dp = data; - endp = data + nbytes; - while (dp < endp) { - c = *dp & 0xF; - if (c == 0xF) - return(-1); - *out++ = gsm_address_digits[c]; - c = *dp >> 4; - if (c == 0xF) { - if (dp + 1 == endp) - break; - else - return(-1); - } - *out++ = gsm_address_digits[c]; - dp++; - } - *out = '\0'; - return(0); -} - static check_blank_area(dp, endp) u_char *dp, *endp; @@ -77,7 +44,7 @@ fixp = sim_resp_data + sim_resp_data_len - 14; if (fixp[0] < 2 || fixp[0] > 11) goto malformed; - rc = decode_number(fixp + 2, fixp[0] - 1, digits); + rc = decode_phone_number(fixp + 2, fixp[0] - 1, digits); if (rc < 0) goto malformed; rc = check_blank_area(fixp + 1 + fixp[0], fixp + 12);