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