2 * Copyright 2013 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials
14 * provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
29 * The views and conclusions contained in the software and
30 * documentation are those of the authors and should not be
31 * interpreted as representing official policies, either expressed
32 * or implied, of GRNET S.A.
40 static char get_hex(unsigned int h)
73 * Unsafe. Doesn't check if data length is odd!
76 void hexlify(unsigned char *data, long datalen, char *hex)
79 for (i=0; i<datalen; i++){
80 hex[2*i] = get_hex((data[i] & 0xF0) >> 4);
81 hex[2*i + 1] = get_hex(data[i] & 0x0F);
85 void unhexlify(char *hex, unsigned char *data)
89 for (i=0; i<SHA256_DIGEST_LENGTH; i++){
104 data[i] |= (c << 4) & 0xF0;
122 void merkle_hash(unsigned char *hashes, unsigned long len,
123 unsigned char hash[SHA256_DIGEST_SIZE])
125 unsigned long i, l, s = 2;
126 unsigned long nr = len/SHA256_DIGEST_SIZE;
128 unsigned char tmp_hash[SHA256_DIGEST_SIZE];
131 SHA256(hashes, 0, hash);
135 memcpy(hash, hashes, SHA256_DIGEST_SIZE);
140 buf = malloc(sizeof(unsigned char)* SHA256_DIGEST_SIZE * s);
141 memcpy(buf, hashes, nr * SHA256_DIGEST_SIZE);
142 memset(buf + nr * SHA256_DIGEST_SIZE, 0, (s - nr) * SHA256_DIGEST_SIZE);
143 for (l = s; l > 1; l = l/2) {
144 for (i = 0; i < l; i += 2) {
145 SHA256(buf + (i * SHA256_DIGEST_SIZE),
146 2 * SHA256_DIGEST_SIZE, tmp_hash);
147 memcpy(buf + (i/2 * SHA256_DIGEST_SIZE),
148 tmp_hash, SHA256_DIGEST_SIZE);
151 memcpy(hash, buf, SHA256_DIGEST_SIZE);