changeset 11:62cdfed70de7

phone number encoding factored out of pb-update code
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Feb 2021 01:08:20 +0000
parents a76ec3e7da09
children 8a34f5b7c812
files libcommon/Makefile libcommon/number_encode.c simtool/pbupdate.c
diffstat 3 files changed, 104 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/libcommon/Makefile	Fri Feb 12 00:47:04 2021 +0000
+++ b/libcommon/Makefile	Fri Feb 12 01:08:20 2021 +0000
@@ -2,7 +2,7 @@
 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 \
-	number_decode.o pbdumpfunc.o pinentry.o revnibbles.o
+	number_decode.o number_encode.o pbdumpfunc.o pinentry.o revnibbles.o
 LIB=	libcommon.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcommon/number_encode.c	Fri Feb 12 01:08:20 2021 +0000
@@ -0,0 +1,101 @@
+/*
+ * This module implements functions for encoding phone numbers.
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+digit_char_to_gsm(ch)
+{
+	switch (ch) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+		return (ch - '0');
+	case '*':
+		return 0xA;
+	case '#':
+		return 0xB;
+	case 'a':
+	case 'b':
+	case 'c':
+		return (ch - 'a' + 0xC);
+	case 'A':
+	case 'B':
+	case 'C':
+		return (ch - 'A' + 0xC);
+	}
+	return (-1);
+}
+
+void
+pack_digit_bytes(digits, dest, num_digit_bytes)
+	u_char *digits, *dest;
+	unsigned num_digit_bytes;
+{
+	u_char *sp, *dp;
+	unsigned n;
+
+	sp = digits;
+	dp = dest;
+	for (n = 0; n < num_digit_bytes; n++) {
+		*dp++ = sp[0] | (sp[1] << 4);
+		sp += 2;
+	}
+}
+
+encode_phone_number_arg(arg, fixp)
+	char *arg;
+	u_char *fixp;
+{
+	u_char digits[20];
+	unsigned ndigits, num_digit_bytes;
+	char *cp, *endp;
+	int c;
+
+	cp = arg;
+	if (*cp == '+') {
+		fixp[1] = 0x91;
+		cp++;
+	} else
+		fixp[1] = 0x81;
+	if (digit_char_to_gsm(*cp) < 0) {
+inv_arg:	fprintf(stderr, "error: invalid phone number argument\n");
+		return(-1);
+	}
+	for (ndigits = 0; ; ndigits++) {
+		c = digit_char_to_gsm(*cp);
+		if (c < 0)
+			break;
+		cp++;
+		if (ndigits >= 20) {
+			fprintf(stderr, "error: too many number digits\n");
+			return(-1);
+		}
+		digits[ndigits] = c;
+	}
+	if (ndigits & 1)
+		digits[ndigits++] = 0xF;
+	num_digit_bytes = ndigits >> 1;
+	fixp[0] = num_digit_bytes + 1;
+	pack_digit_bytes(digits, fixp + 2, num_digit_bytes);
+	if (*cp == ',') {
+		cp++;
+		if (!isdigit(*cp))
+			goto inv_arg;
+		fixp[1] = strtoul(cp, &endp, 0);
+		if (*endp)
+			goto inv_arg;
+	} else if (*cp)
+		goto inv_arg;
+	return(0);
+}
--- a/simtool/pbupdate.c	Fri Feb 12 00:47:04 2021 +0000
+++ b/simtool/pbupdate.c	Fri Feb 12 01:08:20 2021 +0000
@@ -45,53 +45,6 @@
 	0x0C, 0x06, 0xFF, 0xFF, 0x7E, 0xFF, 0xFF, 0xFF
 };
 
-static
-digit_char_to_gsm(ch)
-{
-	switch (ch) {
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-		return (ch - '0');
-	case '*':
-		return 0xA;
-	case '#':
-		return 0xB;
-	case 'a':
-	case 'b':
-	case 'c':
-		return (ch - 'a' + 0xC);
-	case 'A':
-	case 'B':
-	case 'C':
-		return (ch - 'A' + 0xC);
-	}
-	return (-1);
-}
-
-static void
-pack_digit_bytes(digits, dest, num_digit_bytes)
-	u_char *digits, *dest;
-	unsigned num_digit_bytes;
-{
-	u_char *sp, *dp;
-	unsigned n;
-
-	sp = digits;
-	dp = dest;
-	for (n = 0; n < num_digit_bytes; n++) {
-		*dp++ = sp[0] | (sp[1] << 4);
-		sp += 2;
-	}
-}
-
 static char *
 decode_qstring_alpha(cp, record, maxlen, filename_for_errs, lineno_for_errs)
 	char *cp, *filename_for_errs;
@@ -316,54 +269,6 @@
 }
 
 static
-decode_number_arg(arg, fixp)
-	char *arg;
-	u_char *fixp;
-{
-	u_char digits[20];
-	unsigned ndigits, num_digit_bytes;
-	char *cp, *endp;
-	int c;
-
-	cp = arg;
-	if (*cp == '+') {
-		fixp[1] = 0x91;
-		cp++;
-	} else
-		fixp[1] = 0x81;
-	if (digit_char_to_gsm(*cp) < 0) {
-inv_arg:	fprintf(stderr, "error: invalid phone number argument\n");
-		return(-1);
-	}
-	for (ndigits = 0; ; ndigits++) {
-		c = digit_char_to_gsm(*cp);
-		if (c < 0)
-			break;
-		cp++;
-		if (ndigits >= 20) {
-			fprintf(stderr, "error: too many number digits\n");
-			return(-1);
-		}
-		digits[ndigits] = c;
-	}
-	if (ndigits & 1)
-		digits[ndigits++] = 0xF;
-	num_digit_bytes = ndigits >> 1;
-	fixp[0] = num_digit_bytes + 1;
-	pack_digit_bytes(digits, fixp + 2, num_digit_bytes);
-	if (*cp == ',') {
-		cp++;
-		if (!isdigit(*cp))
-			goto inv_arg;
-		fixp[1] = strtoul(cp, &endp, 0);
-		if (*endp)
-			goto inv_arg;
-	} else if (*cp)
-		goto inv_arg;
-	return(0);
-}
-
-static
 decode_alphatag_arg(arg, record, maxlen)
 	char *arg;
 	u_char *record;
@@ -438,7 +343,7 @@
 	}
 	memset(record, 0xFF, curfile_record_len);
 	fixp = record + curfile_record_len - 14;
-	rc = decode_number_arg(argv[3], fixp);
+	rc = encode_phone_number_arg(argv[3], fixp);
 	if (rc < 0)
 		return(rc);
 	if (argv[4]) {
@@ -496,7 +401,7 @@
 	}
 	memset(record, 0xFF, curfile_record_len);
 	fixp = record + curfile_record_len - 14;
-	rc = decode_number_arg(argv[3], fixp);
+	rc = encode_phone_number_arg(argv[3], fixp);
 	if (rc < 0)
 		return(rc);
 	rc = decode_alphatag_arg_hex(argv[4], record, curfile_record_len - 14);