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
ZPKeyPtr		.BS 2
ZPHashPtr		.BS 2

MDx.ABCD
MDx.A			.BS 4					Chunk Level,A,B,C,D
MDx.B			.BS 4
MDx.C			.BS 4
MDx.D			.BS 4

MDx.F1			.BS 4
MDx.F2			.BS 4

ZS.END			.ED
*--------------------------------------
* TEMP storage allowed here because of:
* - No Task switching when in a LIB
* - No I/O (printf....)
*--------------------------------------
				.DUMMY
				.OR $1100
ZPDataLen		.BS 2
ZPChunkLen		.BS 2

MDx.MODE		.BS 1

MDx.DTemp		.BS 4
MDx.F			.BS 4
MDx.i			.BS 1
MDx.BUFFER64	.BS 64

HMACMD5.IPAD	.BS 65
HMACMD5.OPAD	.BS 65
				.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 MD5Finalize
				.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
				.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				clc
				.HS B0					BCS
*/--------------------------------------
* ## 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				sec

				ror MDx.MODE
				
				>PULLW ZPHashPtr
				>PULLYA
				>STYA ZPDataPtr
				>SYSCALL2 strlen
				>STYA ZPDataLen
.1				jsr MD5Init
				bcs .9

				pha						save MD4 Context hMem

				jsr MDxUpdate.I
				jsr MDxFinalize.I

				pla
				>SYSCALL2 FreeMem		Free MD4 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
*/--------------------------------------
* ## MD5Init
* Initialize a MD5 computation
* # C
* `hMD5 MD5init();`
* # ASM
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Init`
* ## RETURN VALUE
* A = hMem To S.MD5
*\--------------------------------------
MD5Init			>LDYAI S.MDx
				>SYSCALL2 getmem
				bcs MDxInit.9

				>STYA ZPCtxPtr

MDxReset.I		ldy #0

.1				lda MDx.ABCDINIT,y
				sta (ZPCtxPtr),y
				iny
				cpy #S.MDx.BITCOUNT
				bne .1

				lda #0

.2				sta	(ZPCtxPtr),y
				iny
				cpy #S.MDx				Includes S.MDx.FINALIZED Flag
				bne .2

				txa
				clc
MDxInit.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
*\--------------------------------------
MD4Update		clc
				.HS B0					BCS
*/--------------------------------------
* ## 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
*\--------------------------------------
MD5Update		sec

				ror MDx.MODE
				
				>PULLW ZPDataLen		get LEN
				>PULLW ZPDataPtr		get DATA

				>PULLA
				>SYSCALL2 GetMemPtr		get MD5 Context
				>STYA ZPCtxPtr

MDxUpdate.I		ldy #S.MDx.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 MDxUpdateBitCnt

				ldy #0

.51				lda (ZPDataPtr),y		Load Buffer with data
				sta MDx.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 MDx.BUFFER64,y

				asl
*				lda #0

				iny						Pad with 0 to 64 
				cpy #64
				bcc .52

				ldy #S.MDx.EXTRABIT		Mark MD5 Context as Appended
				ror
*				lda #$80
				sta (ZPCtxPtr),y
				lda ZPChunkLen
				cmp #56					Enough room for BITCOUNT ?
				bcs .58					no

				jsr MDxAppendBitCnt

.58				jsr MDxTransform

				jsr MDxUpdateABCD0

.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
*\--------------------------------------
MD4Finalize		clc
				.HS B0					BCS
*/--------------------------------------
* ## MD5Finalize
* # C
* `void MD5finalize (hMD5 MD5, char* digest);`
* # ASM
* `>PUSHB MD5`
* `>PUSHW digest`
* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Finalize`
* ## RETURN VALUE
*\--------------------------------------
MD5Finalize		sec

				ror MDx.MODE
				
				>PULLW ZPHashPtr
				>PULLA
				pha
				>SYSCALL2 GetMemPtr
				>STYA ZPCtxPtr			get MD5 Context

				jsr MDxFinalize.I

				pla
				>SYSCALL2 FreeMem
				rts

MDxFinalize.I	ldy #S.MDx.FINALIZED

				lda (ZPCtxPtr),y
				bne .11

				jsr MDxExtraChunk

.11				ldy #0
				sty MDx.i

.1				lda (ZPCtxPtr),y
				lsr
				lsr
				lsr
				lsr
				tax
				lda MDx.DIGITS,x
				jsr .7

				lda (ZPCtxPtr),y
				and #$0F
				tax
				lda MDx.DIGITS,x
				jsr .7

				iny
				cpy #16
				bne .1

				lda #0
				clc

.7				phy

				ldy MDx.i
				inc MDx.i
				sta (ZPHashPtr),y
				
				ply
				
MDxFinalize.RTS	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 ZPKeyPtr

				jsr MD5Init
				bcs MDxFinalize.RTS
			
				sec

				ror MDx.MODE			Switch to MD5
				
				pha

				>LDYA ZPDataPtr
				>SYSCALL2 strlen
				>STYA ZPDataLen
				cpy #65
				bcs .2

				tay
				beq .4

.2				jsr MDxUpdate.I
				jsr MDxFinalize.I

				>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 MDxReset.I

				>LDYAI HMACMD5.IPAD
				>STYA ZPDataPtr
				>LDYAI 64
				>STYA ZPDataLen
				
				jsr MDxUpdate.I

				>LDYA ZPKeyPtr
				>STYA ZPDataPtr
				>SYSCALL2 strlen
				>STYA ZPDataLen

				jsr MDxUpdate.I
				jsr MDxFinalize.I

				ldy #0

.8				lda (ZPCtxPtr),y
				sta HMACMD5.IPAD,y
				iny
				cpy #16
				bne .8

				jsr MDxReset.I

				>LDYAI HMACMD5.OPAD
				>STYA ZPDataPtr
				>LDYAI 64
				>STYA ZPDataLen
				jsr MDxUpdate.I

				>LDYAI HMACMD5.IPAD
				>STYA ZPDataPtr

				ldy #16
				sty ZPDataLen

				jsr MDxUpdate.I
				jsr MDxFinalize.I		MDx.MODE setup by MD5Update
				
				pla
				>SYSCALL2 FreeMem

				rts
*--------------------------------------
* https://waterjuiceweb.wordpress.com/aes/
*--------------------------------------
*			PRIVATE
*--------------------------------------
* MDxAppendBitCount
*  In :
*   ZPCtxPtr = MD4 Context
*--------------------------------------
MDxAppendBitCnt	ldx #56
				ldy #S.MDx.BITCOUNT		Append 8 Bytes of BITCOUNT

.1				lda (ZPCtxPtr),y
				sta MDx.BUFFER64,x
				inx
				iny
				cpy #S.MDx.BITCOUNT+8
				bne .1

				ldy #S.MDx.FINALIZED	Mark MD5 Context as Finalized
				lda #$80
				sta (ZPCtxPtr),y
				rts
*--------------------------------------
* MDxUpdateBitCnt
*  In :
*   CL = Size (in bytes) to add to MDx context
*   ZPCtxPtr = MDx Context
*--------------------------------------
MDxUpdateBitCnt	stz ZPChunkLen+1
				lda ZPChunkLen
				asl
				rol ZPChunkLen+1
				asl						times 8 to get BITCOUNT
				rol ZPChunkLen+1
				asl
				rol ZPChunkLen+1
				clc
				ldy #S.MDx.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
*--------------------------------------
* MDxExtraChunk
*  In : 
*   ZPCtxPtr = MDx Context
*--------------------------------------
MDxExtraChunk	ldy #S.MDx.FINALIZED
				lda #$80
				sta (ZPCtxPtr),y		Mark MD5 Context as "finalized"
				ldx #0
				ldy #S.MDx.EXTRABIT		Extra Bit already appended ?
				lda (ZPCtxPtr),y
				bne .1

				lda #$80
				sta MDx.BUFFER64		Add extra bit to buffer
				sta (ZPCtxPtr),y		Mark Extrabit added
				inx

.1				stz MDx.BUFFER64,x		pad with "0"...
				inx
				cpx #56
				bne .1					...until room for BITCOUNT

				jsr MDxAppendBitCnt
				jsr MDxTransform
*--------------------------------------
* MDxUpdateABCD0
*  In: 
*   ZPCtxPtr = MDx Context
*--------------------------------------
MDxUpdateABCD0	ldy #0

.1				clc						ADC32 A+A0->A0, B, C, D.... 

.2				lda MDx.ABCD,y
				adc (ZPCtxPtr),y
				sta (ZPCtxPtr),y
				iny
				tya
				and #3
				bne .2

				cpy #16
				bne .1

				rts
*--------------------------------------
MDxTransform	ldy #15					init ABCD Chunk with Context ABCD0

.1				lda (ZPCtxPtr),y
				sta MDx.ABCD,y
				dey
				bpl .1

				lda #0					make sure A = MDx.i = 0 before transform
				sta MDx.i
				
				bit MDx.MODE
				bpl MD4Transform
				
				jmp MD5Transform
*--------------------------------------
* MD4Transform 
*  In: 
*   ZPCtxPtr = MD4 Context
*   512 Bits Padded chunk in MDx.BUFFER64
*  Out:
*   Updated MDx.ABCD
* https://tools.ietf.org/html/rfc1320	MD4
*--------------------------------------
MD4Transform	lsr
				lsr
				lsr
				and #6
				cmp #6
				bne .1

				lda #0

.1				tax

				jsr MD4.XXXX

				inc MDx.i
				lda MDx.i
				cmp #48
				bne MD4Transform

				rts
*--------------------------------------
MD4.XXXX		jmp (J.MD4.XXXX,x)
*--------------------------------------
MD4.0015		>NOT32 MDx.B,MDx.F2
				>AND32 MDx.B,MDx.C,MDx.F1
				>AND32 MDx.F2,MDx.D,MDx.F2
				>ORA32 MDx.F1,MDx.F2,MDx.F
				bra MD4.XXXX.END
*--------------------------------------
MD4.1631		>AND32 MDx.B,MDx.C,MDx.F1
				>AND32 MDx.B,MDx.D,MDx.F2
				>ORA32 MDx.F1,MDx.F2,MDx.F1
				>AND32 MDx.C,MDx.D,MDx.F2
				>ORA32 MDx.F1,MDx.F2,MDx.F
				bra MD4.XXXX.END
*--------------------------------------
MD4.3247		>EOR32 MDx.B,MDx.C,MDx.F
				>EOR32 MDx.F,MDx.D,MDx.F
*--------------------------------------
MD4.XXXX.END	>MOV32 MDx.D,MDx.DTemp
				>MOV32 MDx.C,MDx.D
				>MOV32 MDx.B,MDx.C
				>ADC32 MDx.A,MDx.F,MDx.B
				lda MDx.i
				lsr
				lsr
				and #$0C
				beq .3

				tay

				ldx #0
				clc

.1				lda MD4.K-4,y 			ADC32 MDx.K[i],MDx.F,MDx.F
				adc MDx.B,x
				sta MDx.B,x
				iny
				inx
				txa
				eor #4					DO NOT DISTURB carry with cpx !!!
				bne .1

.3				tax
				ldy MDx.i
				lda MD4.g,y
				asl
				asl
				tay

				clc

.2				lda MDx.BUFFER64,y		ADC32 M[g],MDx.F,MDx.F
				adc MDx.B,x
				sta MDx.B,x
				iny
				inx
				txa
				eor #4					DO NOT DISTURB carry with cpx !!!
				bne .2

				ldy MDx.i
				ldx MD4.s,y				get s[i] in x

				>ROL32x MDx.B
				>MOV32 MDx.DTemp,MDx.A
				rts
*--------------------------------------
* MD5Transform 
*  In: 
*   ZPCtxPtr = MD5 Context
*   512 Bits Padded chunk in MDx.BUFFER64
*  Out:
*   Updated MDx.ABCD
* https://tools.ietf.org/html/rfc1321	MD5
*--------------------------------------
MD5Transform	lsr
				lsr
				lsr
				and #6
				tax

				jsr MD5.XXXX

				inc MDx.i
				lda MDx.i
				cmp #64
				bne MD5Transform

				rts
*--------------------------------------
MD5.XXXX		jmp (J.MD5.XXXX,x)
*--------------------------------------
MD5.0015		>NOT32 MDx.B,MDx.F2
				>AND32 MDx.B,MDx.C,MDx.F1
				>AND32 MDx.F2,MDx.D,MDx.F2
				>ORA32 MDx.F1,MDx.F2,MDx.F
				bra MD5.XXXX.END
*--------------------------------------
MD5.1631		>NOT32 MDx.D,MDx.F2
				>AND32 MDx.D,MDx.B,MDx.F1
				>AND32 MDx.F2,MDx.C,MDx.F2
				>ORA32 MDx.F1,MDx.F2,MDx.F
				bra MD5.XXXX.END
*--------------------------------------
MD5.3247		>EOR32 MDx.B,MDx.C,MDx.F
				>EOR32 MDx.F,MDx.D,MDx.F
				bra MD5.XXXX.END
*--------------------------------------
MD5.4863		>NOT32 MDx.D,MDx.F1
				>ORA32 MDx.F1,MDx.B,MDx.F2
				>EOR32 MDx.F2,MDx.C,MDx.F
*--------------------------------------
MD5.XXXX.END	>MOV32 MDx.D,MDx.DTemp
				>MOV32 MDx.C,MDx.D
				>MOV32 MDx.B,MDx.C
				>ADC32 MDx.A,MDx.F,MDx.F
				lda MDx.i
				asl
				asl
				tay

				ldx #0
				clc

.1				lda MD5.K,y 			ADC32 MD5.K[i],MDx.F,MDx.F
				adc MDx.F,x
				sta MDx.F,x
				iny
				inx
				txa
				eor #4					DO NOT DISTURB carry with cpx !!!
				bne .1

				tax
				ldy MDx.i
				lda MD5.g,y
				asl
				asl
				tay

				clc

.2				lda MDx.BUFFER64,y		ADC32 M[g],MDx.F,MDx.F
				adc MDx.F,x
				sta MDx.F,x
				iny
				inx
				txa
				eor #4					DO NOT DISTURB carry with cpx !!!
				bne .2

				ldy MDx.i
				ldx MD5.s,y				get s[i] in x

				>ROL32x MDx.F
				>ADC32 MDx.B,MDx.F,MDx.B
				>MOV32 MDx.DTemp,MDx.A
				rts
*--------------------------------------
CS.END
MDx.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
*--------------------------------------
MDx.DIGITS		.AS "0123456789abcdef"
*--------------------------------------
MAN
SAVE usr/src/lib/libcrypt.s
ASM
