SHA1Stream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18120 e3a375d5f6a8
child 19150 91cebbed06c7
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4426
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     1
"
15038
22f613e86520 class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15025
diff changeset
     2
 COPYRIGHT (c) 1999-2013 by eXept Software AG
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
     3
	      All Rights Reserved
4426
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     4
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     5
 This software is furnished under a license and may be used
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     6
 only in accordance with the terms of that license and with the
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     8
 be provided or otherwise made available to, or used by, any
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
     9
 other person.  No title to or ownership of the software is
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
    10
 hereby transferred.
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
    11
"
9369
b7f43a51c4ed Moved SHA1Stream from exept:libcrypt to stx:libbasic
Stefan Vogel <sv@exept.de>
parents: 7824
diff changeset
    12
"{ Package: 'stx:libbasic' }"
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
HashStream subclass:#SHA1Stream
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'hashContext'
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
	classVariableNames:'HashSize ContextSize'
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
12420
a422d9a78479 category changes
Claus Gittinger <cg@exept.de>
parents: 12265
diff changeset
    18
	category:'System-Crypt-Hashing'
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
!SHA1Stream primitiveDefinitions!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
%{
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
#if defined(__LSBFIRST)
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    25
# ifndef LITTLE_ENDIAN
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    26
#  define LITTLE_ENDIAN /* This should be #define'd if true. */
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    27
# endif
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
    30
#define SHA1HANDSOFF /* Copies data before messing with it. */
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
#include <stdio.h>
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
#include <string.h>
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
typedef struct {
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
    36
    unsigned int32 state[5];
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
    37
    unsigned int32 count[2];
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
    unsigned char buffer[64];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
} SHA1_CTX;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    41
#if USE_ANSI_C
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
    42
 void SHA1Transform(unsigned int32 /* long */ state[5], unsigned char buffer[64]);
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    43
 void SHA1Init(SHA1_CTX* context);
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    44
 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    45
 void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    46
#else /* general: compiles everywhere */
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    47
# define SHA1Init   __SHA1Init
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    48
# define SHA1Update __SHA1Update
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    49
# define SHA1Final  __SHA2Final
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    51
 void SHA1Init();
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    52
 void SHA1Update();
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    53
 void SHA1Final();
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    54
#endif /* USE_ANSI_C */
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
%}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
!SHA1Stream primitiveFunctions!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
%{
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
/*
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    62
 * SHA-1 in C
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    63
 * By Steve Reid <steve@edmweb.com>
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    64
 * 100% Public Domain
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    65
 */
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
/* blk0() and blk() perform the initial expand. */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
/* I got the idea of expanding during the round function from SSLeay */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
#ifdef LITTLE_ENDIAN
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    72
# define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
    |(rol(block->l[i],8)&0x00FF00FF))
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
#else
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    75
# define blk0(i) block->l[i]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
#endif
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    77
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
    ^block->l[(i+2)&15]^block->l[i&15],1))
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
/* Hash a single 512-bit block. This is the core of the algorithm. */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    91
static void
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
    92
#if USE_ANSI_C
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
    93
SHA1Transform (unsigned int32 state[5], unsigned char buffer[64])
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
#else
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
SHA1Transform (state, buffer)
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
    96
    unsigned int32 state[5];
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
    unsigned char buffer[64];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
{
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   100
    unsigned int32 a, b, c, d, e;
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   101
    typedef union {
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   102
	unsigned char c[64];
14791
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   103
	unsigned int32 /* long */ l[16];
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   104
    } CHAR64LONG16;
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   105
    CHAR64LONG16* block;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
#ifdef SHA1HANDSOFF
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   107
    static unsigned char workspace[64];
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
    block = (CHAR64LONG16*)workspace;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
    memcpy(block, buffer, 64);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   110
#else
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
    block = (CHAR64LONG16*)buffer;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   113
    /* Copy context->state[] to working vars */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   114
    a = state[0];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
    b = state[1];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
    c = state[2];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
    d = state[3];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
    e = state[4];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
    /* 4 rounds of 20 operations each. Loop unrolled. */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
    R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
    R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
    R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
    R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
    R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
    R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
    R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
    R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
    R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
    R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   130
    R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   131
    R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   132
    R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   133
    R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   134
    R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   135
    R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   136
    R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   137
    R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   138
    R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   139
    R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   140
    /* Add the working vars back into context.state[] */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   141
    state[0] += a;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   142
    state[1] += b;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   143
    state[2] += c;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   144
    state[3] += d;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   145
    state[4] += e;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   146
    /* Wipe variables */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   147
    a = b = c = d = e = 0;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   148
}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   149
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   150
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
/* SHA1Init - Initialize new context */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
9369
b7f43a51c4ed Moved SHA1Stream from exept:libcrypt to stx:libbasic
Stefan Vogel <sv@exept.de>
parents: 7824
diff changeset
   153
void
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   154
#if USE_ANSI_C
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
SHA1Init(SHA1_CTX* context)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
#else
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   157
SHA1Init(context)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   158
    SHA1_CTX* context;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   159
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   160
{
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   161
    /* SHA1 initialization constants */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
    context->state[0] = 0x67452301;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
    context->state[1] = 0xEFCDAB89;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   164
    context->state[2] = 0x98BADCFE;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   165
    context->state[3] = 0x10325476;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   166
    context->state[4] = 0xC3D2E1F0;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   167
    context->count[0] = context->count[1] = 0;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   168
}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   169
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   170
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   171
/* Run your data through this. */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   172
9369
b7f43a51c4ed Moved SHA1Stream from exept:libcrypt to stx:libbasic
Stefan Vogel <sv@exept.de>
parents: 7824
diff changeset
   173
void
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   174
#if USE_ANSI_C
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   175
SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   176
#else
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   177
SHA1Update(context, data, len)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   178
    SHA1_CTX* context;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   179
    unsigned char* data;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   180
    unsigned int len;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   181
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
{
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   183
    unsigned int i, j;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
    j = (context->count[0] >> 3) & 63;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
    if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
    context->count[1] += (len >> 29);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
    if ((j + len) > 63) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   189
	memcpy(&context->buffer[j], data, (i = 64-j));
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   190
	SHA1Transform(context->state, context->buffer);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   191
	for ( ; i + 63 < len; i += 64) {
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   192
	    SHA1Transform(context->state, &data[i]);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   193
	}
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   194
	j = 0;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   195
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   196
    else i = 0;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   197
    memcpy(&context->buffer[j], &data[i], len - i);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   199
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   200
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   201
/* Add padding and return the message digest. */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
void
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   204
#if USE_ANSI_C
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
SHA1Final(unsigned char digest[20], SHA1_CTX* context)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
#else
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
SHA1Final(digest, context)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
    unsigned char digest[20];
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
    SHA1_CTX* context;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   210
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
{
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   212
    unsigned int32 i, j;
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   213
    unsigned char finalcount[8];
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
    for (i = 0; i < 8; i++) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   216
	finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   217
	 >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
    SHA1Update(context, (unsigned char *)"\200", 1);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
    while ((context->count[0] & 504) != 448) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   221
	SHA1Update(context, (unsigned char *)"\0", 1);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   222
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
    SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   224
    for (i = 0; i < 20; i++) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   225
	digest[i] = (unsigned char)
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   226
	 ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
    /* Wipe variables */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
    i = j = 0;
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
    memset(context->buffer, 0, 64);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   231
    memset(context->state, 0, 20);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
    memset(context->count, 0, 8);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   233
    memset(&finalcount, 0, 8);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   234
#ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite it's own static vars */
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
    SHA1Transform(context->state, context->buffer);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   238
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   239
#if 0
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   240
/*************************************************************/
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   241
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   242
/*
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   243
 * SHA1 test program
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   244
 */
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   245
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   246
int main(int argc, char** argv)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   247
{
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   248
    int i, j;
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   249
    SHA1_CTX context;
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   250
    unsigned char digest[20], buffer[16384];
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   251
    FILE* file;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   252
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   253
    if (argc > 2) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   254
	puts("Public domain SHA-1 implementation - by Steve Reid <steve@edmweb.com>");
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   255
	puts("Produces the SHA-1 hash of a file, or stdin if no file is specified.");
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   256
	exit(0);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   257
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   258
    if (argc < 2) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   259
	file = stdin;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   260
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   261
    else {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   262
	if (!(file = fopen(argv[1], "rb"))) {
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   263
	    fputs("Unable to open file.", stderr);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   264
	    exit(-1);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   265
	}
9369
b7f43a51c4ed Moved SHA1Stream from exept:libcrypt to stx:libbasic
Stefan Vogel <sv@exept.de>
parents: 7824
diff changeset
   266
    }
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   267
    SHA1Init(&context);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   268
    while (!feof(file)) {  /* note: what if ferror(file) */
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   269
	i = fread(buffer, 1, 16384, file);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   270
	SHA1Update(&context, buffer, i);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   271
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   272
    SHA1Final(digest, &context);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   273
    fclose(file);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   274
    for (i = 0; i < 5; i++) {
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   275
	for (j = 0; j < 4; j++) {
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   276
	    printf("%02X", digest[i*4+j]);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   277
	}
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   278
	putchar(' ');
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   279
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   280
    putchar('\n');
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   281
    exit(0);
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   282
}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   283
#endif
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   284
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   285
%}
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   286
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   287
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   288
!SHA1Stream class methodsFor:'documentation'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   289
4426
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   290
copyright
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   291
"
15038
22f613e86520 class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15025
diff changeset
   292
 COPYRIGHT (c) 1999-2013 by eXept Software AG
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   293
	      All Rights Reserved
4426
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   294
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   295
 This software is furnished under a license and may be used
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   296
 only in accordance with the terms of that license and with the
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   297
 inclusion of the above copyright notice.   This software may not
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   298
 be provided or otherwise made available to, or used by, any
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   299
 other person.  No title to or ownership of the software is
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   300
 hereby transferred.
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   301
"
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   302
!
87994187176a documentation
Claus Gittinger <cg@exept.de>
parents: 4051
diff changeset
   303
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   304
documentation
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   305
"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
    Generate a SHA-1 hash value as defined in
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
    NIST, FIPS PUB 180-1: Secure Hash Standard, April 1995.
13933
b2c5cb0eebbd changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13930
diff changeset
   308
    This may be used as checksum or for generating cryptographic signatures.
b2c5cb0eebbd changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13930
diff changeset
   309
13935
0d7929973c93 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13934
diff changeset
   310
    Notice (2005):
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   311
	Be aware that SHA-1 is considered broken and may not be appropriate in some applications.
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   312
	Especially it should no longer be used for security stuff.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
12265
Claus Gittinger <cg@exept.de>
parents: 12257
diff changeset
   314
    performance: roughly
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   315
	  120400 Kb/s on a 2.5Ghz 64X2 Athlon 4800+ (64bit)
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   316
	   47400 Kb/s on a 2Ghz Duo (old measure)
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   317
	    9580 Kb/s on a 400Mhz PIII
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   318
	    3970 Kb/s on a 300Mhz Sparc
4916
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   319
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   320
    [author:]
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   321
	Stefan Vogel
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   322
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   323
    [see also:]
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   324
	MD5Stream
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   325
	SHA256Stream SHA512Stream (in libcrypt)
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   326
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   327
    [class variables:]
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   328
	HashSize        size of returned hash value
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   329
	ContextSize     (implementation) size of hash context
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   330
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   331
    [instance variables:]
15025
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   332
	hashContext     (implementation)
552103f2ae6e 64bit (mac) fix: long is not an int32 here
Claus Gittinger <cg@exept.de>
parents: 14791
diff changeset
   333
			internal buffer for computation of the hash value
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   334
"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   335
!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   336
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   337
examples
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   338
"
10781
322a34a50825 comments
Claus Gittinger <cg@exept.de>
parents: 9369
diff changeset
   339
    Test Vectors (from FIPS PUB 180-1); results are:
7824
7361f26d98cb code indentation
Claus Gittinger <cg@exept.de>
parents: 7045
diff changeset
   340
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   341
								[exBegin]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   342
    |hashStream|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   343
4798
9057c002734a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4797
diff changeset
   344
    hashStream := SHA1Stream new.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   345
    hashStream nextPut:'abc'.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   346
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   347
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   348
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   349
								[exEnd]
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   350
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   351
								[exBegin]
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   352
    |hashValue|
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   353
15038
22f613e86520 class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15025
diff changeset
   354
    hashValue := SHA1Stream hashValueOf:'abc'.
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   355
    hashValue printOn:Transcript base:16. Transcript cr.
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   356
								[exEnd]
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   357
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   358
								[exBegin]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   359
    |hashStream|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   360
4798
9057c002734a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4797
diff changeset
   361
    hashStream := SHA1Stream new.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   362
    hashStream nextPut:'abc' asByteArray.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   363
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   364
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq' asByteArray.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   365
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   366
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   367
								[exEnd]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   368
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   369
								[exBegin]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   370
    |hashStream|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   371
4798
9057c002734a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4797
diff changeset
   372
    hashStream := SHA1Stream new.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   373
    1000000 timesRepeat:[ hashStream nextPut:$a ].
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   374
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   375
								[exEnd]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   376
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   377
								[exBegin]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   378
    |hashStream|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   379
4798
9057c002734a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4797
diff changeset
   380
    hashStream := SHA1Stream new.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   381
    hashStream nextPut:'a'.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   382
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   383
								[exEnd]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   384
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   385
								[exBegin]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   386
    |hashStream|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   387
4798
9057c002734a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4797
diff changeset
   388
    hashStream := SHA1Stream new.
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   389
    hashStream nextPut:$a.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   390
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   391
								[exEnd]
4916
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   392
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   393
  timing throughput:
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   394
								[exBegin]
4916
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   395
    |hashStream n t|
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   396
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   397
    hashStream := SHA1Stream new.
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   398
    n := 1000000.
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   399
    t := Time millisecondsToRun:[
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   400
	    n timesRepeat:[
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   401
		hashStream nextPutAll:'12345678901234567890123456789012345678901234567890'.
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   402
	    ].
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   403
	 ].
4916
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   404
    t := (t / 1000) asFloat.
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   405
    Transcript show:t; show:' seconds for '; show:(50*n/1024) asFloat; showCR:' Kb'.
df965a3448b9 added throughput test example
Claus Gittinger <cg@exept.de>
parents: 4798
diff changeset
   406
    Transcript show:(n*50/1024 / t); showCR:' Kb/s'
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   407
								[exEnd]
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   408
"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   409
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   410
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   411
!SHA1Stream class methodsFor:'initialization'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   412
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   413
initialize
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   414
    |ctxSize|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   415
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   416
%{
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   417
    ctxSize = __MKSMALLINT(sizeof(SHA1_CTX));
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   418
%}.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   419
    ContextSize := ctxSize.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   420
    HashSize := 20.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   421
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   422
    "
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   423
	self initialize
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   424
    "
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   425
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   426
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   427
!SHA1Stream class methodsFor:'queries'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   428
15623
1c229b466d52 Rename #blockSize to #hashBlockSize
Stefan Vogel <sv@exept.de>
parents: 15038
diff changeset
   429
hashBlockSize
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   430
    "return the block size used internally by the compression function"
15907
b6a05f7d463f use int32 instead of long (for 64bit machines)
Claus Gittinger <cg@exept.de>
parents: 15623
diff changeset
   431
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   432
    ^ 64
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   433
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   434
    "Created: / 18.3.1999 / 08:37:10 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   435
!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   436
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   437
hashSize
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   438
    "return the size of the hashvalue returned by instances of this class"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   439
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   440
    ^ HashSize
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   441
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   442
    "Modified: / 18.3.1999 / 07:54:22 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   443
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   444
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   445
!SHA1Stream methodsFor:'initialization'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   446
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   447
initialize
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   448
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   449
    hashContext := ByteArray new:ContextSize.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   450
    self reset
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   451
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   452
    "Created: / 17.3.1999 / 16:11:37 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   453
    "Modified: / 18.3.1999 / 07:56:46 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   454
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   455
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   456
!SHA1Stream methodsFor:'positioning'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   457
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   458
reset
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   459
   "reset the stream in order to compute a new hash value"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   460
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   461
%{
14669
932dd50e11a7 code cleanup
Claus Gittinger <cg@exept.de>
parents: 14667
diff changeset
   462
   if (__isByteArray(__INST(hashContext)) &&
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   463
       __byteArraySize(__INST(hashContext)) == sizeof(SHA1_CTX)
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   464
   ) {
14667
f6a830b971f3 care for externalAddress being NULL before accessing an external buffer's contents
Claus Gittinger <cg@exept.de>
parents: 13935
diff changeset
   465
	SHA1_CTX *ctx = (SHA1_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   466
14667
f6a830b971f3 care for externalAddress being NULL before accessing an external buffer's contents
Claus Gittinger <cg@exept.de>
parents: 13935
diff changeset
   467
	SHA1Init(ctx);
f6a830b971f3 care for externalAddress being NULL before accessing an external buffer's contents
Claus Gittinger <cg@exept.de>
parents: 13935
diff changeset
   468
	RETURN(self);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   469
   }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   470
%}.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   471
   ^ self primitiveFailed
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   472
13930
7ae7e5793dd5 changed: #reset
Claus Gittinger <cg@exept.de>
parents: 13926
diff changeset
   473
    "Created: / 18-03-1999 / 07:59:02 / stefan"
7ae7e5793dd5 changed: #reset
Claus Gittinger <cg@exept.de>
parents: 13926
diff changeset
   474
    "Modified: / 12-01-2012 / 12:21:23 / cg"
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   475
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   476
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   477
!SHA1Stream methodsFor:'queries'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   478
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   479
hashValue
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   480
    "Get the value hashed so far.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   481
     The context is kept, so that more objects may be hashed after
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   482
     retrieving a hash value"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   483
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   484
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   485
    |digest|
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   486
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   487
    digest := ByteArray new:HashSize.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   488
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   489
%{
14791
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   490
    OBJ hcon;
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   491
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   492
    hcon = __INST(hashContext);
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   493
    if (__isByteArray(hcon) &&
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   494
	__byteArraySize(hcon) == sizeof(SHA1_CTX) &&
14669
932dd50e11a7 code cleanup
Claus Gittinger <cg@exept.de>
parents: 14667
diff changeset
   495
	__isByteArray(digest) &&
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   496
	__byteArraySize(digest) == 20
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   497
    ) {
14791
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   498
	SHA1_CTX *ctx = (SHA1_CTX *)(__ByteArrayInstPtr(hcon)->ba_element);
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   499
	SHA1_CTX copyContext;
14723
8657c48a4c03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14715
diff changeset
   500
14791
4bd37b3efdb2 int32 vs. long fix
Claus Gittinger <cg@exept.de>
parents: 14788
diff changeset
   501
	memcpy(&copyContext, ctx, sizeof(SHA1_CTX));
5056
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   502
	SHA1Final(__ByteArrayInstPtr(digest)->ba_element, &copyContext);
161b8aaf00eb Fix alignment in SHA1Stream"
Stefan Vogel <sv@exept.de>
parents: 4926
diff changeset
   503
	RETURN(digest);
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   504
    }
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   505
%}.
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   506
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   507
    ^ self primitiveFailed
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   508
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   509
    "Created: / 17.3.1999 / 16:13:12 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   510
    "Modified: / 18.3.1999 / 08:00:54 / stefan"
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   511
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   512
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   513
!SHA1Stream methodsFor:'writing'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   514
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   515
nextPutBytes:count from:anObject startingAt:start
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   516
    "update the hash value with count bytes from an object starting at index start.
9369
b7f43a51c4ed Moved SHA1Stream from exept:libcrypt to stx:libbasic
Stefan Vogel <sv@exept.de>
parents: 7824
diff changeset
   517
     The object must have non-pointer indexed instvars
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   518
     (i.e. be a ByteArray, String, Float- or DoubleArray),
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   519
     or an externalBytes object (with known size)"
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   520
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   521
%{
14667
f6a830b971f3 care for externalAddress being NULL before accessing an external buffer's contents
Claus Gittinger <cg@exept.de>
parents: 13935
diff changeset
   522
    INT len, offs;
f6a830b971f3 care for externalAddress being NULL before accessing an external buffer's contents
Claus Gittinger <cg@exept.de>
parents: 13935
diff changeset
   523
    INT objSize;
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   524
    int nInstBytes;
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   525
    char *extPtr;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   526
14669
932dd50e11a7 code cleanup
Claus Gittinger <cg@exept.de>
parents: 14667
diff changeset
   527
   if (__isByteArray(__INST(hashContext))
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   528
       && __byteArraySize(__INST(hashContext)) == sizeof(SHA1_CTX)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   529
       && __bothSmallInteger(count, start)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   530
   ) {
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   531
        SHA1_CTX *ctx = (SHA1_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   532
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   533
        len = __intVal(count);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   534
        offs = __intVal(start) - 1;
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   535
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   536
        if (__isExternalBytesLike(anObject)) {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   537
            OBJ sz;
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   538
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   539
            nInstBytes = 0;
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   540
            extPtr = (char *)__externalBytesAddress(anObject);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   541
            if (extPtr == NULL) goto bad;
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   542
            sz = __externalBytesSize(anObject);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   543
            if (__isSmallInteger(sz)) {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   544
                objSize = __intVal(sz);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   545
            } else {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   546
                objSize = 0; /* unknown */
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   547
            }
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   548
        } else {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   549
            OBJ oClass = __Class(anObject);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   550
            int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
14723
8657c48a4c03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14715
diff changeset
   551
16004
3d3da3b792a1 class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15998
diff changeset
   552
            nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   553
            switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   554
                case BYTEARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   555
                case WORDARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   556
                case LONGARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   557
                case SWORDARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   558
                case SLONGARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   559
                case FLOATARRAY:
15993
c5eea718b0ff class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15989
diff changeset
   560
                    break;
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   561
                case DOUBLEARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   562
#ifdef __NEED_DOUBLE_ALIGN
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   563
                    nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   564
#endif
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   565
                    break;
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   566
                case LONGLONGARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   567
                case SLONGLONGARRAY:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   568
#ifdef __NEED_LONGLONG_ALIGN
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   569
                    nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   570
#endif
15993
c5eea718b0ff class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15989
diff changeset
   571
                    break;
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   572
                default:
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   573
                    goto bad;
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   574
            }
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   575
            // nInstBytes is the number of bytes occupied by pointer instance variables
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   576
            // subtract from size and add to byte-pointer
16004
3d3da3b792a1 class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15998
diff changeset
   577
            objSize = __Size(anObject) - nInstBytes;
16009
94ef574411dc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 16004
diff changeset
   578
            extPtr = (char *)anObject + nInstBytes;
15989
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   579
        }
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   580
        if ((offs >= 0) && (len >= 0) && (objSize >= (len + offs))) {
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   581
            SHA1Update(ctx, extPtr+offs, (unsigned int)len);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   582
            RETURN (count);
824d113634fc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 15907
diff changeset
   583
        }
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   584
    }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   585
bad: ;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   586
%}.
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   587
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   588
    ^ self primitiveFailed
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   589
! !
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   590
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   591
!SHA1Stream class methodsFor:'documentation'!
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   592
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   593
version
16009
94ef574411dc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 16004
diff changeset
   594
    ^ '$Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.45 2014-02-12 15:25:24 stefan Exp $'
12205
89063d394d63 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10781
diff changeset
   595
!
89063d394d63 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10781
diff changeset
   596
89063d394d63 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10781
diff changeset
   597
version_CVS
16009
94ef574411dc class: SHA1Stream
Stefan Vogel <sv@exept.de>
parents: 16004
diff changeset
   598
    ^ '$Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.45 2014-02-12 15:25:24 stefan Exp $'
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   599
! !
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 6789
diff changeset
   600
14715
8a6c43a26ca1 class: SHA1Stream
Claus Gittinger <cg@exept.de>
parents: 14675
diff changeset
   601
4051
87de5a78e265 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   602
SHA1Stream initialize!