Initial revision
[become] / src / tx.c
1 /* -*-c-*-
2 *
3 * $Id: tx.c,v 1.1 1997/07/21 13:47:43 mdw Exp $
4 *
5 * Transfer for keys and other large integers
6 *
7 * (c) 1997 Mark Wooding
8 */
9
10 /*----- Licencing notice --------------------------------------------------*
11 *
12 * This file is part of `become'
13 *
14 * `Become' is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * `Become' is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with `become'; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 */
28
29 /*----- Revision history --------------------------------------------------*
30 *
31 * $Log: tx.c,v $
32 * Revision 1.1 1997/07/21 13:47:43 mdw
33 * Initial revision
34 *
35 */
36
37 /*----- Header files ------------------------------------------------------*/
38
39 /* --- ANSI headers --- */
40
41 #include <errno.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45
46 /* --- Local headers --- */
47
48 #include "config.h"
49 #include "tx.h"
50
51 /*----- Main code ---------------------------------------------------------*/
52
53 /* --- @tx_getBits@ --- *
54 *
55 * Arguments: @unsigned char *k@ = pointer to key array to unpack into
56 * @size_t sz@ = number of bits to read (elements in array)
57 * @FILE *fp@ = stream to read from
58 *
59 * Returns: ---
60 *
61 * Use: Reads a number of bits into an array. The least significant
62 * bits of the final word are cleared to zero.
63 */
64
65 void tx_getBits(unsigned char *k, size_t sz, FILE *fp)
66 {
67 int i = 0;
68 unsigned char a = 0;
69 unsigned int ch;
70 size_t wsz = (size_t)((sz + 7ul) & ~7ul);
71 int t;
72
73 while ((t = getc(fp)) != EOF) {
74
75 /* --- Allow separators for readbility --- */
76
77 if (t == '-')
78 continue;
79
80 /* --- Standard converting-from-hex-digit code --- *
81 *
82 * Assumes that 'a'--'f' and 'A'--'F' are contiguous and in order, in
83 * addition to the guarantee that '0'--'9' are like this. The assumption
84 * is true in ASCII (and character sets based thereon) and EBCDIC.
85 */
86
87 ch = (unsigned)t;
88 ch -= '0';
89 if (ch > 9) ch -= 'A' - '0' - 10;
90 if (ch > 15) ch -= 'a' - 'A';
91 if (ch > 15) break;
92
93 /* --- Accumulate and maybe store --- */
94
95 a = (a << 4) | ch;
96 i++;
97 sz -= 4, wsz -= 4;
98 if ((i & 1) == 0)
99 *k++ = a, a = 0;
100 if (!sz)
101 break;
102 }
103
104 /* --- Pad the rest out with zeros --- */
105
106 while (wsz) {
107 a <<= 4;
108 i++;
109 wsz -= 4;
110 if ((i & 1) == 0)
111 *k++ = a, a = 0;
112 }
113 }
114
115 /* --- @tx_putBits@ --- *
116 *
117 * Arguments: @unsigned char *k@ = pointer to key block
118 * @size_t sz@ = number of bits to write
119 * @FILE *fp@ = pointer to stream to write on
120 *
121 * Returns: ---
122 *
123 * Use: Complements @tx_getBits@ above. Writes a number of bits
124 * to a file in an easy-to-read and transportable format (hex!)
125 */
126
127 void tx_putBits(unsigned char *k, size_t sz, FILE *fp)
128 {
129 const static char hex[16] = "0123456789abcdef";
130 size_t dash;
131 size_t d;
132 unsigned char i;
133
134 /* --- Don't do anything unless we have to --- */
135
136 if (!sz)
137 return;
138
139 /* --- Now decide where to `dash' the output --- */
140
141 if (sz % 32 == 0)
142 dash = 4;
143 else if (sz % 40 == 0)
144 dash = 5;
145 else
146 dash = 0;
147
148 /* --- Start writing values out --- */
149
150 d = dash;
151
152 for (;;) {
153
154 /* --- Write next byte out --- */
155
156 i = *k++;
157 putc(hex[(i >> 4) & 0x0fu], fp);
158 putc(hex[(i >> 0) & 0x0fu], fp);
159
160 /* --- If done, stop now --- */
161
162 if (sz -= 8, sz == 0)
163 break;
164
165 /* --- If need a dash, print one --- */
166
167 if (!--d) {
168 putc('-', fp);
169 d = dash;
170 }
171 }
172
173 /* --- Print the final newline --- */
174
175 fputc('\n', fp);
176 }
177
178 /*----- That's all, folks -------------------------------------------------*/