eXept Software AG Logo

Smalltalk/X Webserver

Documentation of class 'MD5Stream':

Home

Documentation
www.exept.de
Everywhere
for:
[back]

Class: MD5Stream


Inheritance:

   Object
   |
   +--Stream
      |
      +--HashStream
         |
         +--MD5Stream

Package:
stx:libbasic
Category:
System-Crypt-Hashing
Version:
rev: 1.33 date: 2016/12/20 21:35:50
user: cg
file: MD5Stream.st directory: libbasic
module: stx stc-classLibrary: libbasic
Author:
Stefan Vogel

Description:


Generate a MD5 hash value as defined in RFC 1321.
This may be used as checksum or for generating cryptographic signatures.

Note:
    in August 2004, some researchers have found a way to generate full collisions for MD5.
    Therefore, for new applications, it may be wise to choose another hash function for security stuff.
    See a hash-collision example in the examples method.

    So, the MD5 algorithm has severe weaknesses, for example it is easy to compute two messages yielding
    the same hash (collision attack).
    The use of this algorithm is only justified for non-cryptographic application.


performance: roughly
                      150 Mb/s on a 2007 MAC Powerbook (2.6Ghz I7-Duo)
                   104000 Kb/s on a 2.5Ghz 64X2 Athlon 4800+ (64bit)
                    80000 Kb/s on a 2Ghz Duo
                    27200 Kb/s on a 1.2Ghz Athlon
                    12600 Kb/s on a 400Mhz PIII
                     9150 Kb/s on a 300Mhz Sparc.
    performance is almost completely limited by the speed of the md5-routine, which is the reference
    implementation in C from md5lib.


[references:]
    * Ronald L. Rivest, http://www.roxen.com/rfc/rfc1321.html
      ''The MD5 Message-Digest Algorithm'', IETF RFC-1321 (informational).
    * Bruce Schneier, Section 18.5 MD5, ''Applied Cryptography, 2nd edition'', John Wiley & Sons, 1996


[class variables:]
    HashSize        size of returned hash value
    ContextSize     (implementation) size of hash context

[instance variables:]
    hashContext     (implementation)
                    internal buffer for computation of the hash value


Related information:

    SHA1Stream
    SHA256Stream
    SHA512Stream
    (in
    libcrypt)

Class protocol:

initialization
o  initialize
self initialize

queries
o  hashBlockSize
return the block size used internally by the compression function

o  hashSize
return the size of the hashvalue returned by instances of this class


Instance protocol:

initialization
o  initialize
(comment from inherited method)
just to ignore initialize to objects which do not need it

positioning
o  reset
reset the stream in order to compute a new hash value

queries
o  hashValue
Get the value hashed so far.
The context is kept, so that more objects may be hashed after
retrieving a hash value

writing
o  nextPutBytes: count from: anObject startingAt: start
update the hash value with count bytes from an object starting at index start.
The object must have non-pointer indexed instvars
(i.e. be a ByteArray, String, Float- or DoubleArray),
or an externalBytes object (with known size)


Examples:


    Test Vectors (from FIPS PUB 180-1); results are:

    'abc'
    -> #[90 1 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72]

    'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'
    -> #[82 15 EF 7 96 A2 B CA AA E1 16 D3 87 6C 66 4A]

    A million repetitions of 'a'
    -> #[77 7 D6 AE 4E 2 7C 70 EE A2 A9 35 C2 29 6F 21]
     Transcript showCR:(MD5Stream hashValueOf:'abc') hexPrintString
     (MD5Stream hashValueOf:'abc')
        printOn:Transcript base:16.
     Transcript cr.
     (MD5Stream hashValueOfStream:('abc' readStream))
            printOn:Transcript base:16.
     Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:'abc'.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:'a' asByteArray.
    hashStream nextPut:'bc' asByteArray.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    hashStream nextPut:'dbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq' asByteArray.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    1000000 timesRepeat:[ hashStream nextPut:$a ].
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:'a'.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:$a.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:'abc'.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    hashStream reset.
    hashStream nextPut:'abc'.
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
a collision:
    |hashStream|

    hashStream := MD5Stream new.
    hashStream nextPut:(ByteArray fromHexStringWithSeparators:'
d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89
55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70').
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
    hashStream reset.

    hashStream nextPut:(ByteArray fromHexStringWithSeparators:'
d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70').
    hashStream hashValue printOn:Transcript base:16. Transcript cr.
timing throughput:
    |hashStream n t|

    hashStream := MD5Stream new.
    n := 1000000.
    t := Time millisecondsToRun:[
            n timesRepeat:[
                hashStream nextPutAll:'12345678901234567890123456789012345678901234567890'.
            ].
         ].
    t := (t / 1000) asFloat.
    Transcript show:t; show:' seconds for '; show:(50*n/1024) asFloat; showCR:' Kb'.
    Transcript show:(n*50/1024 / t); showCR:' Kb/s'


ST/X 7.1.0.0; WebServer 1.663 at exept.de:8081; Wed, 19 Sep 2018 03:42:26 GMT