!to "shasum.o", plain * = $6000 jmp main ;; clear addresses: ;; (http://apple2.org.za/gswv/a2zine/faqs/csa2pfaq.html#017) ;; 06-09 ;; EB-EF ;; FA-FD !addr SRC = $06 !addr DEST = $08 !addr INPUT = $eb !addr LENGTH = $ee !addr PRBYTE = $FDDA !addr COUT = $FDED h0: !32 0 ; return value (hash) h1: !32 0 h2: !32 0 h3: !32 0 h4: !32 0 ml: !32 0 ; message length w: !fill 64, 0 w_next: !fill 64, 0 kh0: !be32 $67452301 ; initial values for h0..h4 kh1: !be32 $EFCDAB89 kh2: !be32 $98BADCFE kh3: !be32 $10325476 kh4: !be32 $C3D2E1F0 k1: !be32 $5A827999 ; k = constants k2: !be32 $6ED9EBA1 k3: !be32 $8F1BBCDC k4: !be32 $CA62C1D6 ;;; Print a string of bytes, as hex. ;;; Address in SRC, count in A. ;;; Burns Y, A. prbytes: ldy #0 - pha lda (SRC),y jsr PRBYTE iny pla adc #$ff bne - rts main: ;; Test PRBYTES ;; lda #kh0 ;; sta SRC+1 ;; lda #8 ;; jsr prbytes ;; LDA #$8D ;; jsr COUT ;; Test shasum lda #0 sta INPUT lda #$ff sta INPUT+1 lda #0 sta LENGTH+1 lda #$3b sta LENGTH jsr shasum rts shasum: ;; Initialize h0..h4 ldy #(ml-h0-1) - lda kh0,y sta h0,y dey bpl - ;; Initialize message length (ml) lda #0 sta ml sta ml+1 lda LENGTH sta ml+3 lda LENGTH+1 sta ml+2 ;; Message length is in bits ldy #3 - clc rol ml+3 rol ml+2 rol ml+1 dey bne - ;; Initialize chunk counter ;; ldy #0 ; already zero ;; Invert length so we can inc instead of dec lda LENGTH sec lda #0 sbc LENGTH sta LENGTH lda #0 sbc LENGTH+1 sta LENGTH+1 ora LENGTH beq .msgdone .loop lda (INPUT),y sta w,y iny cpy #$40 bne + ;; Call do_chunk jsr do_chunk ldy #0 clc lda INPUT adc #$40 sta INPUT bcc + inc INPUT+1 + inc LENGTH bne .loop inc LENGTH+1 bne .loop .msgdone: lda #$80 sta w,y iny cpy #$40 bne .zeros jsr do_chunk ldy #0 .zeros cpy #$3C beq .length lda #0 sta w,y iny cpy #$40 bne .zeros jsr do_chunk ldy #0 jmp .zeros .length ldy #3 - lda ml,y sta w+$3c,y dey bpl - jsr do_chunk rts do_chunk: lda #w sta SRC+1 lda #$40 jsr prbytes lda #$8D jsr COUT rts !eof TODOs [X] Routine to print n hex bytes (address, length (byte)) [ ] Routine to get the next 16 values (64 bytes) [ ] Routine to get w[i] one i at a time, and rebuild next 16 values [ ] Routine to get the next 16 values (64 bytes) of input Chacha20 code isn't so useful, because it's little-endian. 611B ADD32 612B XOR32 613A ROL16 6152 RORX 6165 ROL12 616E ROL8 6180 ROL7 6189 PR32 Needed sha1sum: - leftrotate 1 --> ? - leftrotate 5 --> ROL8, RORX 3 - leftrotate 30 --> RORX 2