loudmouth/lm-sha.c
author Dafydd Harries <dafydd.harries@collabora.co.uk>
Wed, 31 Oct 2007 15:34:52 +0000
changeset 315 eafeecd05c9a
parent 162 16d29898f97b
child 496 76a465d81893
permissions -rw-r--r--
include $(srcdir) in path to symbol file
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     1
/*-
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     2
 * Copyright (c) 2001, 2002 Allan Saddi <allan@saddi.com>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     3
 * All rights reserved.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 * Redistribution and use in source and binary forms, with or without
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * modification, are permitted provided that the following conditions
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * are met:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * 1. Redistributions of source code must retain the above copyright
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 *    notice, this list of conditions and the following disclaimer.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 * 2. Redistributions in binary form must reproduce the above copyright
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 *    notice, this list of conditions and the following disclaimer in the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 *    documentation and/or other materials provided with the distribution.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
 * SUCH DAMAGE.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
/*
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
 * Define WORDS_BIGENDIAN if compiling on a big-endian architecture.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
 * Define SHA1_TEST to test the implementation using the NIST's
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
 * sample messages. The output should be:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
 *   a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
 *   84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
 *   34aa973c d4c4daa4 f61eeb2b dbad2731 6534016f
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
#ifdef HAVE_CONFIG_H
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
#include <config.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
#endif /* HAVE_CONFIG_H */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
#include <string.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
#include <stdio.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
#include <glib.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
#include "lm-sha.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
#define SHA1_HASH_SIZE 20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
/* Hash size in 32-bit words */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
#define SHA1_HASH_WORDS 5
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
struct _SHA1Context {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
  guint64 totalLength;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
  guint32 hash[SHA1_HASH_WORDS];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
  guint32 bufferLength;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
  union {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
    guint32 words[16];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
    guint8 bytes[64];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
  } buffer;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
};
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
typedef struct _SHA1Context SHA1Context;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
#ifdef __cplusplus
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
extern "C" {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
#endif
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
162
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    70
static void SHA1Init (SHA1Context *sc);
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    71
static void SHA1Update (SHA1Context *sc, const void *udata, guint32 len);
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    72
static void SHA1Final (SHA1Context *sc, guint8 hash[SHA1_HASH_SIZE]);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    74
#ifdef __cplusplus
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    75
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
#endif
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
#ifndef lint
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
static const char rcsid[] =
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    80
	"$Id$";
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
#endif /* !lint */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    83
#define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
#define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
#define F_0_19(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
#define F_20_39(x, y, z) ((x) ^ (y) ^ (z))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
#define F_40_59(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
#define F_60_79(x, y, z) ((x) ^ (y) ^ (z))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
#define DO_ROUND(F, K) { \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    92
  temp = ROTL(a, 5) + F(b, c, d) + e + *(W++) + K; \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    93
  e = d; \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    94
  d = c; \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    95
  c = ROTL(b, 30); \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    96
  b = a; \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    97
  a = temp; \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    98
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    99
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   100
#define K_0_19 0x5a827999L
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   101
#define K_20_39 0x6ed9eba1L
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   102
#define K_40_59 0x8f1bbcdcL
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   103
#define K_60_79 0xca62c1d6L
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   104
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   105
#ifndef RUNTIME_ENDIAN
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   106
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   107
#ifdef WORDS_BIGENDIAN
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   108
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   109
#define BYTESWAP(x) (x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   110
#define BYTESWAP64(x) (x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   111
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   112
#else /* WORDS_BIGENDIAN */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   113
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   114
#define BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   115
		     (ROTL((x), 8) & 0x00ff00ffL))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   116
#define BYTESWAP64(x) _byteswap64(x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   117
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   118
static inline guint64 _byteswap64(guint64 x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   119
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   120
  guint32 a = x >> 32;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
  guint32 b = (guint32) x;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122
  return ((guint64) BYTESWAP(b) << 32) | (guint64) BYTESWAP(a);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   123
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   124
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   125
#endif /* WORDS_BIGENDIAN */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   126
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   127
#else /* !RUNTIME_ENDIAN */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
static int littleEndian;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   130
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   131
#define BYTESWAP(x) _byteswap(x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   132
#define BYTESWAP64(x) _byteswap64(x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   133
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   134
#define _BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   135
		      (ROTL((x), 8) & 0x00ff00ffL))
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   136
#define _BYTESWAP64(x) __byteswap64(x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   138
static inline guint64 __byteswap64(guint64 x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   139
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   140
  guint32 a = x >> 32;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   141
  guint32 b = (guint32) x;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   142
  return ((guint64) _BYTESWAP(b) << 32) | (guint64) _BYTESWAP(a);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   143
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   144
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   145
static inline guint32 _byteswap(guint32 x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   147
  if (!littleEndian)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   148
    return x;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   149
  else
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   150
    return _BYTESWAP(x);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   151
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   152
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   153
static inline guint64 _byteswap64(guint64 x)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   154
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
  if (!littleEndian)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
    return x;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
  else
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158
    return _BYTESWAP64(x);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   159
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   160
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   161
static inline void setEndian(void)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   162
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   163
  union {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   164
    guint32 w;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   165
    guint8 b[4];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   166
  } endian;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   167
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   168
  endian.w = 1L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   169
  littleEndian = endian.b[0] != 0;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   170
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   171
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   172
#endif /* !RUNTIME_ENDIAN */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   173
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   174
static const guint8 padding[64] = {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   175
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   176
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   177
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   178
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   179
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   180
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   181
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   182
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   183
};
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   184
162
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   185
static void
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   186
SHA1Init (SHA1Context *sc)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   187
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   188
#ifdef RUNTIME_ENDIAN
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   189
  setEndian ();
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   190
#endif /* RUNTIME_ENDIAN */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   191
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 86
diff changeset
   192
#ifdef G_OS_WIN32
9
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   193
  sc->totalLength = 0L;
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   194
#else
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   195
  sc->totalLength = 0LL;
9
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   196
#endif
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   197
  sc->hash[0] = 0x67452301L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   198
  sc->hash[1] = 0xefcdab89L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   199
  sc->hash[2] = 0x98badcfeL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   200
  sc->hash[3] = 0x10325476L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   201
  sc->hash[4] = 0xc3d2e1f0L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   202
  sc->bufferLength = 0L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   203
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   204
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   205
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   206
burnStack (int size)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   207
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   208
  char buf[128];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   209
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   210
  memset (buf, 0, sizeof (buf));
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   211
  size -= sizeof (buf);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   212
  if (size > 0)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   213
    burnStack (size);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   214
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   215
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   216
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   217
SHA1Guts (SHA1Context *sc, const guint32 *cbuf)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   218
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   219
  guint32 buf[80];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   220
  guint32 *W, *W3, *W8, *W14, *W16;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   221
  guint32 a, b, c, d, e, temp;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   222
  int i;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   223
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   224
  W = buf;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   225
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   226
  for (i = 15; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   227
    *(W++) = BYTESWAP(*cbuf);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   228
    cbuf++;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   229
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   230
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   231
  W16 = &buf[0];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   232
  W14 = &buf[2];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   233
  W8 = &buf[8];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   234
  W3 = &buf[13];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   235
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   236
  for (i = 63; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   237
    *W = *(W3++) ^ *(W8++) ^ *(W14++) ^ *(W16++);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   238
    *W = ROTL(*W, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   239
    W++;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   240
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   241
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   242
  a = sc->hash[0];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   243
  b = sc->hash[1];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   244
  c = sc->hash[2];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   245
  d = sc->hash[3];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   246
  e = sc->hash[4];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   247
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   248
  W = buf;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   249
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   250
#ifndef SHA1_UNROLL
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   251
#define SHA1_UNROLL 20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   252
#endif /* !SHA1_UNROLL */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   253
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   254
#if SHA1_UNROLL == 1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   255
  for (i = 19; i >= 0; i--)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   256
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   257
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   258
  for (i = 19; i >= 0; i--)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   259
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   260
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   261
  for (i = 19; i >= 0; i--)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   262
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   263
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   264
  for (i = 19; i >= 0; i--)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   265
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   266
#elif SHA1_UNROLL == 2
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   267
  for (i = 9; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   268
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   269
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   270
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   271
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   272
  for (i = 9; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   273
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   274
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   275
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   276
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   277
  for (i = 9; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   278
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   279
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   280
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   281
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   282
  for (i = 9; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   283
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   284
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   285
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   286
#elif SHA1_UNROLL == 4
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   287
  for (i = 4; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   288
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   289
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   290
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   291
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   292
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   293
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   294
  for (i = 4; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   295
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   296
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   297
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   298
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   299
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   300
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   301
  for (i = 4; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   302
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   303
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   304
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   305
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   306
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   307
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   308
  for (i = 4; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   309
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   310
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   311
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   312
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   313
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   314
#elif SHA1_UNROLL == 5
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   315
  for (i = 3; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   316
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   317
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   318
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   319
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   320
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   321
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   322
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   323
  for (i = 3; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   324
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   325
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   326
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   327
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   328
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   329
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   330
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   331
  for (i = 3; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   332
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   333
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   334
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   335
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   336
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   337
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   338
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   339
  for (i = 3; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   340
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   341
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   342
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   343
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   344
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   345
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   346
#elif SHA1_UNROLL == 10
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   347
  for (i = 1; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   348
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   349
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   350
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   351
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   352
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   353
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   354
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   355
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   356
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   357
    DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   358
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   359
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   360
  for (i = 1; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   361
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   362
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   363
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   364
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   365
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   366
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   367
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   368
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   369
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   370
    DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   371
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   372
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   373
  for (i = 1; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   374
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   375
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   376
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   377
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   378
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   379
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   380
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   381
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   382
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   383
    DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   384
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   385
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   386
  for (i = 1; i >= 0; i--) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   387
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   388
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   389
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   390
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   391
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   392
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   393
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   394
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   395
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   396
    DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   397
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   398
#elif SHA1_UNROLL == 20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   399
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   400
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   401
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   402
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   403
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   404
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   405
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   406
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   407
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   408
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   409
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   410
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   411
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   412
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   413
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   414
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   415
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   416
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   417
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   418
  DO_ROUND(F_0_19, K_0_19);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   419
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   420
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   421
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   422
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   423
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   424
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   425
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   426
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   427
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   428
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   429
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   430
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   431
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   432
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   433
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   434
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   435
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   436
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   437
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   438
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   439
  DO_ROUND(F_20_39, K_20_39);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   440
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   441
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   442
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   443
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   444
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   445
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   446
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   447
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   448
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   449
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   450
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   451
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   452
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   453
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   454
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   455
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   456
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   457
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   458
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   459
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   460
  DO_ROUND(F_40_59, K_40_59);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   461
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   462
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   463
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   464
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   465
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   466
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   467
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   468
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   469
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   470
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   471
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   472
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   473
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   474
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   475
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   476
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   477
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   478
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   479
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   480
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   481
  DO_ROUND(F_60_79, K_60_79);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   482
#else /* SHA1_UNROLL */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   483
#error SHA1_UNROLL must be 1, 2, 4, 5, 10 or 20!
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   484
#endif
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   485
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   486
  sc->hash[0] += a;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   487
  sc->hash[1] += b;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   488
  sc->hash[2] += c;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   489
  sc->hash[3] += d;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   490
  sc->hash[4] += e;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   491
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   492
162
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   493
static void
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 9
diff changeset
   494
SHA1Update (SHA1Context *sc, const void *udata, guint32 len)
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   495
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   496
  guint32 bufferBytesLeft;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   497
  guint32 bytesToCopy;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   498
  int needBurn = 0;
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 9
diff changeset
   499
  guint8 *data = (guint8 *)udata;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   500
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   501
#ifdef SHA1_FAST_COPY
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   502
  if (sc->bufferLength) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   503
    bufferBytesLeft = 64L - sc->bufferLength;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   504
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   505
    bytesToCopy = bufferBytesLeft;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   506
    if (bytesToCopy > len)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   507
      bytesToCopy = len;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   508
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   509
    memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   510
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   511
    sc->totalLength += bytesToCopy * 8L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   512
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   513
    sc->bufferLength += bytesToCopy;
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 9
diff changeset
   514
    data += bytesToCopy;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   515
    len -= bytesToCopy;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   516
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   517
    if (sc->bufferLength == 64L) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   518
      SHA1Guts (sc, sc->buffer.words);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   519
      needBurn = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   520
      sc->bufferLength = 0L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   521
    }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   522
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   523
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   524
  while (len > 63) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   525
    sc->totalLength += 512L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   526
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   527
    SHA1Guts (sc, data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   528
    needBurn = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   529
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 9
diff changeset
   530
    data += 64L;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   531
    len -= 64L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   532
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   533
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   534
  if (len) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   535
    memcpy (&sc->buffer.bytes[sc->bufferLength], data, len);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   536
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   537
    sc->totalLength += len * 8L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   538
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   539
    sc->bufferLength += len;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   540
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   541
#else /* SHA1_FAST_COPY */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   542
  while (len) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   543
    bufferBytesLeft = 64L - sc->bufferLength;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   544
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   545
    bytesToCopy = bufferBytesLeft;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   546
    if (bytesToCopy > len)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   547
      bytesToCopy = len;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   548
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   549
    memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   550
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   551
    sc->totalLength += bytesToCopy * 8L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   552
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   553
    sc->bufferLength += bytesToCopy;
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 9
diff changeset
   554
    data += bytesToCopy;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   555
    len -= bytesToCopy;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   556
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   557
    if (sc->bufferLength == 64L) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   558
      SHA1Guts (sc, sc->buffer.words);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   559
      needBurn = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   560
      sc->bufferLength = 0L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   561
    }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   562
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   563
#endif /* SHA1_FAST_COPY */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   564
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   565
  if (needBurn)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   566
    burnStack (sizeof (guint32[86]) + sizeof (guint32 *[5]) + sizeof (int));
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   567
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   568
162
16d29898f97b 2006-08-03 Richard Hult <richard@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   569
static void
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   570
SHA1Final (SHA1Context *sc, guint8 hash[SHA1_HASH_SIZE])
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   571
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   572
  guint32 bytesToPad;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   573
  guint64 lengthPad;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   574
  int i;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   575
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   576
  bytesToPad = 120L - sc->bufferLength;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   577
  if (bytesToPad > 64L)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   578
    bytesToPad -= 64L;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   579
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   580
  lengthPad = BYTESWAP64(sc->totalLength);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   581
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   582
  SHA1Update (sc, padding, bytesToPad);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   583
  SHA1Update (sc, &lengthPad, 8L);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   584
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   585
  if (hash) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   586
    for (i = 0; i < SHA1_HASH_WORDS; i++) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   587
#ifdef SHA1_FAST_COPY
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   588
      *((guint32 *) hash) = BYTESWAP(sc->hash[i]);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   589
#else /* SHA1_FAST_COPY */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   590
      hash[0] = (guint8) (sc->hash[i] >> 24);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   591
      hash[1] = (guint8) (sc->hash[i] >> 16);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   592
      hash[2] = (guint8) (sc->hash[i] >> 8);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   593
      hash[3] = (guint8) sc->hash[i];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   594
#endif /* SHA1_FAST_COPY */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   595
      hash += 4;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   596
    }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   597
  }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   598
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   599
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 86
diff changeset
   600
#ifdef G_OS_WIN32
9
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   601
#define snprintf _snprintf
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   602
#endif
2e14e3ab411b 2003-06-24 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 1
diff changeset
   603
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   604
const gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   605
lm_sha_hash (const gchar *str)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   606
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   607
        static gchar  ret_val[41];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   608
        SHA1Context   ctx;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   609
        guint8         hash[SHA1_HASH_SIZE];
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   610
        gchar        *ch;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   611
        guint          i;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   612
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   613
        SHA1Init (&ctx);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   614
        SHA1Update (&ctx, str, strlen (str));
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   615
        SHA1Final (&ctx, hash);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   616
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   617
        ch = ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   618
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   619
        for (i = 0; i < SHA1_HASH_SIZE; ++i) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   620
                snprintf (ch, 3, "%02x", hash[i]);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   621
                ch += 2;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   622
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   623
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   624
        return (const gchar *) ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   625
}