A2osX/LIB/LIBCRYPT.S.txt

512 lines
12 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
2015-06-03 18:30:57 +00:00
PREFIX /A2OSX.SRC
2015-03-14 21:48:35 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF LIB/LIBCRYPT.O
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBCRYPT.I
*--------------------------------------
* DWORD Macros : Do NOT disturb carry with cpx, cpy...
*--------------------------------------
.MA ADC32
ldx #3
ldy #0
clc
:1 lda ]1,y
adc ]2,y
sta ]3,y
iny
dex
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
*--------------------------------------
* Main entry point
* input :
* X = Function
*--------------------------------------
* Code signature and relocation table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA MD5PStrA
.DA MD5Init
.DA MD5Update
.DA MD5FinalizeA
*--------------------------------------
.DA 0
.DA CS.END-CS.START
.DA 0
*--------------------------------------
LIB.LOAD
LIB.UNLOAD clc
rts
*--------------------------------------
* MD5PStrA
* in :
* A = hMem To PSTR
* out :
* A = hMem To MessageDigest
*--------------------------------------
MD5PStrA >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr3 1 and 2 used by other MD5 functions
ldy #0
lda (ZPQuickPtr3),y get PStr len
sta ZPQuickPtr4 ZPQuickPtr4 = str len
stz ZPQuickPtr4+1 0,PSTR len <= 255
inc ZPQuickPtr3
bne .1
inc ZPQuickPtr3+1 Make DATA skip PSTR Len Byte
.1 jsr MD5Init
bcs .9
pha save MD5 Context hMem
>PUSHW ZPQuickPtr4 Push LEN
>PUSHW ZPQuickPtr3 Push DATA
pla
pha
>PUSHA Push MD5 Context
jsr MD5Update
pla get back MD5 Context
pha
jsr MD5FinalizeA
plx get back MD5 Context hMem
pha save MessageDigest hMem
txa
>SYSCALL SYS.FreeMemA Free MD5 Context
pla get back MessageDigest hMem
clc
.9 rts
*--------------------------------------
* MD5Init
* In :
* Out :
* A = hMem To S.MD5
*--------------------------------------
MD5Init >PUSHWI S.MD5.SIZE
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .9
>STYA ZPQuickPtr1
ldy #0
.1 lda MD5.ABCDINIT,y
sta (ZPQuickPtr1),y
iny
cpy #16
bne .1
lda #0
.2 sta (ZPQuickPtr1),y
iny
cpy #S.MD5.SIZE Includes S.MD5.FINALIZED Flag
bne .2
txa
clc
.9 rts
*--------------------------------------
* MD5Update (Append "$80" & Padding & original size)
* In:
* PULLB MD5 Context hMem
* PULLW DATA PTR
* PULLW DATA LEN
*--------------------------------------
MD5Update >PULLA get MD5 Context
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1 get MD5 Context
>PULLW R.AX get DATA
>PULLW R.BX get LEN
ldy #S.MD5.FINALIZED
lda (ZPQuickPtr1),y
beq .1
sec
rts
.1 lda R.BH More than 256 Bytes remaining to hash ?
bne .3 yes
lda R.BL
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 R.CL Save Chunk Len
jsr MD5UpdateBitCount
ldy #0
.51 lda (R.AX),y Load Buffer with data
sta MD5.BUFFER64,y
iny
cpy R.CL
bne .51
cpy #64 Full 64 Bytes DATA ?
beq .58
lda #$80 no, Append $80
sta MD5.BUFFER64,y
lda #0
.52 iny Pad with 0 to 64
cpy #64
beq .53
sta MD5.BUFFER64,y
bra .52
.53 ldy #S.MD5.EXTRABIT Mark MD5 Context as Appended
lda #$80
sta (ZPQuickPtr1),y
lda R.CL
cmp #56 Enough room for BITCOUNT ?
bcs .58 no
jsr MD5AppendBitCount
.58 jsr MD5Transform
jsr MD5UpdateABCD0
.8 lda R.BL Substract Bytes processed from LEN
sec
sbc R.CL get back chunk Len
sta R.BL
bcs .81
dec R.BH
.81 lda R.AL Add Bytes processed to DATA
clc
adc R.CL
sta R.AL
bcc .82
inc R.AH
.82 jmp .1
*--------------------------------------
* MD5FinalizeA
* In :
* A = hMem To S.MD5
* Out:
* A = MessageDigest (PSTR, 16 Bytes, 32 Chars)
*--------------------------------------
MD5FinalizeA >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1 get MD5 Context
ldy #S.MD5.FINALIZED
lda (ZPQuickPtr1),y
bne .11
jsr MD5ExtraChunk
.11 >PUSHWI 33 Len + 32 Digits
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .9
>STYA ZPQuickPtr2
phx save hMem for return
lda #32
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .10
inc ZPQuickPtr2+1
.10 ldy #S.MD5.ABCD0
.1 lda (ZPQuickPtr1),y
lsr
lsr
lsr
lsr
tax
lda MD5.DIGITS,x
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .2
inc ZPQuickPtr2+1
.2 lda (ZPQuickPtr1),y
and #$0F
tax
lda MD5.DIGITS,x
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .3
inc ZPQuickPtr2+1
.3 iny
cpy #S.MD5.ABCD0+16
bne .1
pla get back hMem
clc
.9 rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* MD5AppendBitCount
* In :
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5AppendBitCount
ldx #56
ldy #S.MD5.BITCOUNT Append 8 Bytes of BITCOUNT
.1 lda (ZPQuickPtr1),y
sta MD5.BUFFER64,x
inx
iny
cpy #S.MD5.BITCOUNT+8
bne .1
ldy #S.MD5.FINALIZED Mark MD5 Context as Finalized
lda #$80
sta (ZPQuickPtr1),y
rts
*--------------------------------------
* MD5UpdateBitCount
* In :
* CL = Size (in bytes) to add to MD5 context
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5UpdateBitCount
stz R.CH
lda R.CL
asl
rol R.CH
asl times 8 to get bit count
rol R.CH
asl
rol R.CH
clc
ldy #S.MD5.BITCOUNT
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
iny
lda R.CH
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
bcc .8
.1 iny
lda (ZPQuickPtr1),y
inc
sta (ZPQuickPtr1),y
bne .8
cpy #7
bne .1
.8 rts
*--------------------------------------
* MD5ExtraChunk
* In :
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5ExtraChunk ldy #S.MD5.FINALIZED
lda #$80
sta (ZPQuickPtr1),y Mark MD5 Context as "finalized"
ldx #0
ldy #S.MD5.EXTRABIT Extra Bit already appended ?
lda (ZPQuickPtr1),y
bne .1
lda #$80
sta MD5.BUFFER64 Add extra bit to buffer
sta (ZPQuickPtr1),y Mark Extrabit added
inx
.1 stz MD5.BUFFER64,x pad with "0"...
inx
cpx #56
bne .1 ...until room for bitcount
jsr MD5AppendBitCount
jsr MD5Transform
*--------------------------------------
* MD5UpdateABCD0
* In:
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5UpdateABCD0 ldy #0
.1 clc ADC32 A+A0->A0, B, C, D....
.2 lda MD5.ABCD,y
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
iny
tya
and #3
bne .2
cpy #16
bne .1
rts
*--------------------------------------
* MD5Transform
* In:
* ZPQuickPtr1 = MD5 Context
* 512 Bits Padded chunk in MD5.BUFFER64
* Out:
* Updated MD5.ABCD
*--------------------------------------
MD5Transform ldy #15 init ABCD Chunk with Context ABCD0
.1 lda (ZPQuickPtr1),y
sta MD5.ABCD,y
dey
bpl .1
stz MD5.i Start Proceed 0 to 63 bytes
*--------------------------------------
MD5.0015 lda MD5.i
cmp #16
bcs MD5.1631
>AND32 MD5.B,MD5.C,MD5.F1
>NOT32 MD5.B,MD5.F2
>AND32 MD5.F2,MD5.D,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.1631 cmp #32
bcs MD5.3247
>AND32 MD5.D,MD5.B,MD5.F1
>NOT32 MD5.D,MD5.F2
>AND32 MD5.F2,MD5.C,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.3247 cmp #48
bcs MD5.4863
>EOR32 MD5.B,MD5.C,MD5.F
>EOR32 MD5.F,MD5.D,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.4863 cmp #64
bne .1
rts
.1 >NOT32 MD5.D,MD5.F1
>ORA32 MD5.F1,MD5.B,MD5.F2
>EOR32 MD5.F2,MD5.C,MD5.F
*--------------------------------------
MD5.NEXTi >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
ldy MD5.i
lda MD5.g,y
asl
asl
tay
ldx #0
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
lda MD5.s,y get s[i] in x
tax
>ROL32x MD5.F
>ADC32 MD5.B,MD5.F,MD5.B
>MOV32 MD5.DTemp,MD5.A
inc MD5.i
jmp MD5.0015
*--------------------------------------
CS.END
MD5.ABCD
MD5.A .BS 4 Chunk Level,A,B,C,D
MD5.B .BS 4
MD5.C .BS 4
MD5.D .BS 4
MD5.DTemp .BS 4
MD5.F .BS 4
MD5.F1 .BS 4
MD5.F2 .BS 4
MD5.i .BS 1
MD5.BUFFER64 .BS 64
*--------------------------------------
MD5.ABCDINIT .HS 01234567.89ABCDEF.FEDCBA98.76543210
*--------------------------------------
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
*--------------------------------------
MD5.DIGITS .AS "0123456789ABCDEF"
*--------------------------------------
MAN
SAVE LIB/LIBCRYPT.S
ASM