A2osX/LIB/LIBCRYPT.S.txt
2021-06-30 11:33:18 -07:00

935 lines
19 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF lib/libcrypt
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/libcrypt.i
*--------------------------------------
.DUMMY
.OR ZPLIB
ZS.START
ZPCtxPtr .BS 2
ZPDataPtr .BS 2
ZPHashPtr .BS 2
ZPChunkLen .BS 2
* MD.MODE .BS 1 32 BYTES MAX !!!!!
MD4.ABCD
MD5.ABCD
MD4.A
MD5.A .BS 4 Chunk Level,A,B,C,D
MD4.B
MD5.B .BS 4
MD4.C
MD5.C .BS 4
MD4.D
MD5.D .BS 4
MD4.F1
MD5.F1 .BS 4
MD4.F2
MD5.F2 .BS 4
ZS.END .ED
*--------------------------------------
* DWORD Macros : Do NOT disturb carry with cpx, cpy...
*--------------------------------------
.MA ADC32
ldy #3
ldx #0
clc
:1 lda ]1,x
adc ]2,x
sta ]3,x
inx
dey
bpl :1
.EM
*--------------------------------------
.MA AND32
ldx #3
:1 lda ]1,x
and ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA ORA32
ldx #3
:1 lda ]1,x
ora ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA EOR32
ldx #3
:1 lda ]1,x
eor ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA NOT32
ldx #3
:1 lda ]1,x
eor #$FF
sta ]2,x
dex
bpl :1
.EM
*--------------------------------------
.MA MOV32
ldx #3
:1 lda ]1,x
sta ]2,x
dex
bpl :1
.EM
*--------------------------------------
.MA ROL32x
:2 lda ]1+3
rol
rol ]1
rol ]1+1
rol ]1+2
rol ]1+3
dex
bne :2
.EM
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START
.DA 0
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA MD4
.DA MD4Init
.DA MD4Update
.DA MD4Finalize
.DA MD5
.DA MD5Init
.DA MD5Update
.DA HMACMD5
*--------------------------------------
J.MD4.XXXX .DA MD4.0015
.DA MD4.1631
.DA MD4.3247
J.MD5.XXXX .DA MD5.0015
.DA MD5.1631
.DA MD5.3247
.DA MD5.4863
L.HMACMD5.IPAD .DA HMACMD5.IPAD
L.HMACMD5.OPAD .DA HMACMD5.OPAD
.DA 0
*--------------------------------------
LIB.LOAD
LIB.UNLOAD clc
rts
*/--------------------------------------
* ## MD4
* Return MD4 Hash for input String
* # C
* `void MD4 (const char* str, char* digest);`
* # ASM
* `>PUSHW str`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD4`
* ## RETURN VALUE
* CC
*\--------------------------------------
MD4 lda #0
.HS 2C BIT ABS
*/--------------------------------------
* ## MD5
* Return MD5 Hash for input String
* # C
* `void MD5 (const char* str, char* digest);`
* # ASM
* `>PUSHW str`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5`
* ## RETURN VALUE
* CC
*\--------------------------------------
MD5 lda #1
sta MD.MODE
>PULLW ZPHashPtr
>PULLYA
>STYA ZPDataPtr
>SYSCALL2 strlen
>STYA ZPDataLen
.1 jsr MD4Init.I
bcs .9
pha save MD4/MD5 Context hMem
lda MD.MODE
bne .2
jsr MD4Update.I
bra .3
.2 jsr MD5Update.I
.3 jsr MD4Finalize.I
pla
>SYSCALL2 FreeMem Free MD4/MD5 Context
clc
.9 rts
*/--------------------------------------
* ## MD4Init
* Initialize a MD4 computation
* # C
* `hMD4 MD4init();`
* # ASM
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD4Init`
* ## RETURN VALUE
* A = hMem To S.MD4
*\--------------------------------------
MD4Init lda #0
.HS 2C BIT ABS
*/--------------------------------------
* ## MD5Init
* Initialize a MD5 computation
* # C
* `hMD5 MD5init();`
* # ASM
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Init`
* ## RETURN VALUE
* A = hMem To S.MD5
*\--------------------------------------
MD5Init lda #1
sta MD.MODE
MD4Init.I
MD5Init.I >LDYAI S.MD4
>SYSCALL2 getmem
bcs .9
>STYA ZPCtxPtr
ldy #0
.1 lda MD4.ABCDINIT,y
sta (ZPCtxPtr),y
iny
cpy #S.MD4.BITCOUNT
bne .1
lda #0
.2 sta (ZPCtxPtr),y
iny
cpy #S.MD4 Includes S.MD4/5.FINALIZED Flag
bne .2
txa
clc
.9 rts
*/--------------------------------------
* ## MD4Update
* Add Data to MD4 computation
* # C
* `void MD4update (hMD4 MD4, char* data, int len);`
* # ASM
* `>PUSHB MD4`
* `>PUSHW data`
* `>PUSHW len`
* `>hLIBCRYPT,LIBCRYPT.MD4Update`
* ## RETURN VALUE
*\--------------------------------------
*/--------------------------------------
* ## MD5Update
* Add Data to MD5 computation
* # C
* `void MD5update (hMD5 MD5, char* data, int len);`
* # ASM
* `>PUSHB MD5`
* `>PUSHW data`
* `>PUSHW len`
* `>hLIBCRYPT,LIBCRYPT.MD5Update`
* ## RETURN VALUE
*\--------------------------------------
MD4Update
MD5Update >PULLW ZPDataLen get LEN
>PULLW ZPDataPtr get DATA
>PULLA
>SYSCALL2 GetMemPtr get MD5 Context
>STYA ZPCtxPtr
MD4Update.I
MD5Update.I ldy #S.MD4.FINALIZED
lda (ZPCtxPtr),y
beq .1
sec
rts
.1 lda ZPDataLen+1 More than 256 Bytes remaining to hash ?
bne .3 yes
lda ZPDataLen
bne .2 Len = O ?
clc All data processed
rts
.2 cmp #64 More than 64 Bytes remaining to hash ?
bcc .50 yes
.3 lda #64
.50 sta ZPChunkLen Save Chunk Len
jsr MD4UpdateBitCount
ldy #0
.51 lda (ZPDataPtr),y Load Buffer with data
sta MD4.BUFFER64,y
iny
cpy ZPChunkLen
bne .51
cpy #64 Full 64 Bytes DATA ?
beq .58
* Append "$80" & Padding & original size
lda #$80 no, Append $80
.52 sta MD5.BUFFER64,y
asl
* lda #0
iny Pad with 0 to 64
cpy #64
bcc .52
ldy #S.MD4.EXTRABIT Mark MD5 Context as Appended
ror
* lda #$80
sta (ZPCtxPtr),y
lda ZPChunkLen
cmp #56 Enough room for BITCOUNT ?
bcs .58 no
jsr MD4AppendBitCount
.58 lda MD.MODE
bne .59
jsr MD4Transform
bra .60
.59 jsr MD5Transform
.60 jsr MD4UpdateABCD0
.8 lda ZPDataLen Substract Bytes processed from LEN
sec
sbc ZPChunkLen get back chunk Len
sta ZPDataLen
bcs .81
dec ZPDataLen+1
.81 lda ZPDataPtr Add Bytes processed to DATA
clc
adc ZPChunkLen
sta ZPDataPtr
bcc .1
inc ZPDataPtr+1
bra .1
*/--------------------------------------
* ## MD4Finalize
* # C
* `void MD4finalize (hMD4 MD4, char* digest);`
* # ASM
* `>PUSHB MD4`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD4Finalize`
* ## RETURN VALUE
*\--------------------------------------
*/--------------------------------------
* ## MD5Finalize
* # C
* `void MD5finalize (hMD5 MD5, char* digest);`
* # ASM
* `>PUSHB MD5`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Finalize`
* ## RETURN VALUE
*\--------------------------------------
MD4Finalize
MD5Finalize >PULLW ZPHashPtr
>PULLA
pha
>SYSCALL2 GetMemPtr
>STYA ZPCtxPtr get MD5 Context
jsr MD4Finalize.I
pla
>SYSCALL2 FreeMem
rts
MD4Finalize.I
MD5Finalize.I ldy #S.MD4.FINALIZED
lda (ZPCtxPtr),y
bne .11
jsr MD4ExtraChunk
.11 ldy #S.MD4.ABCD0
.1 lda (ZPCtxPtr),y
lsr
lsr
lsr
lsr
tax
lda MD4.DIGITS,x
sta (ZPHashPtr)
inc ZPHashPtr
bne .2
inc ZPHashPtr+1
.2 lda (ZPCtxPtr),y
and #$0F
tax
lda MD4.DIGITS,x
sta (ZPHashPtr)
inc ZPHashPtr
bne .3
inc ZPHashPtr+1
.3 iny
cpy #S.MD4.ABCD0+16
bne .1
lda #0
sta (ZPHashPtr)
clc
.9 rts
*/--------------------------------------
* ## HMACMD5
* Return HMACMD5 Hash for input String
* # C
* `void HMACMD5(const char* str, const char* key, char* digest);`
* # ASM
* `>PUSHW str`
* `>PUSHW key`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.HMACMD5`
* ## RETURN VALUE
* CC
*\--------------------------------------
* https://github.com/fab13n/org.eclipse.mihini/blob/master/libs/hmac-md5/hmac_rfc2104/hmac-md5.c
*--------------------------------------
HMACMD5
>PULLW ZPHashPtr
>PULLW ZPDataPtr
>PULLW HMAC.DTemp
.1 >LDYA ZPDataPtr
>SYSCALL2 strlen
>STYA ZPDataLen
cpy #65
bcs .2
tay
beq .4
.2 jsr MD5Init
bcc .3
rts
.3 >PUSHW ZPHashPtr
jsr MD5Update.I
jsr MD5Finalize.I
>PULLW ZPHashPtr
>LDYA ZPCtxPtr
>STYA ZPDataPtr
lda #16
sta ZPDataLen
.4 ldy #0
.5 lda #$36
cpy ZPDataLen
bcs .6
eor (ZPDataPtr),y
.6 sta HMACMD5.IPAD,y
eor #$6A #$36 eor #$5C
sta HMACMD5.OPAD,y
iny
cpy #64
bne .5
stz HMACMD5.IPAD+64
stz HMACMD5.OPAD+64
jsr MD5Init
bcc .7
rts
.7 >LDYA L.HMACMD5.IPAD
>STYA ZPDataPtr
>LDYAI 64
>STYA ZPDataLen
>PUSHW ZPHashPtr
jsr MD5Update.I
>LDYA HMAC.DTemp
>STYA ZPDataPtr
>SYSCALL2 strlen
>STYA ZPDataLen
jsr MD5Update.I
jsr MD5Finalize.I
>PULLW ZPHashPtr
ldy #S.MD5.ABCD0
.8 lda (ZPCtxPtr),y
sta HMACMD5.IPAD,y
iny
cpy #S.MD5.ABCD0+16
bne .8
jsr MD5Init.I
bcc .9
rts
.9 >LDYA L.HMACMD5.OPAD
>STYA ZPDataPtr
>LDYAI 64
>STYA ZPDataLen
jsr MD5Update.I
>LDYA L.HMACMD5.IPAD
>STYA ZPDataPtr
ldy #16
sty ZPDataLen
jsr MD5Update.I
jsr MD5Finalize.I
rts
*--------------------------------------
* https://waterjuiceweb.wordpress.com/aes/
*--------------------------------------
* PRIVATE
*--------------------------------------
* MD4AppendBitCount
* In :
* ZPCtxPtr = MD4 Context
*--------------------------------------
* MD5AppendBitCount
* In :
* ZPCtxPtr = MD5 Context
*--------------------------------------
MD4AppendBitCount
MD5AppendBitCount
ldx #56
ldy #S.MD4.BITCOUNT Append 8 Bytes of BITCOUNT
.1 lda (ZPCtxPtr),y
sta MD4.BUFFER64,x
inx
iny
cpy #S.MD4.BITCOUNT+8
bne .1
ldy #S.MD4.FINALIZED Mark MD5 Context as Finalized
lda #$80
sta (ZPCtxPtr),y
rts
*--------------------------------------
* MD4UpdateBitCount
* In :
* CL = Size (in bytes) to add to MD4 context
* ZPCtxPtr = MD4 Context
*--------------------------------------
*--------------------------------------
* MD5UpdateBitCount
* In :
* CL = Size (in bytes) to add to MD5 context
* ZPCtxPtr = MD5 Context
*--------------------------------------
MD4UpdateBitCount
MD5UpdateBitCount
stz ZPChunkLen+1
lda ZPChunkLen
asl
rol ZPChunkLen+1
asl times 8 to get bit count
rol ZPChunkLen+1
asl
rol ZPChunkLen+1
clc
ldy #S.MD4.BITCOUNT
adc (ZPCtxPtr),y
sta (ZPCtxPtr),y
iny
lda ZPChunkLen+1
adc (ZPCtxPtr),y
sta (ZPCtxPtr),y
bcc .8
.1 iny
lda (ZPCtxPtr),y
inc
sta (ZPCtxPtr),y
bne .8
cpy #7
bne .1
.8 rts
*--------------------------------------
* MD4ExtraChunk
* In :
* ZPCtxPtr = MD4 Context
*--------------------------------------
*--------------------------------------
* MD5ExtraChunk
* In :
* ZPCtxPtr = MD5 Context
*--------------------------------------
MD4ExtraChunk
MD5ExtraChunk ldy #S.MD4.FINALIZED
lda #$80
sta (ZPCtxPtr),y Mark MD5 Context as "finalized"
ldx #0
ldy #S.MD4.EXTRABIT Extra Bit already appended ?
lda (ZPCtxPtr),y
bne .1
lda #$80
sta MD4.BUFFER64 Add extra bit to buffer
sta (ZPCtxPtr),y Mark Extrabit added
inx
.1 stz MD5.BUFFER64,x pad with "0"...
inx
cpx #56
bne .1 ...until room for bitcount
jsr MD4AppendBitCount
lda MD.MODE
bne .2
jsr MD4Transform
bra .3
.2 jsr MD5Transform
.3
*--------------------------------------
* MD4UpdateABCD0
* In:
* ZPCtxPtr = MD4 Context
*--------------------------------------
*--------------------------------------
* MD5UpdateABCD0
* In:
* ZPCtxPtr = MD5 Context
*--------------------------------------
MD4UpdateABCD0
MD5UpdateABCD0 ldy #0
.1 clc ADC32 A+A0->A0, B, C, D....
.2 lda MD4.ABCD,y
adc (ZPCtxPtr),y
sta (ZPCtxPtr),y
iny
tya
and #3
bne .2
cpy #16
bne .1
rts
*--------------------------------------
* MD4Transform
* In:
* ZPCtxPtr = MD4 Context
* 512 Bits Padded chunk in MD4.BUFFER64
* Out:
* Updated MD4.ABCD
* https://tools.ietf.org/html/rfc1320 MD4
*--------------------------------------
MD4Transform ldy #15 init ABCD Chunk with Context ABCD0
.1 lda (ZPCtxPtr),y
sta MD4.ABCD,y
dey
bpl .1
stz MD4.i Start Proceed 0 to 47 bytes
lda #0 lda MD4.i
.2 lsr
lsr
lsr
and #6
cmp #6
bne .3
lda #0
.3 tax
jsr MD4.XXXX
inc MD5.i
lda MD5.i
cmp #48
bne .2
rts
*--------------------------------------
MD4.XXXX jmp (J.MD4.XXXX,x)
*--------------------------------------
MD4.0015 >NOT32 MD4.B,MD4.F2
>AND32 MD4.B,MD4.C,MD4.F1
>AND32 MD4.F2,MD4.D,MD4.F2
>ORA32 MD4.F1,MD4.F2,MD4.F
bra MD4.XXXX.END
*--------------------------------------
MD4.1631 >AND32 MD4.B,MD4.C,MD4.F1
>AND32 MD4.B,MD4.D,MD4.F2
>ORA32 MD4.F1,MD4.F2,MD4.F1
>AND32 MD4.C,MD4.D,MD4.F2
>ORA32 MD4.F1,MD4.F2,MD4.F
bra MD4.XXXX.END
*--------------------------------------
MD4.3247 >EOR32 MD4.B,MD4.C,MD4.F
>EOR32 MD4.F,MD4.D,MD4.F
*--------------------------------------
MD4.XXXX.END >MOV32 MD4.D,MD4.DTemp
>MOV32 MD4.C,MD4.D
>MOV32 MD4.B,MD4.C
>ADC32 MD4.A,MD4.F,MD4.B
lda MD4.i
lsr
lsr
and #$0C
beq .3
tay
ldx #0
clc
.1 lda MD4.K-4,y ADC32 MD4.K[i],MD4.F,MD4.F
adc MD4.B,x
sta MD4.B,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .1
.3 tax
ldy MD4.i
lda MD4.g,y
asl
asl
tay
clc
.2 lda MD4.BUFFER64,y ADC32 M[g],MD4.F,MD4.F
adc MD4.B,x
sta MD4.B,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .2
ldy MD4.i
ldx MD4.s,y get s[i] in x
>ROL32x MD4.B
>MOV32 MD4.DTemp,MD4.A
rts
*--------------------------------------
* MD5Transform
* In:
* ZPCtxPtr = MD5 Context
* 512 Bits Padded chunk in MD5.BUFFER64
* Out:
* Updated MD5.ABCD
* https://tools.ietf.org/html/rfc1321 MD5
*--------------------------------------
MD5Transform ldy #15 init ABCD Chunk with Context ABCD0
.1 lda (ZPCtxPtr),y
sta MD5.ABCD,y
dey
bpl .1
stz MD5.i Start Proceed 0 to 63 bytes
lda #0 lda MD5.i
.2 lsr
lsr
lsr
and #6
tax
jsr MD5.XXXX
inc MD5.i
lda MD5.i
cmp #64
bne .2
rts
*--------------------------------------
MD5.XXXX jmp (J.MD5.XXXX,x)
*--------------------------------------
MD5.0015 >NOT32 MD5.B,MD5.F2
>AND32 MD5.B,MD5.C,MD5.F1
>AND32 MD5.F2,MD5.D,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
bra MD5.XXXX.END
*--------------------------------------
MD5.1631 >NOT32 MD5.D,MD5.F2
>AND32 MD5.D,MD5.B,MD5.F1
>AND32 MD5.F2,MD5.C,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
bra MD5.XXXX.END
*--------------------------------------
MD5.3247 >EOR32 MD5.B,MD5.C,MD5.F
>EOR32 MD5.F,MD5.D,MD5.F
bra MD5.XXXX.END
*--------------------------------------
MD5.4863 >NOT32 MD5.D,MD5.F1
>ORA32 MD5.F1,MD5.B,MD5.F2
>EOR32 MD5.F2,MD5.C,MD5.F
*--------------------------------------
MD5.XXXX.END >MOV32 MD5.D,MD5.DTemp
>MOV32 MD5.C,MD5.D
>MOV32 MD5.B,MD5.C
>ADC32 MD5.A,MD5.F,MD5.F
lda MD5.i
asl
asl
tay
ldx #0
clc
.1 lda MD5.K,y ADC32 MD5.K[i],MD5.F,MD5.F
adc MD5.F,x
sta MD5.F,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .1
tax
ldy MD5.i
lda MD5.g,y
asl
asl
tay
clc
.2 lda MD5.BUFFER64,y ADC32 M[g],MD5.F,MD5.F
adc MD5.F,x
sta MD5.F,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .2
ldy MD5.i
ldx MD5.s,y get s[i] in x
>ROL32x MD5.F
>ADC32 MD5.B,MD5.F,MD5.B
>MOV32 MD5.DTemp,MD5.A
rts
*--------------------------------------
CS.END
MD4.ABCDINIT .HS 01234567.89ABCDEF.FEDCBA98.76543210
*--------------------------------------
MD4.s .DA #3,#7,#11,#19,#3,#7,#11,#19,#3,#7,#11,#19,#3,#7,#11,#19
.DA #3,#5,#9,#13,#3,#5,#9,#13,#3,#5,#9,#13,#3,#5,#9,#13
.DA #3,#9,#11,#15,#3,#9,#11,#15,#3,#9,#11,#15,#3,#9,#11,#15
*--------------------------------------
MD4.g .DA #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15
.DA #0,#4,#8,#12,#1,#5,#9,#13,#2,#6,#10,#14,#3,#7,#11,#15
.DA #0,#8,#4,#12,#2,#10,#6,#14,#1,#9,#5,#13,#3,#11,#7,#15
*--------------------------------------
MD4.K .HS 9979825A.A1EBD96E
*--------------------------------------
MD5.s .DA #7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22
.DA #5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20
.DA #4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23
.DA #6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21
*--------------------------------------
MD5.g .DA #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15
.DA #1,#6,#11,#0,#5,#10,#15,#4,#9,#14,#3,#8,#13,#2,#7,#12
.DA #5,#8,#11,#14,#1,#4,#7,#10,#13,#0,#3,#6,#9,#12,#15,#2
.DA #0,#7,#14,#5,#12,#3,#10,#1,#8,#15,#6,#13,#4,#11,#2,#9
*--------------------------------------
MD5.K .HS 78A46AD7.56B7C7E8.DB702024.EECEBDC1
.HS AF0F7CF5.2AC68747.134630A8.019546FD
.HS D8988069.AFF7448B.B15BFFFF.BED75C89
.HS 2211906B.937198FD.8E4379A6.2108B449
.HS 62251EF6.40B340C0.515A5E26.AAC7B6E9
.HS 5D102FD6.53144402.81E6A1D8.C8FBD3E7
.HS E6CDE121.D60737C3.870DD5F4.ED145A45
.HS 05E9E3A9.F8A3EFFC.D9026F67.8A4C2A8D
.HS 4239FAFF.81F67187.22619D6D.0C38E5FD
.HS 44EABEA4.A9CFDE4B.604BBBF6.70BCBFBE
.HS C67E9B28.FA27A1EA.8530EFD4.051D8804
.HS 39D0D4D9.E599DBE6.F87CA21F.6556ACC4
.HS 442229F4.97FF2A43.A72394AB.39A093FC
.HS C3595B65.92CC0C8F.7DF4EFFF.D15D8485
.HS 4F7EA86F.E0E62CFE.144301A3.A111084E
.HS 827E53F7.35F23ABD.BBD2D72A.91D386EB
*--------------------------------------
MD4.DIGITS .AS "0123456789ABCDEF"
*--------------------------------------
ZPDataLen .BS 2
MD.MODE .BS 1
MD4.DTemp
MD5.DTemp .BS 4
MD4.F
MD5.F .BS 4
MD4.i
MD5.i .BS 1
MD4.BUFFER64
MD5.BUFFER64 .BS 64
HMAC.DTemp .BS 4
HMACMD5.IPAD .BS 65
HMACMD5.OPAD .BS 65
*--------------------------------------
MAN
SAVE usr/src/lib/libcrypt.s
ASM