1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * math.c
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * crypto math operations and data types
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006 Cisco Systems, Inc.
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "crypto_math.h"
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_weight[256] = {
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0, 1, 1, 2, 1, 2, 2, 3,
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 6, 6, 7, 6, 7, 7, 8
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarilow_bit[256] = {
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  -1, 0, 1, 0, 2, 0, 1, 0,
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 0, 1, 0, 2, 0, 1, 0,
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 0, 1, 0, 2, 0, 1, 0,
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 0, 1, 0, 2, 0, 1, 0,
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 0, 1, 0, 2, 0, 1, 0,
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 0, 1, 0, 2, 0, 1, 0,
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 0, 1, 0, 2, 0, 1, 0,
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 0, 1, 0, 2, 0, 1, 0,
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0,
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 0, 1, 0, 2, 0, 1, 0,
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 0, 1, 0, 2, 0, 1, 0
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihigh_bit[256] = {
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  -1, 0, 1, 1, 2, 2, 2, 2,
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 3, 3, 3, 3, 3, 3, 3,
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 4, 4, 4, 4, 4, 4, 4,
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 4, 4, 4, 4, 4, 4, 4,
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 5, 5, 5, 5, 5, 5, 5,
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 5, 5, 5, 5, 5, 5, 5,
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 5, 5, 5, 5, 5, 5, 5,
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 5, 5, 5, 5, 5, 5, 5,
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  6, 6, 6, 6, 6, 6, 6, 6,
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7,
153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  7, 7, 7, 7, 7, 7, 7, 7
154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_get_weight(uint8_t octet) {
158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  extern int octet_weight[256];
159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return octet_weight[octet];
161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned char
164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_weight(v32_t a) {
165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  unsigned int wt = 0;
166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[a.v8[0]];  /* note: endian-ness makes no difference */
168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[a.v8[1]];
169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[a.v8[2]];
170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[a.v8[3]];
171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return wt;
173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline unsigned char
176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_distance(v32_t x, v32_t y) {
177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x.value ^= y.value;
178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return v32_weight(x);
179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned int
182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_dot_product(v32_t a, v32_t b) {
183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  a.value &= b.value;
184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return v32_weight(a) & 1;
185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * _bit_string returns a NULL-terminated character string suitable for
189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * printing
190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_STRING_LENGTH 1024
193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar bit_string[MAX_STRING_LENGTH];
195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_bit_string(uint8_t x) {
198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int mask, index;
199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (mask = 1, index = 0; mask < 256; mask <<= 1)
201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((x & mask) == 0)
202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      bit_string[index++] = '0';
203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      bit_string[index++] = '1';
205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[index++] = 0;  /* NULL terminate string */
207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv16_bit_string(v16_t x) {
213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, mask, index;
214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = index = 0; i < 2; i++) {
216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask = 1; mask < 256; mask <<= 1)
217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if ((x.v8[i] & mask) == 0)
218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '0';
219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '1';
221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[index++] = 0;  /* NULL terminate string */
223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_bit_string(v32_t x) {
228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, mask, index;
229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = index = 0; i < 4; i++) {
231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask = 128; mask > 0; mask >>= 1)
232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if ((x.v8[i] & mask) == 0)
233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '0';
234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '1';
236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[index++] = 0;  /* NULL terminate string */
238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv64_bit_string(const v64_t *x) {
243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, mask, index;
244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = index = 0; i < 8; i++) {
246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask = 1; mask < 256; mask <<= 1)
247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if ((x->v8[i] & mask) == 0)
248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '0';
249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index++] = '1';
251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[index++] = 0;  /* NULL terminate string */
253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_bit_string(v128_t *x) {
258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int j, index;
259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t mask;
260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (j=index=0; j < 4; j++) {
262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask=0x80000000; mask > 0; mask >>= 1) {
263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (x->v32[j] & mask)
264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index] = '1';
265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index] = '0';
267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      ++index;
268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[128] = 0; /* null terminate string */
271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinibble_to_hex_char(uint8_t nibble) {
277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari		  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return buf[nibble & 0xF];
280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_hex_string(uint8_t x) {
284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[0]  = nibble_to_hex_char(x >> 4);
286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[1]  = nibble_to_hex_char(x & 0xF);
287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[2] = 0; /* null terminate string */
289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_hex_string(const void *str, int length) {
294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const uint8_t *s = str;
295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* double length, since one octet takes two hex characters */
298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  length *= 2;
299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* truncate string if it would be too long */
301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (length > MAX_STRING_LENGTH)
302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    length = MAX_STRING_LENGTH-1;
303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < length; i+=2) {
305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[i]   = nibble_to_hex_char(*s >> 4);
306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[i+1] = nibble_to_hex_char(*s++ & 0xF);
307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[i] = 0; /* null terminate string */
309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv16_hex_string(v16_t x) {
314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 2; i++) {
317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x.v8[i] >> 4);
318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x.v8[i] & 0xF);
319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_hex_string(v32_t x) {
327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 4; i++) {
330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x.v8[i] >> 4);
331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x.v8[i] & 0xF);
332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv64_hex_string(const v64_t *x) {
340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 8; i++) {
343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] >> 4);
344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] & 0xF);
345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_hex_string(v128_t *x) {
353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 16; i++) {
356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] >> 4);
357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] & 0xF);
358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar_to_hex_string(char *x, int num_char) {
366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (num_char >= 16)
369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    num_char = 16;
370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < num_char; i++) {
371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x[i] >> 4);
372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x[i] & 0xF);
373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_char_to_nibble(uint8_t c) {
381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  switch(c) {
382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('0'): return 0x0;
383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('1'): return 0x1;
384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('2'): return 0x2;
385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('3'): return 0x3;
386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('4'): return 0x4;
387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('5'): return 0x5;
388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('6'): return 0x6;
389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('7'): return 0x7;
390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('8'): return 0x8;
391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('9'): return 0x9;
392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('a'): return 0xa;
393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('A'): return 0xa;
394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('b'): return 0xb;
395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('B'): return 0xb;
396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('c'): return 0xc;
397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('C'): return 0xc;
398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('d'): return 0xd;
399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('D'): return 0xd;
400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('e'): return 0xe;
401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('E'): return 0xe;
402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('f'): return 0xf;
403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('F'): return 0xf;
404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  default: return -1;   /* this flags an error */
405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* NOTREACHED */
407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return -1;  /* this keeps compilers from complaining */
408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
411386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariis_hex_string(char *s) {
412386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while(*s != 0)
413386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (hex_char_to_nibble(*s++) == -1)
414386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return 0;
415386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 1;
416386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
417386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
418386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
419386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_octet(char *s) {
420386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x;
421386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
422386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x = (hex_char_to_nibble(s[0]) << 4)
423386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    | hex_char_to_nibble(s[1] & 0xFF);
424386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
425386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x;
426386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
427386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
428386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
429386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * hex_string_to_octet_string converts a hexadecimal string
430386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of length 2 * len to a raw octet string of length len
431386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
432386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
433386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
434386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_octet_string(char *raw, char *hex, int len) {
435386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x;
436386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int tmp;
437386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int hex_len;
438386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
439386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  hex_len = 0;
440386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while (hex_len < len) {
441386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = hex_char_to_nibble(hex[0]);
442386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
443386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return hex_len;
444386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x = (tmp << 4);
445386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex_len++;
446386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = hex_char_to_nibble(hex[1]);
447386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
448386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return hex_len;
449386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x |= (tmp & 0xff);
450386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex_len++;
451386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    *raw++ = x;
452386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex += 2;
453386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
454386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return hex_len;
455386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
456386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
457386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv16_t
458386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_v16(char *s) {
459386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v16_t x;
460386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
461386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
462386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 4; i += 2, j++) {
463386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
464386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      | hex_char_to_nibble(s[i+1] & 0xFF);
465386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
466386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x;
467386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
468386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
469386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_t
470386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_v32(char *s) {
471386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t x;
472386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
473386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
474386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 8; i += 2, j++) {
475386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
476386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      | hex_char_to_nibble(s[i+1] & 0xFF);
477386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
478386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x;
479386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
480386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
481386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv64_t
482386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_v64(char *s) {
483386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v64_t x;
484386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
485386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
486386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 16; i += 2, j++) {
487386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
488386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      | hex_char_to_nibble(s[i+1] & 0xFF);
489386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
490386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x;
491386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
492386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
493386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_t
494386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_v128(char *s) {
495386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_t x;
496386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
497386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
498386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 32; i += 2, j++) {
499386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
500386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      | hex_char_to_nibble(s[i+1] & 0xFF);
501386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
502386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x;
503386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
504386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
505386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
506386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
507386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
508386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the matrix A[] is stored in column format, i.e., A[i] is the ith
509386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * column of the matrix
510386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
511386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
512386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
513386ce4d9144fc190797f4e43a31aeaf76ca2e373Param ReddappagariA_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b) {
514386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int index = 0;
515386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  unsigned mask;
516386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
517386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (mask=1; mask < 256; mask *= 2) {
518386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x & mask)
519386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      b^= A[index];
520386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    ++index;
521386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
522386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
523386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return b;
524386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
525386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
526386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline void
527386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv16_copy_octet_string(v16_t *x, const uint8_t s[2]) {
528386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[0]  = s[0];
529386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[1]  = s[1];
530386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
531386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
532386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline void
533386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_copy_octet_string(v32_t *x, const uint8_t s[4]) {
534386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[0]  = s[0];
535386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[1]  = s[1];
536386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[2]  = s[2];
537386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[3]  = s[3];
538386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
539386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
540386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline void
541386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv64_copy_octet_string(v64_t *x, const uint8_t s[8]) {
542386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[0]  = s[0];
543386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[1]  = s[1];
544386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[2]  = s[2];
545386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[3]  = s[3];
546386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[4]  = s[4];
547386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[5]  = s[5];
548386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[6]  = s[6];
549386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[7]  = s[7];
550386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
551386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
552386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
553386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy_octet_string(v128_t *x, const uint8_t s[16]) {
554386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[0]  = s[0];
555386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[1]  = s[1];
556386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[2]  = s[2];
557386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[3]  = s[3];
558386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[4]  = s[4];
559386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[5]  = s[5];
560386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[6]  = s[6];
561386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[7]  = s[7];
562386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[8]  = s[8];
563386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[9]  = s[9];
564386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[10] = s[10];
565386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[11] = s[11];
566386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[12] = s[12];
567386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[13] = s[13];
568386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[14] = s[14];
569386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x->v8[15] = s[15];
570386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
571386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
572386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
573386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef DATATYPES_USE_MACROS /* little functions are not macros */
574386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
575386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
576386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_to_zero(v128_t *x) {
577386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_to_zero(x);
578386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
579386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
580386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
581386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy(v128_t *x, const v128_t *y) {
582386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_copy(x, y);
583386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
584386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
585386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
586386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_xor(v128_t *z, v128_t *x, v128_t *y) {
587386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_xor(z, x, y);
588386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
589386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
590386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
591386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_and(v128_t *z, v128_t *x, v128_t *y) {
592386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_and(z, x, y);
593386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
594386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
595386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
596386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_or(v128_t *z, v128_t *x, v128_t *y) {
597386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_or(z, x, y);
598386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
599386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
600386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
601386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_complement(v128_t *x) {
602386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_complement(x);
603386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
604386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
605386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
606386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_is_eq(const v128_t *x, const v128_t *y) {
607386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _v128_is_eq(x, y);
608386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
609386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
610386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
611386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_get_bit(const v128_t *x, int i) {
612386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _v128_get_bit(x, i);
613386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
614386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
615386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
616386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit(v128_t *x, int i) {
617386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_bit(x, i);
618386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
619386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
620386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
621386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_clear_bit(v128_t *x, int i){
622386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_clear_bit(x, i);
623386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
624386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
625386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
626386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit_to(v128_t *x, int i, int y){
627386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_bit_to(x, i, y);
628386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
629386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
630386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
631386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* DATATYPES_USE_MACROS */
632386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
633386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
634386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline void
635386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_left_shift2(v128_t *x, int num_bits) {
636386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
637386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int word_shift = num_bits >> 5;
638386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int bit_shift  = num_bits & 31;
639386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
640386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < (4-word_shift); i++) {
641386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = x->v32[i+word_shift] << bit_shift;
642386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
643386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
644386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (   ; i < word_shift; i++) {
645386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = 0;
646386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
647386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
648386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
649386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
650386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
651386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_right_shift(v128_t *x, int index) {
652386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int base_index = index >> 5;
653386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int bit_index = index & 31;
654386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, from;
655386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t b;
656386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
657386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (index > 127) {
658386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    v128_set_to_zero(x);
659386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return;
660386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
661386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
662386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (bit_index == 0) {
663386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
664386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* copy each word from left size to right side */
665386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[4-1] = x->v32[4-1-base_index];
666386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=4-1; i > base_index; i--)
667386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i-1] = x->v32[i-1-base_index];
668386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
669386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } else {
670386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
671386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* set each word to the "or" of the two bit-shifted words */
672386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i = 4; i > base_index; i--) {
673386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      from = i-1 - base_index;
674386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      b = x->v32[from] << bit_index;
675386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (from > 0)
676386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        b |= x->v32[from-1] >> (32-bit_index);
677386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i-1] = b;
678386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
679386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
680386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
681386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
682386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* now wrap up the final portion */
683386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < base_index; i++)
684386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = 0;
685386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
686386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
687386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
688386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
689386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_left_shift(v128_t *x, int index) {
690386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
691386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int base_index = index >> 5;
692386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int bit_index = index & 31;
693386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
694386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (index > 127) {
695386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    v128_set_to_zero(x);
696386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return;
697386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
698386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
699386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (bit_index == 0) {
700386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < 4 - base_index; i++)
701386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i] = x->v32[i+base_index];
702386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } else {
703386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < 4 - base_index - 1; i++)
704386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i] = (x->v32[i+base_index] << bit_index) ^
705386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	(x->v32[i+base_index+1] >> (32 - bit_index));
706386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[4 - base_index-1] = x->v32[4-1] << bit_index;
707386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
708386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
709386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* now wrap up the final portion */
710386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = 4 - base_index; i < 4; i++)
711386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = 0;
712386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
713386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
714386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
715386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
716386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if 0
717386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
718386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_add(v128_t *z, v128_t *x, v128_t *y) {
719386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* integer addition modulo 2^128    */
720386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
721386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef WORDS_BIGENDIAN
722386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t tmp;
723386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
724386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp = x->v32[3] + y->v32[3];
725386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[3] = (uint32_t) tmp;
726386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
727386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[2] + y->v32[2] + (tmp >> 32);
728386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[2] = (uint32_t) tmp;
729386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
730386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[1] + y->v32[1] + (tmp >> 32);
731386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[1] = (uint32_t) tmp;
732386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
733386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[0] + y->v32[0] + (tmp >> 32);
734386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[0] = (uint32_t) tmp;
735386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
736386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else /* assume little endian architecture */
737386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t tmp;
738386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
739386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp = htonl(x->v32[3]) + htonl(y->v32[3]);
740386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[3] = ntohl((uint32_t) tmp);
741386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
742386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[2]) + htonl(y->v32[2]) + htonl(tmp >> 32);
743386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[2] = ntohl((uint32_t) tmp);
744386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
745386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[1]) + htonl(y->v32[1]) + htonl(tmp >> 32);
746386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[1] = ntohl((uint32_t) tmp);
747386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
748386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[0]) + htonl(y->v32[0]) + htonl(tmp >> 32);
749386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[0] = ntohl((uint32_t) tmp);
750386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
751386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* WORDS_BIGENDIAN */
752386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
753386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
754386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
755386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
756386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
757386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_is_eq(uint8_t *a, uint8_t *b, int len) {
758386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t *end = b + len;
759386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while (b < end)
760386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (*a++ != *b++)
761386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return 1;
762386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 0;
763386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
764386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
765386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
766386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_set_to_zero(uint8_t *s, int len) {
767386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t *end = s + len;
768386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
769386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  do {
770386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    *s = 0;
771386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } while (++s < end);
772386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
773386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
774386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
775386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
776386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* functions below not yet tested! */
777386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
778386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
779386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv32_low_bit(v32_t *w) {
780386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int value;
781386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
782386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  value = low_bit[w->v8[0]];
783386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (value != -1)
784386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return value;
785386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  value = low_bit[w->v8[1]];
786386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (value != -1)
787386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return value + 8;
788386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  value = low_bit[w->v8[2]];
789386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (value != -1)
790386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return value + 16;
791386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  value = low_bit[w->v8[3]];
792386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (value == -1)
793386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return -1;
794386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return value + 24;
795386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
796386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
797386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* high_bit not done yet */
798386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
799386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
800386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
801386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
802386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
803