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