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