MD5Stream.st
author Claus Gittinger <cg@exept.de>
Mon, 12 Oct 2009 19:26:08 +0200
changeset 12213 73371949b807
parent 12204 e95118ee583f
child 12256 5d87f49ba760
permissions -rw-r--r--
overwrittenExtensionMethods handling
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1999 by eXept Software AG
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
	      All Rights Reserved
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    12
"{ Package: 'stx:libbasic' }"
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    13
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
HashStream subclass:#MD5Stream
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'hashContext'
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:'HashSize ContextSize'
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'System-Crypt-Streams'
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!MD5Stream primitiveDefinitions!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
%{
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
/*
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 * includes, defines, structure definitions
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
 * and typedefs come here.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 */
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
#include "md5.h"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
%}
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
!MD5Stream class methodsFor:'documentation'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
copyright
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
 COPYRIGHT (c) 1999 by eXept Software AG
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
	      All Rights Reserved
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
 This software is furnished under a license and may be used
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
 only in accordance with the terms of that license and with the
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 inclusion of the above copyright notice.   This software may not
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
 be provided or otherwise made available to, or used by, any
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
 other person.  No title to or ownership of the software is
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
 hereby transferred.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
documentation
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    Generate a MD5 hash value as defined in RFC 1321.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    This may be used as checksum
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    or for generating cryptographic signatures.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    performance: roughly 
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    59
                        80000 Kb/s on a 2Ghz Duo
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    60
                        27200 Kb/s on a 1.2Ghz Athlon
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    61
                        12600 Kb/s on a 400Mhz PIII
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    62
                         9150 Kb/s on a 300Mhz Sparc.
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    [author:]
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    64
        Stefan Vogel
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    [see also:]
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    67
        SHA1Stream
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    [class variables:]
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    70
        HashSize        size of returned hash value
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    71
        ContextSize     (implementation) size of hash context
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    [instance variables:]
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    74
        hashContext     (implementation) 
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
    75
                        internal buffer for computation of the hash value
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
examples
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
"
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    81
                                                                [exBegin]
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    82
    Test Vectors (from FIPS PUB 180-1); results are:
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    83
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    84
    'abc'
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    85
    -> #[90 1 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    87
    'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    88
    -> #[82 15 EF 7 96 A2 B CA AA E1 16 D3 87 6C 66 4A]
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    89
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    90
    A million repetitions of 'a'
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    91
    -> #[77 7 D6 AE 4E 2 7C 70 EE A2 A9 35 C2 29 6F 21]
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    92
                                                                [exEnd]
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    93
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    95
                                                                [exBegin]
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    96
     (MD5Stream hashValueOf:'abc') 
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    97
        printOn:Transcript base:16. 
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    98
     Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
    99
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   101
                                                                [exBegin]
10782
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   102
     (MD5Stream hashValueOfStream:('abc' readStream)) 
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   103
            printOn:Transcript base:16. 
0eb9a61f1e32 comments
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   104
     Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   105
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   107
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    hashStream nextPut:'abc'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   115
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   117
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    hashStream := MD5Stream new.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   121
    hashStream nextPut:'a' asByteArray.
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   122
    hashStream nextPut:'bc' asByteArray.
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq' asByteArray.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   126
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   128
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    1000000 timesRepeat:[ hashStream nextPut:$a ].
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   134
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   136
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    hashStream nextPut:'a'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   142
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   144
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    hashStream nextPut:$a.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   150
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   152
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    |hashStream|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    hashStream nextPut:'abc'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
    hashStream reset.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    hashStream nextPut:'abc'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   161
                                                                [exEnd]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
  timing throughput:
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   164
                                                                [exBegin]
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    |hashStream n t|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    hashStream := MD5Stream new.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    n := 1000000.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    t := Time millisecondsToRun:[
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   170
            n timesRepeat:[
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   171
                hashStream nextPutAll:'12345678901234567890123456789012345678901234567890'.
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   172
            ].
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   173
         ].
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    t := (t / 1000) asFloat.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
    Transcript show:t; show:' seconds for '; show:(50*n/1024) asFloat; showCR:' Kb'.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
    Transcript show:(n*50/1024 / t); showCR:' Kb/s'
7041
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   177
                                                                [exEnd]
1c0516e1f72d add testVektors
penk
parents: 6864
diff changeset
   178
"
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
!MD5Stream class methodsFor:'initialization'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
initialize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    |ctxSize|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
%{
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 7197
diff changeset
   187
    ctxSize = __mkSmallInteger(sizeof(MD5_CTX));
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
%}.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    ContextSize := ctxSize.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    HashSize := 16.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    "
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
	self initialize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    "
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
!MD5Stream class methodsFor:'queries'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
blockSize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    "return the block size used internally by the compression function"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    ^ 64
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    "Created: / 18.3.1999 / 08:36:44 / stefan"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
hashSize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    "return the size of the hashvalue returned by instances of this class"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    ^ HashSize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    "Created: / 18.3.1999 / 08:02:16 / stefan"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   218
!MD5Stream class methodsFor:'testing'!
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   219
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   220
testVector
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   221
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   222
    ^ #( 
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   223
            ('abc'
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   224
              #[16r90 16r01 16r50 16r98 16r3C 16rD2 16r4F 16rB0 16rD6 16r96 16r3F 16r7D 16r28 16rE1 16r7F 16r72])
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   225
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   226
            ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   227
             #[16r82 16r15 16rEF 16r07 16r96 16rA2 16r0B 16rCA 16rAA 16rE1 16r16 16rD3 16r87 16r6C 16r66 16r4A])
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   228
        ) copyWith: 
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   229
        (Array with:(String new:1000000 withAll:$a)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   230
               with:#[16r77 16r07 16rD6 16rAE 16r4E 16r02 16r7C 16r70 16rEE 16rA2 16rA9 16r35 16rC2 16r29 16r6F 16r21])
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   231
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   232
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   233
    "
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   234
      self test
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   235
    "
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   236
! !
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   237
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
!MD5Stream methodsFor:'initialization'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
initialize
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    hashContext := ByteArray new:ContextSize.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    self reset.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    "Modified: / 18.3.1999 / 08:03:42 / stefan"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
!MD5Stream methodsFor:'positioning'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
reset
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
   "reset the stream in order to compute a new hash value"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
%{
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
   if (__isNonNilObject(__INST(hashContext)) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
       __qClass(__INST(hashContext)) == @global(ByteArray) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
       __byteArraySize(__INST(hashContext)) == sizeof(MD5_CTX)
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
   ) {
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
	MD5_CTX *ctx = 
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
	    (MD5_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	MD5Init(ctx);
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
	RETURN(self);
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
   }
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
%}.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
   ^ self primitiveFailed
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
!MD5Stream methodsFor:'queries'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
hashValue
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    "Get the value hashed so far.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
     The context is kept, so that more objects may be hashed after
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
     retrieving a hash value"
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    |digest|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    digest := ByteArray new:HashSize.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
%{
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    if (__isNonNilObject(__INST(hashContext)) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
	__qClass(__INST(hashContext)) == @global(ByteArray) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
	__byteArraySize(__INST(hashContext)) == sizeof(MD5_CTX) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
	__isNonNilObject(digest) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
	__qClass(digest) == @global(ByteArray) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
	__byteArraySize(digest) == 16
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    ) {
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
	MD5_CTX *ctx = 
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
	    (MD5_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
	MD5_CTX copyContext;
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
	memcpy(&copyContext, ctx, sizeof(copyContext));
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
	MD5Final(__ByteArrayInstPtr(digest)->ba_element, &copyContext);
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
	RETURN(digest);
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    }
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
%}.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    ^ self primitiveFailed     
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
!MD5Stream methodsFor:'writing'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
nextPut:anObject
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
  "update our hash value for anObject.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
   anObject may be a String, a Character, a Smallinteger or an Array of primitive
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   309
   types like ByteArray"
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
  |ret|
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
%{
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
   if (__isNonNilObject(__INST(hashContext)) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
       __qClass(__INST(hashContext)) == @global(ByteArray) &&
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
       __byteArraySize(__INST(hashContext)) == sizeof(MD5_CTX)
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
   ) {
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   318
        MD5_CTX *ctx = 
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   319
            (MD5_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   321
        if (__isNonNilObject(anObject)) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   322
            OBJ cls =__qClass(anObject);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   323
            INT mask = (INT)(__ClassInstPtr(cls)->c_flags) & __MASKSMALLINT(ARRAYMASK);
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   325
            if (cls == @global(String) || cls == @global(Symbol)) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   326
                /* String: omit leading '\0' */
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   328
                MD5Update(ctx, __StringInstPtr(anObject)->s_element, __stringSize(anObject));
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   329
            } else if (mask != __MASKSMALLINT(POINTERARRAY) &&
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   330
                mask != __MASKSMALLINT(WKPOINTERARRAY) &&
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   331
                mask != __MASKSMALLINT(0)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   332
            ) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   333
                /* Byte|Integer|.... Array */
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   335
                register int n;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   336
                char *pFirst;
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   338
                n /* nInstVars */  = __intVal(__ClassInstPtr(cls)->c_ninstvars);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   339
                n /* nInstBytes */ = OHDR_SIZE + __OBJS2BYTES__(n /* nInstVars */);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   340
                pFirst = (char *)(__InstPtr(anObject)) + n /* nInstBytes */;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   341
                n /* nbytes */     = __qSize(anObject) - n /* nInstBytes */;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   342
                MD5Update(ctx, pFirst, n);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   343
            } else if (cls == @global(Character)) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   344
                /* Character */
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
        
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   346
                INT val = __intVal(_characterVal(anObject));
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   347
                if (val > 255) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   348
                    /* Two byte character */
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   349
                    short s = val;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   350
                    MD5Update(ctx, &s, 2);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   351
                } else {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   352
                    char c = val;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   353
                    MD5Update(ctx, &c, 1);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   354
                }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   355
            } else {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   356
                ret = false;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   357
            }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   358
        } else {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   359
            if (anObject == nil) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   360
                ret = false;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   361
            } else {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   362
                /* SmallInteger */
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
                
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   364
                INT i = __intVal(anObject);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   365
                MD5Update(ctx, &i, sizeof(INT));
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   366
            }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   367
        }
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    }
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
%}.
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    ret notNil ifTrue:[
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   372
        ^ self primitiveFailed
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    ].
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
                
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
    "Created: 22.10.1996 / 21:53:24 / stefan"
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   377
!
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   378
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   379
nextPutBytes:count from:anObject startingAt:start
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   380
    "update the hash value with count bytes from an object starting at index start.
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   381
     The object must have non-pointer indexed instvars 
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   382
     (i.e. be a ByteArray, String, Float- or DoubleArray),
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   383
     or an externalBytes object (with known size)"
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   384
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   385
%{
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   386
    int len, offs;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   387
    int objSize, nInstVars, nInstBytes;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   388
    char *extPtr;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   389
7197
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   390
    if (__isNonNilObject(__INST(hashContext))
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   391
       &&__qClass(__INST(hashContext)) == @global(ByteArray)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   392
       &&__byteArraySize(__INST(hashContext)) == sizeof(MD5_CTX)
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   393
       && __bothSmallInteger(count, start)
7197
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   394
    ) {
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   395
        MD5_CTX *ctx = 
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   396
            (MD5_CTX *)__ByteArrayInstPtr(__INST(hashContext))->ba_element;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   397
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   398
        len = __intVal(count);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   399
        offs = __intVal(start) - 1;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   400
7197
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   401
        if (__isExternalBytesLike(anObject)) {
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   402
            OBJ sz;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   403
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   404
            nInstBytes = 0;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   405
            extPtr = (char *)__externalBytesAddress(anObject);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   406
            sz = __externalBytesSize(anObject);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   407
            if (__isSmallInteger(sz)) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   408
                objSize = __intVal(sz);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   409
            } else {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   410
                objSize = 0; /* unknown */
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   411
            }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   412
        } else {
7197
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   413
            OBJ oClass;
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   414
a68adb223592 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7042
diff changeset
   415
            oClass = __Class(anObject);
7042
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   416
            switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   417
                case BYTEARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   418
                case WORDARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   419
                case LONGARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   420
                case SWORDARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   421
                case SLONGARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   422
                case FLOATARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   423
                case DOUBLEARRAY:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   424
                    break;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   425
                default:
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   426
                    goto bad;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   427
            }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   428
            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   429
            nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   430
            objSize = __Size(anObject) - nInstBytes;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   431
            extPtr = (char *)__byteArrayVal(anObject);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   432
        }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   433
        if ((offs >= 0) && (len >= 0) && (objSize >= (len + offs))) {
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   434
            MD5Update(ctx, extPtr+offs, len);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   435
            RETURN (count);
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   436
        }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   437
    }
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   438
bad: ;
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   439
%}.
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   440
dbb7898901e3 Fix #hashValueOf:
Stefan Vogel <sv@exept.de>
parents: 7041
diff changeset
   441
    ^ self primitiveFailed
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
!MD5Stream class methodsFor:'documentation'!
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
version
12204
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
   447
    ^ '$Header: /cvs/stx/stx/libbasic/MD5Stream.st,v 1.8 2009-10-10 20:47:02 cg Exp $'
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
   448
!
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
   449
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
   450
version_CVS
e95118ee583f changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 10783
diff changeset
   451
    ^ '$Header: /cvs/stx/stx/libbasic/MD5Stream.st,v 1.8 2009-10-10 20:47:02 cg Exp $'
6864
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
! !
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
0d5bd7218853 MD5 stuff now in base system
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
MD5Stream initialize!