* IDEA ENCRYPTION/DECRYPTION SUBROUTINES * THESE ROUTINES ARE IN THE PUBLIC DOMAIN * ALL INTEGERS ARE UNSIGNED, AND, EXCEPT WHERE OTHERWISE * NOTED, ARE REPRESENTED WITH THE LEAST SIGNIFICANT BYTE * FIRST WITHIN A WORD, AND THE LEAST SIGNIFICANT WORD * FIRST WITHIN A LONGWORD (STANDARD APPLE II * REPRESENTATION). * 65C02 IS REQUIRED Z = $800 ;104 BYTES FOR KEY SCHEDULE DK = $868 ;104 BYTES FOR DECRYPTION KEY SCHEDULE USK = $8D0 ;16 BYTES FOR USER KEY BUF = $900 ;START OF DATA BUFFER * BEFORE ENCRYPTION CAN TAKE PLACE, A 16-BYTE USER KEY * MUST BE INPUT INTO "USK", AND THE ROUTINE "KEY" MUST BE * CALLED. "KEY" INTERPRETS "USK" AS A STRING OF 8 16-BIT * UNSIGNED INTEGERS REPRESENTED WITH MSB PRECEDING LSB. * FOR DECRYPTION, "KEY" MUST BE CALLED, AND THEN "DEK" AS * WELL. THE 104 BYTES AT "DK" MUST BE COPIED INTO "Z". * ONCE THE KEY SCHEDULES HAVE BEEN CALCULATED, "CIP" IS * CALLED FOR SUCCESSIVE 8-BYTE BLOCKS POINTED TO BY "PTR". * THESE BLOCKS ARE INTERPRETED AS 4 16-BIT UNSIGNED * INTEGERS, MSB FIRST. XMPL JSR KEY ;SET UP ENCRYPTION KEY SCHEDULE BIT MODE ;IF ENCRYPTION, BEGIN THE PROCESS BPL :C JSR DEK ;ELSE SET UP DECRYPTION KEY SCHEDULE LDX #103 ;AND COPY IT OVER THE ENCRYPTION KS :DZ LDA DK,X STA Z,X DEX BPL :DZ :C LDA #>BUF ;INITIALIZE DATA POINTER STA PTR+1 STZ PTR * READ 8 BYTES OF DATA JSR CIP ;PROCESS THE DATA * LOOP BACK UNTIL ALL DATA PROCESSED RTS * "CIP" PERFORMS THE IDEA ENCRYPTION * INPUT: 8-BYTE BLOCK POINTED TO BY "PTR" * OUTPUT: SAME 8-BYTE BLOCK POINTED TO BY "PTR" CIP LDY #7 :IX LDA (PTR),Y STA X1-1,Y DEY LDA (PTR),Y STA X1+1,Y DEY BPL :IX LDY #0 :LOOP LDA X1 STA N1 LDA X1+1 STA N1+1 LDA Z,Y STA N2 LDA Z+1,Y STA N2+1 JSR MML LDA RES STA X1 LDA RES+1 STA X1+1 LDA X4 STA N1 LDA X4+1 STA N1+1 LDA Z+6,Y STA N2 LDA Z+7,Y STA N2+1 JSR MML LDA RES STA X4 LDA RES+1 STA X4+1 CLC LDA X2 ADC Z+2,Y STA X2 LDA X2+1 ADC Z+3,Y STA X2+1 CLC LDA X3 ADC Z+4,Y STA X3B LDA X3+1 ADC Z+5,Y STA X3B+1 LDA Z+8,Y STA N1 LDA Z+9,Y STA N1+1 LDA X1 EOR X3B STA N2 LDA X1+1 EOR X3B+1 STA N2+1 JSR MML LDA RES STA KK LDA RES+1 STA KK+1 LDA Z+10,Y STA N1 LDA Z+11,Y STA N1+1 CLC LDA X2 EOR X4 ADC KK STA N2 LDA X2+1 EOR X4+1 ADC KK+1 STA N2+1 JSR MML CLC LDA RES STA T1 ADC KK STA T2 EOR X4 STA X4 LDA RES+1 STA T1+1 ADC KK+1 STA T2+1 EOR X4+1 STA X4+1 LDA X1 EOR T1 STA X1 LDA X1+1 EOR T1+1 STA X1+1 LDA X2 EOR T2 STA X3 LDA X2+1 EOR T2+1 STA X3+1 LDA X3B EOR T1 STA X2 LDA X3B+1 EOR T1+1 STA X2+1 TYA CLC ADC #12 TAY CPY #96 BCS :X JMP :LOOP :X LDA X4 STA N1 LDA X4+1 STA N1+1 LDA Z+102 STA N2 LDA Z+103 STA N2+1 JSR MML LDA RES LDY #7 STA (PTR),Y LDA RES+1 DEY STA (PTR),Y CLC LDA X2 ADC Z+100 DEY STA (PTR),Y LDA X2+1 ADC Z+101 DEY STA (PTR),Y CLC LDA X3 ADC Z+98 DEY STA (PTR),Y LDA X3+1 ADC Z+99 DEY STA (PTR),Y LDA X1 STA N1 LDA X1+1 STA N1+1 LDA Z+96 STA N2 LDA Z+97 STA N2+1 JSR MML LDA RES DEY STA (PTR),Y LDA RES+1 STA (PTR) RTS * "KEY" CREATES THE ENCRYPTION KEY SCHEDULE * INPUT: 16-BYTE BLOCK STORED AT "USK" * OUTPUT: 104-BYTE BLOCK AT "Z" KEY LDX #15 :UZ LDA USK,X STA Z-1,X DEX LDA USK,X STA Z+1,X DEX BPL :UZ LDX #16 :L TXA AND #$F CMP #$C BEQ :NC BCS :NF LDA Z-14,X STA Z+1,X LDA Z-11,X STA Z,X LDA Z-12,X :S2 ASL ROL Z,X ROL Z+1,X INX INX CPX #104 BCC :L RTS :NF LDA Z-30,X BRA :S1 :NC LDA Z-14,X :S1 STA Z+1,X LDA Z-27,X STA Z,X LDA Z-28,X BRA :S2 * "DEK" CREATES THE DECRYPTION KEY SCHEDULE * INPUT: 104-BYTE BLOCK STORED AT "Z" * OUTPUT: 104-BYTE BLOCK AT "DK" DEK LDX #96 LDY #0 :L LDA Z,Y STA M2 LDA Z+1,Y STA M2+1 JSR INV LDA B2 STA DK,X LDA B2+1 STA DK+1,X CPX #96 BCS :NS CPX #12 BCS :SW SEC :NS LDA #0 SBC Z+2,Y STA DK+2,X LDA #0 SBC Z+3,Y STA DK+3,X SEC LDA #0 SBC Z+4,Y STA DK+4,X LDA #0 SBC Z+5,Y BRA :BK :SW LDA #0 SBC Z+4,Y STA DK+2,X LDA #0 SBC Z+5,Y STA DK+3,X SEC LDA #0 SBC Z+2,Y STA DK+4,X LDA #0 SBC Z+3,Y :BK STA DK+5,X LDA Z+6,Y STA M2 LDA Z+7,Y STA M2+1 JSR INV LDA B2 STA DK+6,X LDA B2+1 STA DK+7,X TYA CLC ADC #12 TAY TXA SEC SBC #12 TAX BMI :DE JMP :L :DE LDX #84 LDY #0 :L2 LDA Z+8,Y STA DK+8,X LDA Z+9,Y STA DK+9,X LDA Z+10,Y STA DK+10,X LDA Z+11,Y STA DK+11,X TYA CLC ADC #12 TAY TXA SEC SBC #12 TAX BPL :L2 RTS * "MML" PERFORMS MULTIPLICATION MODULO 65537 * INPUT: 16-BIT INTEGER AT "N1" * 16-BIT INTEGER AT "N2" * OUTPUT: 16-BIT INTEGER AT "RES" MML LDA N1 ORA N1+1 BEQ :Z1 LDA N2 ORA N2+1 BEQ :Z2 STZ N1+2 STZ N1+3 LDX #3 :Z STZ RES,X DEX BPL :Z :MA LSR N2+1 ROR N2 BCC :MB CLC LDA RES ADC N1 STA RES LDA RES+1 ADC N1+1 STA RES+1 LDA RES+2 ADC N1+2 STA RES+2 LDA RES+3 ADC N1+3 STA RES+3 :MB ASL N1 ROL N1+1 ROL N1+2 ROL N1+3 LDA N2 ORA N2+1 BNE :MA SEC LDA RES SBC RES+2 STA RES LDA RES+1 SBC RES+3 STA RES+1 BCS :X INC RES BNE :X INC RES+1 :X RTS :Z1 SEC LDA #1 SBC N2 STA RES LDA #0 SBC N2+1 STA RES+1 RTS :Z2 SEC LDA #1 SBC N1 STA RES LDA #0 SBC N1+1 STA RES+1 RTS * "INV" CALCULATES THE MULTIPLICATIVE INVERSE * INPUT: 16-BIT INTEGER AT "M2" * OUTPUT: 16-BIT INTEGER AT "B2" INV LDA M2 ORA M2+1 BNE :N STZ B2 STZ B2+1 RTS :N PHX LDA #1 STA M1 STZ M1+1 STA M1+2 STZ M1+3 STA B2 STZ B2+1 STZ B2+2 STZ B2+3 STZ B1 STZ B1+1 STZ B1+2 STZ B1+3 STZ M2+2 STZ M2+3 :LOOP LDX #3 :XN LDA M1,X STA N1,X LDA M2,X STA N2,X DEX BPL :XN JSR DIV LDA RES ORA RES+1 ORA RES+2 ORA RES+3 BEQ :X LDX #3 :XR LDA M2,X STA M1,X LDA RES,X STA M2,X LDA B2,X PHA STA N2,X DEX BPL :XR JSR MUL SEC LDA B1 SBC RES STA B2 LDA B1+1 SBC RES+1 STA B2+1 LDA B1+2 SBC RES+2 STA B2+2 LDA B1+3 SBC RES+3 STA B2+3 PLA STA B1 PLA STA B1+1 PLA STA B1+2 PLA STA B1+3 BRA :LOOP :X BIT B2+3 BPL :X2 INC B2 BNE :X2 INC B2+1 :X2 PLX RTS M1 DS 4 X1 = M1 X2 = M1+2 M2 DS 4 X3 = M2 X4 = M2+2 B1 DS 4 X3B = B1 KK = B1+2 B2 DS 4 T1 = B2 T2 = B2+2 * "MUL" PERFORMS 32-BIT MULTIPLICATION * INPUT: 32-BIT INTEGER AT "N1" * 32-BIT INTEGER AT "N2" * OUTPUT: 32-BIT INTEGER AT "RES" MUL LDX #3 :Z STZ RES,X DEX BPL :Z :MA LSR N2+3 ROR N2+2 ROR N2+1 ROR N2 BCC :MB CLC LDA RES ADC N1 STA RES LDA RES+1 ADC N1+1 STA RES+1 LDA RES+2 ADC N1+2 STA RES+2 LDA RES+3 ADC N1+3 STA RES+3 :MB ASL N1 ROL N1+1 ROL N1+2 ROL N1+3 LDA N2 ORA N2+1 ORA N2+2 ORA N2+3 BNE :MA RTS * "DIV" PERFORMS 32-BIT DIVISION * INPUT: 32-BIT INTEGER AT "N1" * 32-BIT INTEGER AT "N2" * OUTPUT: 32-BIT INTEGER AT "N1" (QUOTIENT) * 32-BIT INTEGER AT "RES" (REMAINDER) DIV LDX #3 :Z STZ RES,X DEX BPL :Z LDX #32 ASL N1 ROL N1+1 ROL N1+2 ROL N1+3 :L ROL RES ROL RES+1 ROL RES+2 ROL RES+3 LDA RES CMP N2 LDA RES+1 SBC N2+1 LDA RES+2 SBC N2+2 LDA RES+3 SBC N2+3 BCC :E LDA RES SBC N2 STA RES LDA RES+1 SBC N2+1 STA RES+1 LDA RES+2 SBC N2+2 STA RES+2 LDA RES+3 SBC N2+3 STA RES+3 :E ROL N1 ROL N1+1 ROL N1+2 ROL N1+3 DEX BNE :L RTS N1 DS 4 N2 DS 4 RES DS 4