1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * datatypes.c
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * data types for finite fields and functions for input, output, and
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * manipulation
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006 Cisco Systems, Inc.
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "datatypes.h"
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_weight[256] = {
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0, 1, 1, 2, 1, 2, 2, 3,
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  1, 2, 2, 3, 2, 3, 3, 4,
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  2, 3, 3, 4, 3, 4, 4, 5,
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  3, 4, 4, 5, 4, 5, 5, 6,
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  4, 5, 5, 6, 5, 6, 6, 7,
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  5, 6, 6, 7, 6, 7, 7, 8
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_get_weight(uint8_t octet) {
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  extern int octet_weight[256];
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return octet_weight[octet];
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * bit_string is a buffer that is used to hold output strings, e.g.
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * for printing.
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* the value MAX_PRINT_STRING_LEN is defined in datatypes.h */
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar bit_string[MAX_PRINT_STRING_LEN];
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinibble_to_hex_char(uint8_t nibble) {
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari		  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return buf[nibble & 0xF];
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_hex_string(const void *s, int length) {
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const uint8_t *str = (const uint8_t *)s;
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* double length, since one octet takes two hex characters */
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  length *= 2;
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* truncate string if it would be too long */
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (length > MAX_PRINT_STRING_LEN)
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    length = MAX_PRINT_STRING_LEN-1;
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < length; i+=2) {
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[i]   = nibble_to_hex_char(*str >> 4);
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF);
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[i] = 0; /* null terminate string */
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariinline int
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_char_to_nibble(uint8_t c) {
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  switch(c) {
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('0'): return 0x0;
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('1'): return 0x1;
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('2'): return 0x2;
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('3'): return 0x3;
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('4'): return 0x4;
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('5'): return 0x5;
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('6'): return 0x6;
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('7'): return 0x7;
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('8'): return 0x8;
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('9'): return 0x9;
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('a'): return 0xa;
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('A'): return 0xa;
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('b'): return 0xb;
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('B'): return 0xb;
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('c'): return 0xc;
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('C'): return 0xc;
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('d'): return 0xd;
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('D'): return 0xd;
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('e'): return 0xe;
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('E'): return 0xe;
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('f'): return 0xf;
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case ('F'): return 0xf;
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  default: return -1;   /* this flags an error */
153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* NOTREACHED */
155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return -1;  /* this keeps compilers from complaining */
156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariis_hex_string(char *s) {
160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while(*s != 0)
161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (hex_char_to_nibble(*s++) == -1)
162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return 0;
163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 1;
164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * hex_string_to_octet_string converts a hexadecimal string
168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of length 2 * len to a raw octet string of length len
169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_octet_string(char *raw, char *hex, int len) {
173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x;
174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int tmp;
175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int hex_len;
176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  hex_len = 0;
178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while (hex_len < len) {
179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = hex_char_to_nibble(hex[0]);
180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return hex_len;
182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x = (tmp << 4);
183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex_len++;
184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = hex_char_to_nibble(hex[1]);
185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return hex_len;
187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x |= (tmp & 0xff);
188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex_len++;
189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    *raw++ = x;
190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    hex += 2;
191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return hex_len;
193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_hex_string(v128_t *x) {
197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, j;
198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=j=0; i < 16; i++) {
200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] >> 4);
201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bit_string[j++]  = nibble_to_hex_char(x->v8[i] & 0xF);
202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[j] = 0; /* null terminate string */
205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_bit_string(v128_t *x) {
210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int j, index;
211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t mask;
212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (j=index=0; j < 4; j++) {
214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask=0x80000000; mask > 0; mask >>= 1) {
215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (x->v32[j] & mask)
216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index] = '1';
217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	bit_string[index] = '0';
219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      ++index;
220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bit_string[128] = 0; /* null terminate string */
223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return bit_string;
225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy_octet_string(v128_t *x, const uint8_t s[16]) {
229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef ALIGNMENT_32BIT_REQUIRED
230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if ((((uint32_t) &s[0]) & 0x3) != 0)
231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  {
233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[0]  = s[0];
234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[1]  = s[1];
235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[2]  = s[2];
236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[3]  = s[3];
237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[4]  = s[4];
238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[5]  = s[5];
239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[6]  = s[6];
240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[7]  = s[7];
241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[8]  = s[8];
242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[9]  = s[9];
243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[10] = s[10];
244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[11] = s[11];
245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[12] = s[12];
246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[13] = s[13];
247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[14] = s[14];
248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  x->v8[15] = s[15];
249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef ALIGNMENT_32BIT_REQUIRED
251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  else
252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  {
253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  v128_t *v = (v128_t *) &s[0];
254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  v128_copy(x,v);
256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef DATATYPES_USE_MACROS /* little functions are not macros */
261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_to_zero(v128_t *x) {
264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_to_zero(x);
265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy(v128_t *x, const v128_t *y) {
269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_copy(x, y);
270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_xor(v128_t *z, v128_t *x, v128_t *y) {
274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_xor(z, x, y);
275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_and(v128_t *z, v128_t *x, v128_t *y) {
279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_and(z, x, y);
280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_or(v128_t *z, v128_t *x, v128_t *y) {
284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_or(z, x, y);
285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_complement(v128_t *x) {
289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_complement(x);
290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_is_eq(const v128_t *x, const v128_t *y) {
294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _v128_is_eq(x, y);
295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_xor_eq(v128_t *x, const v128_t *y) {
299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _v128_xor_eq(x, y);
300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_get_bit(const v128_t *x, int i) {
304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _v128_get_bit(x, i);
305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit(v128_t *x, int i) {
309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_bit(x, i);
310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_clear_bit(v128_t *x, int i){
314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_clear_bit(x, i);
315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit_to(v128_t *x, int i, int y){
319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _v128_set_bit_to(x, i, y);
320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* DATATYPES_USE_MACROS */
324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_right_shift(v128_t *x, int index) {
327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int base_index = index >> 5;
328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int bit_index = index & 31;
329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i, from;
330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t b;
331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (index > 127) {
333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    v128_set_to_zero(x);
334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return;
335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (bit_index == 0) {
338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* copy each word from left size to right side */
340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[4-1] = x->v32[4-1-base_index];
341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=4-1; i > base_index; i--)
342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i-1] = x->v32[i-1-base_index];
343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } else {
345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* set each word to the "or" of the two bit-shifted words */
347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i = 4; i > base_index; i--) {
348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      from = i-1 - base_index;
349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      b = x->v32[from] << bit_index;
350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (from > 0)
351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        b |= x->v32[from-1] >> (32-bit_index);
352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i-1] = b;
353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* now wrap up the final portion */
358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < base_index; i++)
359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = 0;
360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_left_shift(v128_t *x, int index) {
365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int base_index = index >> 5;
367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int bit_index = index & 31;
368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (index > 127) {
370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    v128_set_to_zero(x);
371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return;
372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (bit_index == 0) {
375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < 4 - base_index; i++)
376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i] = x->v32[i+base_index];
377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } else {
378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < 4 - base_index - 1; i++)
379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->v32[i] = (x->v32[i+base_index] >> bit_index) ^
380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	(x->v32[i+base_index+1] << (32 - bit_index));
381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[4 - base_index-1] = x->v32[4-1] >> bit_index;
382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* now wrap up the final portion */
385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = 4 - base_index; i < 4; i++)
386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->v32[i] = 0;
387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* functions manipulating bitvector_t */
391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef DATATYPES_USE_MACROS /* little functions are not macros */
393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_get_bit(const bitvector_t *v, int bit_index)
396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari{
397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return _bitvector_get_bit(v, bit_index);
398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_set_bit(bitvector_t *v, int bit_index)
402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari{
403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _bitvector_set_bit(v, bit_index);
404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_clear_bit(bitvector_t *v, int bit_index)
408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari{
409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  _bitvector_clear_bit(v, bit_index);
410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
411386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
412386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
413386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* DATATYPES_USE_MACROS */
414386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
415386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
416386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_alloc(bitvector_t *v, unsigned long length) {
417386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  unsigned long l;
418386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
419386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* Round length up to a multiple of bits_per_word */
420386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  length = (length + bits_per_word - 1) & ~(unsigned long)((bits_per_word - 1));
421386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
422386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  l = length / bits_per_word * bytes_per_word;
423386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
424386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* allocate memory, then set parameters */
425386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (l == 0)
426386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	v->word = NULL;
427386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  else {
428386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	v->word = (uint32_t*)crypto_alloc(l);
429386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	if (v->word == NULL) {
430386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  v->word = NULL;
431386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  v->length = 0;
432386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	  return -1;
433386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	}
434386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
435386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v->length = length;
436386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
437386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* initialize bitvector to zero */
438386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  bitvector_set_to_zero(v);
439386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
440386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 0;
441386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
442386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
443386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
444386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
445386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_dealloc(bitvector_t *v) {
446386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (v->word != NULL)
447386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	crypto_free(v->word);
448386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v->word = NULL;
449386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v->length = 0;
450386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
451386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
452386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
453386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_set_to_zero(bitvector_t *x)
454386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari{
455386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	/* C99 guarantees that memset(0) will set the value 0 for uint32_t */
456386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	memset(x->word, 0, x->length >> 3);
457386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
458386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
459386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
460386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_bit_string(bitvector_t *x, char* buf, int len) {
461386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int j, index;
462386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t mask;
463386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
464386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (j=index=0; j < (int)(x->length>>5) && index < len-1; j++) {
465386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (mask=0x80000000; mask > 0; mask >>= 1) {
466386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (x->word[j] & mask)
467386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	buf[index] = '1';
468386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      else
469386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	buf[index] = '0';
470386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      ++index;
471386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      if (index >= len-1)
472386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        break;
473386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
474386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
475386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  buf[index] = 0; /* null terminate string */
476386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
477386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return buf;
478386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
479386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
480386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
481386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_left_shift(bitvector_t *x, int index) {
482386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
483386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int base_index = index >> 5;
484386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int bit_index = index & 31;
485386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  const int word_length = x->length >> 5;
486386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
487386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (index >= (int)x->length) {
488386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    bitvector_set_to_zero(x);
489386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return;
490386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
491386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
492386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (bit_index == 0) {
493386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < word_length - base_index; i++)
494386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->word[i] = x->word[i+base_index];
495386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } else {
496386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (i=0; i < word_length - base_index - 1; i++)
497386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x->word[i] = (x->word[i+base_index] >> bit_index) ^
498386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	(x->word[i+base_index+1] << (32 - bit_index));
499386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->word[word_length - base_index-1] = x->word[word_length-1] >> bit_index;
500386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
501386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
502386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* now wrap up the final portion */
503386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i = word_length - base_index; i < word_length; i++)
504386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x->word[i] = 0;
505386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
506386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
507386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
508386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
509386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
510386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_is_eq(uint8_t *a, uint8_t *b, int len) {
511386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t *end = b + len;
512386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while (b < end)
513386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (*a++ != *b++)
514386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return 1;
515386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 0;
516386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
517386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
518386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
519386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_set_to_zero(uint8_t *s, int len) {
520386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t *end = s + len;
521386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
522386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  do {
523386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    *s = 0;
524386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  } while (++s < end);
525386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
526386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
527386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
528386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
529386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
530386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *  From RFC 1521: The Base64 Alphabet
531386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
532386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Value Encoding  Value Encoding  Value Encoding  Value Encoding
533386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        0 A            17 R            34 i            51 z
534386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        1 B            18 S            35 j            52 0
535386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        2 C            19 T            36 k            53 1
536386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        3 D            20 U            37 l            54 2
537386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        4 E            21 V            38 m            55 3
538386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        5 F            22 W            39 n            56 4
539386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        6 G            23 X            40 o            57 5
540386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        7 H            24 Y            41 p            58 6
541386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        8 I            25 Z            42 q            59 7
542386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *        9 J            26 a            43 r            60 8
543386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       10 K            27 b            44 s            61 9
544386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       11 L            28 c            45 t            62 +
545386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       12 M            29 d            46 u            63 /
546386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       13 N            30 e            47 v
547386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       14 O            31 f            48 w         (pad) =
548386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       15 P            32 g            49 x
549386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *       16 Q            33 h            50 y
550386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
551386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
552386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
553386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribase64_char_to_sextet(uint8_t c) {
554386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  switch(c) {
555386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'A':
556386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 0;
557386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'B':
558386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 1;
559386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'C':
560386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 2;
561386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'D':
562386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 3;
563386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'E':
564386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 4;
565386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'F':
566386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 5;
567386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'G':
568386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 6;
569386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'H':
570386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 7;
571386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'I':
572386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 8;
573386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'J':
574386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 9;
575386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'K':
576386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 10;
577386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'L':
578386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 11;
579386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'M':
580386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 12;
581386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'N':
582386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 13;
583386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'O':
584386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 14;
585386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'P':
586386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 15;
587386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'Q':
588386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 16;
589386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'R':
590386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 17;
591386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'S':
592386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 18;
593386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'T':
594386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 19;
595386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'U':
596386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 20;
597386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'V':
598386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 21;
599386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'W':
600386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 22;
601386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'X':
602386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 23;
603386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'Y':
604386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 24;
605386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'Z':
606386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 25;
607386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'a':
608386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 26;
609386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'b':
610386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 27;
611386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'c':
612386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 28;
613386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'd':
614386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 29;
615386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'e':
616386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 30;
617386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'f':
618386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 31;
619386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'g':
620386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 32;
621386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'h':
622386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 33;
623386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'i':
624386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 34;
625386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'j':
626386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 35;
627386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'k':
628386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 36;
629386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'l':
630386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 37;
631386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'm':
632386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 38;
633386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'n':
634386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 39;
635386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'o':
636386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 40;
637386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'p':
638386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 41;
639386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'q':
640386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 42;
641386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'r':
642386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 43;
643386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 's':
644386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 44;
645386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 't':
646386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 45;
647386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'u':
648386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 46;
649386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'v':
650386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 47;
651386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'w':
652386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 48;
653386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'x':
654386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 49;
655386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'y':
656386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 50;
657386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case 'z':
658386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 51;
659386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '0':
660386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 52;
661386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '1':
662386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 53;
663386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '2':
664386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 54;
665386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '3':
666386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 55;
667386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '4':
668386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 56;
669386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '5':
670386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 57;
671386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '6':
672386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 58;
673386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '7':
674386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 59;
675386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '8':
676386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 60;
677386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '9':
678386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 61;
679386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '+':
680386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 62;
681386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '/':
682386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 63;
683386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  case '=':
684386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return 64;
685386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  default:
686386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    break;
687386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari }
688386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return -1;
689386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
690386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
691386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
692386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * base64_string_to_octet_string converts a hexadecimal string
693386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of length 2 * len to a raw octet string of length len
694386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
695386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
696386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
697386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribase64_string_to_octet_string(char *raw, char *base64, int len) {
698386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t x;
699386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int tmp;
700386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int base64_len;
701386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
702386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  base64_len = 0;
703386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  while (base64_len < len) {
704386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = base64_char_to_sextet(base64[0]);
705386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
706386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return base64_len;
707386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x = (tmp << 6);
708386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    base64_len++;
709386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    tmp = base64_char_to_sextet(base64[1]);
710386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (tmp == -1)
711386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return base64_len;
712386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    x |= (tmp & 0xffff);
713386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    base64_len++;
714386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    *raw++ = x;
715386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    base64 += 2;
716386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
717386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return base64_len;
718386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
719