A2osX/LIB/LIBCRYPT.S.txt
2021-07-29 18:41:57 +02:00

903 lines
18 KiB
Plaintext
Raw Permalink 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
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