From 01d68659f4874a93275b3bc843853169c46ae5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 12 Oct 2020 11:19:39 +0200 Subject: [PATCH] Kernel 0.94 --- INC/LIBCRYPT.I.txt | 24 ++ LIB/LIBCRYPT.S.txt | 551 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 575 insertions(+) create mode 100644 INC/LIBCRYPT.I.txt create mode 100644 LIB/LIBCRYPT.S.txt diff --git a/INC/LIBCRYPT.I.txt b/INC/LIBCRYPT.I.txt new file mode 100644 index 00000000..eb9b9c5f --- /dev/null +++ b/INC/LIBCRYPT.I.txt @@ -0,0 +1,24 @@ +NEW + AUTO 3,1 + .LIST OFF +-------------------------------------- +LIBCRYPT.MD5 .EQ 4 +LIBCRYPT.MD5Init .EQ 6 +LIBCRYPT.MD5Update .EQ 8 +LIBCRYPT.MD5Finalize .EQ 10 +-------------------------------------- + S.MD5 STRUCT +-------------------------------------- +S.MD5.ABCD0 .EQ 0 +S.MD5.A0 .EQ 0 +S.MD5.B0 .EQ 4 +S.MD5.C0 .EQ 8 +S.MD5.D0 .EQ 12 +S.MD5.BITCOUNT .EQ 16 +S.MD5.EXTRABIT .EQ 24 +S.MD5.FINALIZED .EQ 25 + +S.MD5 .EQ 26 +-------------------------------------- +MAN +SAVE inc/libcrypt.i diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt new file mode 100644 index 00000000..5e562232 --- /dev/null +++ b/LIB/LIBCRYPT.S.txt @@ -0,0 +1,551 @@ +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 +*-------------------------------------- +* https://waterjuiceweb.wordpress.com/aes/ +*-------------------------------------- + .DUMMY + .OR ZPLIB +ZS.START +ZPCtxPtr .BS 2 +ZPDataPtr .BS 2 +ZPHashPtr .BS 2 + +ZPChunkLen .BS 2 + +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.F1 .BS 4 +MD5.F2 .BS 4 + +ZS.END .ED +*-------------------------------------- +* 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 +*-------------------------------------- +* 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 MD5 + .DA MD5Init + .DA MD5Update + .DA MD5Finalize +J.MD5.XXXX .DA MD5.0015 + .DA MD5.1631 + .DA MD5.3247 + .DA MD5.4863 + .DA 0 +*-------------------------------------- +LIB.LOAD +LIB.UNLOAD clc + rts +*/-------------------------------------- +* ## MD5 +* Return MD5 Hash for input String +* # C +* `void md5 (const char* str, char* digest);` +* # ASM +* `>PUSHW digest` +* `>PUSHW str` +* ## RETURN VALUE +* CC +*\-------------------------------------- +MD5 >PULLW ZPDataPtr + >PULLW ZPHashPtr + >LDYA ZPDataPtr + >SYSCALL2 strlen + >STYA ZPDataLen +.1 jsr MD5Init + bcs .9 + pha save MD5 Context hMem + + jsr MD5Update.I + jsr MD5Finalize.I + pla + >SYSCALL2 FreeMem Free MD5 Context + clc +.9 rts +*/-------------------------------------- +* ## MD5Init +* Initialize a MD5 computation +* # C +* `hMD5 md5init ();` +* # ASM +* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Init` +* ## RETURN VALUE +* A = hMem To S.MD5 +*\-------------------------------------- +MD5Init >LDYAI S.MD5 + >SYSCALL2 getmem + bcs .9 + >STYA ZPCtxPtr + ldy #0 +.1 lda MD5.ABCDINIT,y + sta (ZPCtxPtr),y + iny + cpy #S.MD5.BITCOUNT + bne .1 + lda #0 +.2 sta (ZPCtxPtr),y + iny + cpy #S.MD5 Includes S.MD5.FINALIZED Flag + bne .2 + txa + clc +.9 rts +*/-------------------------------------- +* ## MD5Update +* Add Data to MD5 computation +* # C +* `void md5update (hMD5 md5, char* data, int len);` +* # ASM +* `>PUSHW len` +* `>PUSHW data` +* `>LDA.G md5` +* `>hLIBCRYPT,LIBCRYPT.MD5Update` +* ## RETURN VALUE +*\-------------------------------------- +MD5Update >SYSCALL2 GetMemPtr get MD5 Context + >STYA ZPCtxPtr + >PULLW ZPDataPtr get DATA + >PULLW ZPDataLen get LEN +MD5Update.I ldy #S.MD5.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 MD5UpdateBitCount + ldy #0 +.51 lda (ZPDataPtr),y Load Buffer with data + sta MD5.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 + 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 (ZPCtxPtr),y + lda ZPChunkLen + cmp #56 Enough room for BITCOUNT ? + bcs .58 no + jsr MD5AppendBitCount +.58 jsr MD5Transform + jsr MD5UpdateABCD0 +.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 +*/-------------------------------------- +* ## MD5Finalize +* # C +* `void md5finalize (hMD5 md5, char* digest);` +* # ASM +* `>PUSHW digest` +* `>LDA.G md5` +* `>LIBCALL hLIBCRYPT,LIBCRYPT.MD5Finalize` +* ## RETURN VALUE +*\-------------------------------------- +MD5Finalize pha + >SYSCALL2 GetMemPtr + >STYA ZPCtxPtr get MD5 Context + >PULLW ZPHashPtr + jsr MD5Finalize.I + pla + >SYSCALL2 FreeMem + rts +MD5Finalize.I ldy #S.MD5.FINALIZED + + lda (ZPCtxPtr),y + bne .11 + jsr MD5ExtraChunk +.11 ldy #S.MD5.ABCD0 + +.1 lda (ZPCtxPtr),y + lsr + lsr + lsr + lsr + tax + lda MD5.DIGITS,x + sta (ZPHashPtr) + inc ZPHashPtr + bne .2 + inc ZPHashPtr+1 +.2 lda (ZPCtxPtr),y + and #$0F + tax + lda MD5.DIGITS,x + sta (ZPHashPtr) + inc ZPHashPtr + bne .3 + inc ZPHashPtr+1 +.3 iny + cpy #S.MD5.ABCD0+16 + bne .1 + lda #0 + sta (ZPHashPtr) + clc +.9 rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* MD5AppendBitCount +* In : +* ZPCtxPtr = MD5 Context +*-------------------------------------- +MD5AppendBitCount + ldx #56 + ldy #S.MD5.BITCOUNT Append 8 Bytes of BITCOUNT + +.1 lda (ZPCtxPtr),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 (ZPCtxPtr),y + rts +*-------------------------------------- +* MD5UpdateBitCount +* In : +* CL = Size (in bytes) to add to MD5 context +* ZPCtxPtr = MD5 Context +*-------------------------------------- +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.MD5.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 +*-------------------------------------- +* MD5ExtraChunk +* In : +* ZPCtxPtr = MD5 Context +*-------------------------------------- +MD5ExtraChunk ldy #S.MD5.FINALIZED + lda #$80 + sta (ZPCtxPtr),y Mark MD5 Context as "finalized" + ldx #0 + ldy #S.MD5.EXTRABIT Extra Bit already appended ? + lda (ZPCtxPtr),y + bne .1 + + lda #$80 + sta MD5.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 MD5AppendBitCount + jsr MD5Transform +*-------------------------------------- +* MD5UpdateABCD0 +* In: +* ZPCtxPtr = MD5 Context +*-------------------------------------- +MD5UpdateABCD0 ldy #0 + +.1 clc ADC32 A+A0->A0, B, C, D.... + +.2 lda MD5.ABCD,y + adc (ZPCtxPtr),y + sta (ZPCtxPtr),y + iny + tya + and #3 + bne .2 + + cpy #16 + bne .1 + + rts +*-------------------------------------- +* MD5Transform +* In: +* ZPCtxPtr = MD5 Context +* 512 Bits Padded chunk in MD5.BUFFER64 +* Out: +* Updated MD5.ABCD +*-------------------------------------- +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 >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 + bra MD5.XXXX.END +*-------------------------------------- +MD5.1631 >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 + 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 + + 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 + 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 +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" +*-------------------------------------- +ZPDataLen .BS 2 + +MD5.DTemp .BS 4 +MD5.F .BS 4 +MD5.i .BS 1 +MD5.BUFFER64 .BS 64 +*-------------------------------------- +MAN +SAVE usr/src/lib/libcrypt.s +ASM