tMD5 and SHA1 in transliterated to x86 assembler with C preprocessor goo. Thanks to Brendan Connell for putting up with this nonsense. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ae12b879721b02b79a2a2457b36627d24147e74f
 (DIR) parent f928ea857169efbed374171240af4eb7901009de
 (HTM) Author: wkj <devnull@localhost>
       Date:   Wed, 21 Apr 2004 04:52:27 +0000
       
       MD5 and SHA1 in transliterated to x86 assembler with C preprocessor goo.
       Thanks to Brendan Connell for putting up with this nonsense.
       
       Diffstat:
         A src/libsec/386/md5block.s           |     241 +++++++++++++++++++++++++++++++
         A src/libsec/386/mkfile               |      16 ++++++++++++++++
         A src/libsec/386/sha1block.s          |     214 +++++++++++++++++++++++++++++++
         M src/libsec/mkfile                   |       2 --
       
       4 files changed, 471 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/libsec/386/md5block.s b/src/libsec/386/md5block.s
       t@@ -0,0 +1,241 @@
       +/*
       + *  rfc1321 requires that I include this.  The code is new.  The constants
       + *  all come from the rfc (hence the copyright).  We trade a table for the
       + *  macros in rfc.  The total size is a lot less. -- presotto
       + *
       + *        Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
       + *        rights reserved.
       + *
       + *        License to copy and use this software is granted provided that it
       + *        is identified as the "RSA Data Security, Inc. MD5 Message-Digest
       + *        Algorithm" in all material mentioning or referencing this software
       + *        or this function.
       + *
       + *        License is also granted to make and use derivative works provided
       + *        that such works are identified as "derived from the RSA Data
       + *        Security, Inc. MD5 Message-Digest Algorithm" in all material
       + *        mentioning or referencing the derived work.
       + *
       + *        RSA Data Security, Inc. makes no representations concerning either
       + *        the merchantability of this software or the suitability of this
       + *        software forany particular purpose. It is provided "as is"
       + *        without express or implied warranty of any kind.
       + *        These notices must be retained in any copies of any part of this
       + *        documentation and/or software.
       + */
       +#define S11 7
       +#define S12 12
       +#define S13 17
       +#define S14 22
       +
       +#define S21 5
       +#define S22 9
       +#define S23 14
       +#define S24 20
       +
       +#define S31 4
       +#define S32 11
       +#define S33 16
       +#define S34 23
       +
       +#define S41 6
       +#define S42 10
       +#define S43 15
       +#define S44 21
       +
       +#define PAYME(x) $##x
       +
       +/*
       + * SI is data
       + *        a += FN(B,C,D);
       + *        a += x[sh] + t[sh];
       + *        a = (a << S11) | (a >> (32 - S11));
       + *        a += b;
       + */
       +
       +#define BODY1(off,V,FN,SH,A,B,C,D)\
       +        FN(B,C,D)\
       +        leal V(A, %edi, 1), A;\
       +        addl off(%ebp), A;\
       +        roll PAYME(SH), A;\
       +        addl B, A;\
       +
       +#define BODY(off,V,FN,SH,A,B,C,D)\
       +        FN(B,C,D)\
       +        leal V(A, %edi, 1), A;\
       +        addl (off)(%ebp), A;\
       +        roll PAYME(SH), A;\
       +        addl B,A;\
       +
       +/*
       + * fn1 = ((c ^ d) & b) ^ d
       + */
       +#define FN1(B,C,D)\
       +        movl C, %edi;\
       +        xorl D, %edi;\
       +        andl B, %edi;\
       +        xorl D, %edi;\
       +
       +/*
       + * fn2 = ((b ^ c) & d) ^ c;
       + */
       +#define FN2(B,C,D)\
       +        movl B, %edi;\
       +        xorl C, %edi;\
       +        andl D, %edi;\
       +        xorl C, %edi;\
       +
       +/*
       + * fn3 = b ^ c ^ d;
       + */
       +#define FN3(B,C,D)\
       +        movl B, %edi;\
       +        xorl C, %edi;\
       +        xorl D, %edi;\
       +
       +/*
       + * fn4 = c ^ (b | ~d);
       + */
       +#define FN4(B,C,D)\
       +        movl D, %edi;\
       +        xorl $-1, %edi;\
       +        orl B, %edi;\
       +        xorl C, %edi;\
       +
       +#define        DATA        8
       +#define        LEN        12
       +#define        STATE        16
       +
       +#define EDATA        (-4)
       +#define OLDEBX        (-8)
       +#define OLDESI        (-12)
       +#define OLDEDI        (-16)
       +
       +        .text
       +
       +        .p2align 2,0x90
       +        .globl _md5block
       +                .type _md5block, @function
       +        _md5block:
       +
       +        /* Prelude */
       +        pushl %ebp
       +        movl %ebx, OLDEBX(%esp)
       +        movl %esi, OLDESI(%esp)
       +        movl %edi, OLDEDI(%esp)
       +
       +        movl        DATA(%esp), %eax
       +        addl        LEN(%esp), %eax
       +        movl        %eax, EDATA(%esp)
       +
       +        movl DATA(%esp), %ebp
       +
       +mainloop:
       +        movl STATE(%esp), %esi
       +        movl (%esi), %eax
       +        movl 4(%esi), %ebx
       +        movl 8(%esi), %ecx
       +        movl 12(%esi), %edx
       +
       +        BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx)
       +        BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx)
       +        BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx)
       +        BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax)
       +
       +        BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx)
       +        BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx)
       +        BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx)
       +        BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax)
       +
       +        BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx)
       +        BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx)
       +        BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx)
       +        BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax)
       +
       +        BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx)
       +        BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx)
       +        BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx)
       +        BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax)
       +
       +
       +        BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx)
       +        BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx)
       +        BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx)
       +        BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx)
       +        BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx)
       +        BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx)
       +        BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx)
       +        BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx)
       +        BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx)
       +        BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax)
       +
       +        BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx)
       +        BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx)
       +        BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx)
       +        BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax)
       +
       +
       +        BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx)
       +        BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx)
       +        BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx)
       +        BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx)
       +        BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx)
       +        BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx)
       +        BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax)
       +
       +        BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx)
       +        BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx)
       +        BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx)
       +        BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx)
       +        BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx)
       +        BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx)
       +        BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax)
       +
       +
       +        BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx)
       +        BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx)
       +        BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx)
       +        BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax)
       +
       +        BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx)
       +        BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx)
       +        BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx)
       +        BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx)
       +        BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx)
       +        BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx)
       +        BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax)
       +
       +        BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx)
       +        BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx)
       +        BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx)
       +        BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax)
       +
       +        addl $(16*4), %ebp
       +        movl STATE(%esp), %edi
       +        addl %eax,0(%edi)
       +        addl %ebx,4(%edi)
       +        addl %ecx,8(%edi)
       +        addl %edx,12(%edi)
       +
       +        movl EDATA(%esp), %edi
       +        cmpl %edi, %ebp
       +        jb mainloop
       +
       +        /* Postlude */
       +        movl OLDEBX(%esp), %ebx
       +        movl OLDESI(%esp), %esi
       +        movl OLDEDI(%esp), %edi
       +        movl %esp, %ebp
       +        leave
       +        ret
       +
 (DIR) diff --git a/src/libsec/386/mkfile b/src/libsec/386/mkfile
       t@@ -0,0 +1,16 @@
       +<$PLAN9/src/mkhdr
       +
       +LIB=libsec.a
       +SFILES=\
       +        md5block.s\
       +        sha1block.s\
       +
       +HFILES=$PLAN9/include/libsec.h
       +
       +OFILES=${SFILES:%.s=%.$O}
       +
       +UPDATE=mkfile\
       +        $HFILES\
       +        $SFILES\
       +
       +<$PLAN9/src/mksyslib
 (DIR) diff --git a/src/libsec/386/sha1block.s b/src/libsec/386/sha1block.s
       t@@ -0,0 +1,214 @@
       +.text
       +
       +.p2align 2,0x90
       +.globl _sha1block
       +        .type _sha1block, @function
       +_sha1block:
       +
       +/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
       + * wp[off] = x;
       + * x += A <<< 5;
       + * E += 0xca62c1d6 + x;
       + * x = FN(B,C,D);
       + * E += x;
       + * B >>> 2
       + */
       +#define BSWAPDI        BYTE $0x0f; BYTE $0xcf;
       +
       +#define BODY(off,FN,V,A,B,C,D,E)\
       +        movl (off-64)(%ebp), %edi;\
       +        xorl (off-56)(%ebp), %edi;\
       +        xorl (off-32)(%ebp), %edi;\
       +        xorl (off-12)(%ebp), %edi;\
       +        roll $1, %edi;\
       +        movl %edi, off(%ebp);\
       +        leal V(%edi, E, 1), E;\
       +        movl A, %edi;\
       +        roll $5, %edi;\
       +        addl %edi, E;\
       +        FN(B,C,D)\
       +        addl %edi, E;\
       +        rorl $2, B;\
       +
       +#define BODY0(off,FN,V,A,B,C,D,E)\
       +        movl off(%ebx), %edi;\
       +        bswap %edi;\
       +        movl %edi, off(%ebp);\
       +        leal V(%edi,E,1), E;\
       +        movl A, %edi;\
       +        roll $5,%edi;\
       +        addl %edi,E;\
       +        FN(B,C,D)\
       +        addl %edi,E;\
       +        rorl $2,B;\
       +
       +/*
       + * fn1 = (((C^D)&B)^D);
       + */
       +#define FN1(B,C,D)\
       +        movl C, %edi;\
       +        xorl D, %edi;\
       +        andl B, %edi;\
       +        xorl D, %edi;\
       +
       +/*
       + * fn24 = B ^ C ^ D
       + */
       +#define FN24(B,C,D)\
       +        movl B, %edi;\
       +        xorl C, %edi;\
       +        xorl D, %edi;\
       +
       +/*
       + * fn3 = ((B ^ C) & (D ^= B)) ^ B
       + * D ^= B to restore D
       + */
       +#define FN3(B,C,D)\
       +        movl B, %edi;\
       +        xorl C, %edi;\
       +        xorl B, D;\
       +        andl D, %edi;\
       +        xorl B, %edi;\
       +        xorl B, D;\
       +
       +/*
       + * stack offsets
       + * void sha1block(uchar *DATA, int LEN, ulong *STATE)
       + */
       +#define        DATA        8
       +#define        LEN        12
       +#define        STATE        16
       +
       +/*
       + * stack offsets for locals
       + * ulong w[80];
       + * uchar *edata;
       + * ulong *w15, *w40, *w60, *w80;
       + * register local
       + * ulong *wp = %ebp
       + * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
       + * ulong tmp = edi
       + */
       +#define WARRAY        (-4-(80*4))
       +#define TMP1        (-8-(80*4))
       +#define TMP2        (-12-(80*4))
       +#define W15        (-16-(80*4))
       +#define W40        (-20-(80*4))
       +#define W60        (-24-(80*4))
       +#define W80        (-28-(80*4))
       +#define EDATA        (-32-(80*4))
       +#define OLDEBX        (-36-(80*4))
       +#define OLDESI        (-40-(80*4))
       +#define OLDEDI        (-44-(80*4))
       +
       +        /* Prelude */
       +        pushl %ebp
       +        mov %ebx, OLDEBX(%esp)
       +        mov %esi, OLDESI(%esp)
       +        mov %edi, OLDEDI(%esp)
       +
       +        movl DATA(%esp), %eax
       +        addl LEN(%esp), %eax
       +        movl %eax, EDATA(%esp)
       +
       +        leal (WARRAY+15*4)(%esp), %edi        /* aw15 */
       +        movl %edi, W15(%esp)
       +        leal (WARRAY+40*4)(%esp), %edx        /* aw40 */
       +        movl %edx, W40(%esp)
       +        leal (WARRAY+60*4)(%esp), %ecx        /* aw60 */
       +        movl %ecx, W60(%esp)
       +        leal (WARRAY+80*4)(%esp), %edi        /* aw80 */
       +        movl %edi, W80(%esp)
       +
       +mainloop:
       +        leal WARRAY(%esp), %ebp                /* warray */
       +
       +        movl STATE(%esp), %edi                /* state */
       +        movl (%edi),%eax
       +        movl 4(%edi),%ebx
       +        movl %ebx, TMP1(%esp)                /* tmp1 */
       +        movl 8(%edi), %ecx
       +        movl 12(%edi), %edx
       +        movl 16(%edi), %esi
       +
       +        movl DATA(%esp), %ebx                /* data */
       +
       +loop1:
       +        BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
       +        movl %esi,TMP2(%esp)
       +        BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx)
       +        movl TMP1(%esp),%esi
       +        BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx)
       +        BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi)
       +        movl %esi,TMP1(%esp)
       +        BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax)
       +        movl TMP2(%esp),%esi
       +
       +        addl $20, %ebx
       +        addl $20, %ebp
       +        cmpl W15(%esp), %ebp        /* w15 */
       +        jb loop1
       +
       +        BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
       +        addl $4, %ebx
       +        MOVL %ebx, DATA(%esp)        /* data */
       +        MOVL TMP1(%esp),%ebx
       +
       +        BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx)
       +        BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx)
       +        BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx)
       +        BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax)
       +
       +        addl $20, %ebp
       +
       +loop2:
       +        BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi)
       +        BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx)
       +        BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx)
       +        BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx)
       +        BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax)
       +
       +        addl $20,%ebp
       +        cmpl W40(%esp), %ebp
       +        jb loop2
       +
       +loop3:
       +        BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi)
       +        BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx)
       +        BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx)
       +        BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx)
       +        BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax)
       +
       +        addl $20, %ebp
       +        cmpl W60(%esp), %ebp         /* w60 */
       +        jb loop3
       +
       +loop4:
       +        BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi)
       +        BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx)
       +        BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx)
       +        BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx)
       +        BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax)
       +
       +        addl $20, %ebp
       +        cmpl W80(%esp), %ebp         /* w80 */
       +        jb loop4
       +
       +        movl STATE(%esp), %edi        /* state */
       +        addl %eax, 0(%edi)
       +        addl %ebx, 4(%edi)
       +        addl %ecx, 8(%edi)
       +        addl %edx, 12(%edi)
       +        addl %esi, 16(%edi)
       +
       +        movl EDATA(%esp), %edi        /* edata */
       +        cmpl %edi, DATA(%esp)        /* data */
       +        jb mainloop
       +
       +        /* Postlude */
       +        mov OLDEBX(%esp), %ebx
       +        mov OLDESI(%esp), %esi
       +        mov OLDEDI(%esp), %edi
       +        movl %esp, %ebp
       +        leave
       +        ret
 (DIR) diff --git a/src/libsec/mkfile b/src/libsec/mkfile
       t@@ -1,9 +1,7 @@
        <$PLAN9/src/mkhdr
        
        DIRS=\
       -#        fmt\
                port\
       -#        unix\
        #        $systype-$objtype\
        
        <$PLAN9/src/mkdirs