1 /*
2  * datatypes_driver.c
3  *
4  * a test driver for crypto/math datatypes
5  *
6  * David A. McGrew
7  * Cisco Systems, Inc.
8  */
9 
10 /*
11  *
12  * Copyright (c) 2001-2006, Cisco Systems, Inc.
13  * All rights reserved.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  *
19  *   Redistributions of source code must retain the above copyright
20  *   notice, this list of conditions and the following disclaimer.
21  *
22  *   Redistributions in binary form must reproduce the above
23  *   copyright notice, this list of conditions and the following
24  *   disclaimer in the documentation and/or other materials provided
25  *   with the distribution.
26  *
27  *   Neither the name of the Cisco Systems, Inc. nor the names of its
28  *   contributors may be used to endorse or promote products derived
29  *   from this software without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42  * OF THE POSSIBILITY OF SUCH DAMAGE.
43  *
44  */
45 
46 
47 #include <stdio.h>            /* for printf() */
48 #include <string.h>           /* for strlen() */
49 #include "datatypes.h"
50 
51 void
52 byte_order(void);
53 
54 void
55 test_hex_string_funcs(void);
56 
57 void
58 print_string(char *s);
59 
60 void
61 test_bswap(void);
62 
63 int
main(void)64 main (void) {
65 
66   /*
67    * this program includes various and sundry tests for fundamental
68    * datatypes.  it's a grab-bag of throwaway code, retained only in
69    * case of future problems
70    */
71 
72   int i, j;
73   v128_t x;
74   char *r =
75     "The Moving Finger writes; and, having writ,\n"
76     "Moves on: nor all thy Piety nor Wit\n"
77     "Shall lure it back to cancel half a Line,\n"
78     "Nor all thy Tears wash out a Word of it.";
79   char *s = "incomplet";
80 
81   print_string(r);
82   print_string(s);
83 
84   byte_order();
85   test_hex_string_funcs();
86 
87   for (j=0; j < 128; j++) {
88     v128_set_to_zero(&x);
89     /*      x.v32[0] = (1 << j); */
90     v128_set_bit(&x, j);
91     printf("%s\n", v128_bit_string(&x));
92     v128_clear_bit(&x, j);
93     printf("%s\n", v128_bit_string(&x));
94 
95   }
96 
97   printf("----------------------------------------------\n");
98   v128_set_to_zero(&x);
99   for (i=0; i < 128; i++) {
100     v128_set_bit(&x, i);
101   }
102   printf("%s\n", v128_bit_string(&x));
103 
104   printf("----------------------------------------------\n");
105   v128_set_to_zero(&x);
106   v128_set_bit(&x, 0);
107   for (i=0; i < 128; i++) {
108       printf("%s\n", v128_bit_string(&x));
109     v128_right_shift(&x, 1);
110   }
111   printf("----------------------------------------------\n");
112   v128_set_to_zero(&x);
113   v128_set_bit(&x, 127);
114   for (i=0; i < 128; i++) {
115       printf("%s\n", v128_bit_string(&x));
116     v128_left_shift(&x, 1);
117   }
118   printf("----------------------------------------------\n");
119   for (i=0; i < 128; i++) {
120     v128_set_to_zero(&x);
121     v128_set_bit(&x, 127);
122     v128_left_shift(&x, i);
123       printf("%s\n", v128_bit_string(&x));
124   }
125   printf("----------------------------------------------\n");
126   v128_set_to_zero(&x);
127   for (i=0; i < 128; i+=2) {
128     v128_set_bit(&x, i);
129   }
130   printf("bit_string: { %s }\n", v128_bit_string(&x));
131   printf("get_bit:    { ");
132   for (i=0; i < 128; i++) {
133     if (v128_get_bit(&x, i) == 1)
134       printf("1");
135     else
136       printf("0");
137   }
138   printf(" } \n");
139 
140   test_bswap();
141 
142   return 0;
143 }
144 
145 
146 /* byte_order() prints out byte ordering of datatypes */
147 
148 void
byte_order(void)149 byte_order(void) {
150   int i;
151   v128_t e;
152 #if 0
153   v16_t b;
154   v32_t c;
155   v64_t d;
156 
157   for (i=0; i < sizeof(b); i++)
158     b.octet[i] = i;
159   for (i=0; i < sizeof(c); i++)
160     c.octet[i] = i;
161   for (i=0; i < sizeof(d); i++)
162     d.octet[i] = i;
163 
164   printf("v128_t:\t%s\n", v128_hex_string(&e));
165   printf("v64_t:\t%s\n", v64_hex_string(&d));
166   printf("v32_t:\t%s\n", v32_hex_string(c));
167   printf("v16_t:\t%s\n", v16_hex_string(b));
168 
169   c.value = 0x01020304;
170   printf("v32_t:\t%s\n", v32_hex_string(c));
171   b.value = 0x0102;
172   printf("v16_t:\t%s\n", v16_hex_string(b));
173 
174   printf("uint16_t ordering:\n");
175 
176   c.value = 0x00010002;
177   printf("v32_t:\t%x%x\n", c.v16[0], c.v16[1]);
178 #endif
179 
180   printf("byte ordering of crypto/math datatypes:\n");
181   for (i=0; i < sizeof(e); i++)
182     e.v8[i] = i;
183   printf("v128_t: %s\n", v128_hex_string(&e));
184 
185 }
186 
187 void
test_hex_string_funcs(void)188 test_hex_string_funcs(void) {
189   char hex1[] = "abadcafe";
190   char hex2[] = "0123456789abcdefqqqqq";
191   char raw[10];
192   int len;
193 
194   len = hex_string_to_octet_string(raw, hex1, strlen(hex1));
195   printf("computed length: %d\tstring: %s\n", len,
196 	 octet_string_hex_string(raw, len/2));
197   printf("expected length: %u\tstring: %s\n", (unsigned)strlen(hex1), hex1);
198 
199   len = hex_string_to_octet_string(raw, hex2, strlen(hex2));
200   printf("computed length: %d\tstring: %s\n", len,
201 	 octet_string_hex_string(raw, len/2));
202   printf("expected length: %d\tstring: %s\n", 16, "0123456789abcdef");
203 
204 }
205 
206 void
print_string(char * s)207 print_string(char *s) {
208   int i;
209   printf("%s\n", s);
210   printf("strlen(s) = %u\n", (unsigned)strlen(s));
211   printf("{ ");
212   for (i=0; i < strlen(s); i++) {
213     printf("0x%x, ", s[i]);
214     if (((i+1) % 8) == 0)
215       printf("\n   ");
216   }
217   printf("}\n");
218 }
219 
220 void
test_bswap(void)221 test_bswap(void) {
222   uint32_t x = 0x11223344;
223   uint64_t y = 0x1122334455667788LL;
224 
225   printf("before: %0x\nafter:  %0x\n", x, be32_to_cpu(x));
226   printf("before: %0llx\nafter:  %0llx\n", (unsigned long long)y,
227 	 (unsigned long long)be64_to_cpu(y));
228 
229   y = 1234;
230 
231   printf("1234: %0llx\n", (unsigned long long)y);
232   printf("as octet string: %s\n",
233 	 octet_string_hex_string((uint8_t *) &y, 8));
234   y = be64_to_cpu(y);
235   printf("bswapped octet string: %s\n",
236 	 octet_string_hex_string((uint8_t *) &y, 8));
237 }
238