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 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 jsr MD5Init bcc .2 rts .2 >LDYA ZPDataPtr >SYSCALL2 strlen >STYA ZPDataLen cpy #65 bcs .3 tay beq .4 .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.I 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