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