LIST FIXED,C=120,F=INHX8M,N=89,P=PIC16C73,R=DEC,T=OFF,W=0,X=OFF ERRORLEVEL -305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; TEA16 - Tiny Encryption Algorithm Written by Andy Warren ; ; Version 0.2 9:30 pm, 20 April 1998 ; ; ; ; (C) Fast Forward Engineering 1998 ; ; All Rights Reserved ; ; ; ; TEA was developed by David Wheeler and Roger Needham at the Computer ; ; Laboratory of Cambridge University. ; ; ; ; Written for the Microchip Technology PIC16C73 microcontroller (although ; ; it'll run on any of the PIC16 devices with at least 37 bytes of RAM). ; ; ; ; At 20 MHz, these routines will encrypt or decrypt about 6K bytes per ; ; second. ; ; ; ; This program must be assembled with Microchip's MPASM assembler, version ; ; 1.30.00 or above. ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CBLOCK 020H K03 ;Most-significant byte of the key. K02 ; K01 ; K00 ; ; K13 ; K12 ; K11 ; K10 ; ; K23 ; K22 ; K21 ; K20 ; ; K33 ; K32 ; K31 ; K30 ;Least-significant byte of the key. SUM3 ;MSB of SUM. SUM2 ; SUM1 ; SUM0 ;LSB of SUM. Y3 ;MSB of Y. Y2 ; Y1 ; Y0 ;LSB of Y. Z3 ;MSB of Z. Z2 ; Z1 ; Z0 ;LSB of Z. L3 ;MSB of L, a temporary variable. L2 ; L1 ; L0 ;LSB of L. C3 ;MSB of C, another temporary variable. C2 ; C1 ;2nd-LSB of C. R3 ;MSB of R, another temporary variable. R2 ; R1 ; R0 ;LSB of R. COUNT ;Number-of-rounds counter. ENDC ; ; MAIN ; ORG 0 START: MOVLW 0 ;KEY = 0000 0000 0000 0000. MOVWF K03 ; MOVLW 0 ; MOVWF K02 ; MOVLW 0 ; MOVWF K01 ; MOVLW 0 ; MOVWF K00 ; MOVLW 0 ; MOVWF K13 ; MOVLW 0 ; MOVWF K12 ; MOVLW 0 ; MOVWF K11 ; MOVLW 0 ; MOVWF K10 ; MOVLW 0 ; MOVWF K23 ; MOVLW 0 ; MOVWF K22 ; MOVLW 0 ; MOVWF K21 ; MOVLW 0 ; MOVWF K20 ; MOVLW 0 ; MOVWF K33 ; MOVLW 0 ; MOVWF K32 ; MOVLW 0 ; MOVWF K31 ; MOVLW 0 ; MOVWF K30 ; MOVLW 0 ;PLAINTEXT = 0000 0000. MOVWF Y3 ; MOVLW 0 ; MOVWF Y2 ; MOVLW 0 ; MOVWF Y1 ; MOVLW 0 ; MOVWF Y0 ; MOVLW 0 ; MOVWF Z3 ; MOVLW 0 ; MOVWF Z2 ; MOVLW 0 ; MOVWF Z1 ; MOVLW 0 ; MOVWF Z0 ; ; AT THIS POINT, Y3-Z0 CONTAIN THE PLAINTEXT. CALL ENCODE ;ENCODE IT. ; AT THIS POINT, Y3-Z0 CONTAIN THE CIPHERTEXT. CALL DECODE ;DECODE IT. ; AT THIS POINT, Y3-Z0 CONTAIN THE PLAINTEXT AGAIN. NOP STOP: GOTO STOP ; ; Encode Routine ; ; Routine, written in the C language, for encoding with key k[0] - k[3]. ; Data in v[0] and v[1]. ; ; void code(long* v, long* k) ; { ; unsigned long y=v[0],z=v[1], sum=0, /* set up */ ; delta=0x9e3779b9, n=32 ; /* a key schedule constant */ ; ; while (n-- > 0) ; { /* basic cycle start */ ; sum += delta ; ; ; y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; ; z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; /* end cycle */ ; } ; ; v[0]=y ; v[1]=z ; ; } ; ENCODE: CLRF SUM3 ;SUM = 0. CLRF SUM2 ; CLRF SUM1 ; CLRF SUM0 ; MOVLW 32 ;N = 32. MOVWF COUNT ; ELOOP: MOVLW 0B9H ;SUM += 0x9E3779B9. ADDWF SUM0 ; ; MOVLW 079H ; SKPNC ; MOVLW 07AH ; ADDWF SUM1 ; ; MOVLW 037H ; SKPNC ; MOVLW 038H ; ADDWF SUM2 ; ; MOVLW 09EH ; SKPNC ; MOVLW 09FH ; ADDWF SUM3 ; ; y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] CALL ZK01SUB ;L = (Z<<4)+K[0] ^ Z+SUM ^ (Z>>5)+K[1] MOVF L0,W ;Y += L. ADDWF Y0 ; ; MOVF L1,W ; SKPNC ; INCFSZ L1,W ; ADDWF Y1 ; ; MOVF L2,W ; SKPNC ; INCFSZ L2,W ; ADDWF Y2 ; ; MOVF L3,W ; SKPNC ; INCFSZ L3,W ; ADDWF Y3 ; ; z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] CALL YK23SUB ;L = (Y<<4)+K[2] ^ Y+SUM ^ (Y>>5)+K[3] MOVF L0,W ;Z += L. ADDWF Z0 ; ; MOVF L1,W ; SKPNC ; INCFSZ L1,W ; ADDWF Z1 ; ; MOVF L2,W ; SKPNC ; INCFSZ L2,W ; ADDWF Z2 ; ; MOVF L3,W ; SKPNC ; INCFSZ L3,W ; ADDWF Z3 ; DECFSZ COUNT ;DONE ALL 32 ROUNDS? GOTO ELOOP ;IF NOT, LOOP BACK AND DO ANOTHER ONE. RETURN ;OTHERWISE, RETURN WITH CIPHERTEXT IN ;Y3 (MSB) THROUGH Z0 (LSB). ; ; Decode Routine ; ; void decode(long* v,long* k) ; { ; unsigned long n=32, sum, y=v[0], z=v[1], ; delta=0x9e3779b9 ; ; ; sum=delta<<5 ; ; /* start cycle */ ; while (n-- > 0) ; { ; z -= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; ; y -= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; ; ; sum -= delta ; ; } ; /* end cycle */ ; v[0] = y ; v[1] = z ; ; } ; DECODE: MOVLW 0C6H ;SUM = 0x9E3779B9 << 5. MOVWF SUM3 ; MOVLW 0EFH ; MOVWF SUM2 ; MOVLW 037H ; MOVWF SUM1 ; MOVLW 020H ; MOVWF SUM0 ; MOVLW 32 ;N = 32. MOVWF COUNT ; GOTO SKIPSUM ;JUMP INTO THE LOOP. DLOOP: MOVLW 0B9H ;SUM -= 0x9E3779B9. SUBWF SUM0 ; ; MOVLW 079H ; SKPC ; MOVLW 07AH ; SUBWF SUM1 ; ; MOVLW 037H ; SKPC ; MOVLW 038H ; SUBWF SUM2 ; ; MOVLW 09EH ; SKPC ; MOVLW 09FH ; SUBWF SUM3 ; ; z -= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] SKIPSUM: CALL YK23SUB ;L = (Y<<4)+K[2] ^ Y+SUM ^ (Y>>5)+K[3] MOVF L0,W ;Z -= L. SUBWF Z0 ; ; MOVF L1,W ; SKPC ; INCFSZ L1,W ; SUBWF Z1 ; ; MOVF L2,W ; SKPC ; INCFSZ L2,W ; SUBWF Z2 ; ; MOVF L3,W ; SKPC ; INCFSZ L3,W ; SUBWF Z3 ; ; y -= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] CALL ZK01SUB ;L = (Z<<4)+K[0] ^ Z+SUM ^ (Z>>5)+K[1] MOVF L0,W ;Y -= L. SUBWF Y0 ; ; MOVF L1,W ; SKPC ; INCFSZ L1,W ; SUBWF Y1 ; ; MOVF L2,W ; SKPC ; INCFSZ L2,W ; SUBWF Y2 ; ; MOVF L3,W ; SKPC ; INCFSZ L3,W ; SUBWF Y3 ; DECFSZ COUNT ;HAVE WE DONE ALL 32 ROUNDS? GOTO DLOOP ;IF NOT, LOOP BACK AND DO ANOTHER. RETURN ;OTHERWISE, RETURN WITH PLAINTEXT IN ;Y3 (MSB) THROUGH Z0 (LSB). ; ; SUBROUTINES COMMON TO "ENCODE" AND "DECODE". ; ZK01SUB: SWAPF Z3,W ;L = Z << 4. ANDLW 11110000B ; MOVWF L3 ; SWAPF Z2,W ; ANDLW 00001111B ; IORWF L3 ; ; SWAPF Z2,W ; ANDLW 11110000B ; MOVWF L2 ; SWAPF Z1,W ; ANDLW 00001111B ; IORWF L2 ; ; SWAPF Z1,W ; ANDLW 11110000B ; MOVWF L1 ; SWAPF Z0,W ; ANDLW 00001111B ; IORWF L1 ; ; SWAPF Z0,W ; ANDLW 11110000B ; MOVWF L0 ; SWAPF Z3,W ;R = (Z >> 5). MOVWF R3 ; RRF R3 ; MOVLW 00000111B ; ANDWF R3 ; ; RRF L3,W ; MOVWF R2 ; ; RRF L2,W ; MOVWF R1 ; ; RRF L1,W ; MOVWF R0 ; MOVF K00,W ;L += K[0]. ADDWF L0 ; ; MOVF K01,W ; SKPNC ; INCFSZ K01,W ; ADDWF L1 ; ; MOVF K02,W ; SKPNC ; INCFSZ K02,W ; ADDWF L2 ; ; MOVF K03,W ; SKPNC ; INCFSZ K03,W ; ADDWF L3 ; MOVF K10,W ;R += K[1]. ADDWF R0 ; ; MOVF K11,W ; SKPNC ; INCFSZ K11,W ; ADDWF R1 ; ; MOVF K12,W ; SKPNC ; INCFSZ K12,W ; ADDWF R2 ; ; MOVF K13,W ; SKPNC ; INCFSZ K13,W ; ADDWF R3 ; MOVF Z3,W ;SETUP TO CALCULATE L = (Z + SUM) ^ R ^ L. MOVWF C3 ; MOVF Z2,W ; MOVWF C2 ; MOVF Z1,W ; MOVWF C1 ; MOVF Z0,W ; GOTO ADDANDXOR ;GO CALCULATE IT AND RETURN. YK23SUB: SWAPF Y3,W ;L = Y << 4. ANDLW 11110000B ; MOVWF L3 ; SWAPF Y2,W ; ANDLW 00001111B ; IORWF L3 ; ; SWAPF Y2,W ; ANDLW 11110000B ; MOVWF L2 ; SWAPF Y1,W ; ANDLW 00001111B ; IORWF L2 ; ; SWAPF Y1,W ; ANDLW 11110000B ; MOVWF L1 ; SWAPF Y0,W ; ANDLW 00001111B ; IORWF L1 ; ; SWAPF Y0,W ; ANDLW 11110000B ; MOVWF L0 ; SWAPF Y3,W ;R = (Y >> 5). MOVWF R3 ; RRF R3 ; MOVLW 00000111B ; ANDWF R3 ; ; RRF L3,W ; MOVWF R2 ; ; RRF L2,W ; MOVWF R1 ; ; RRF L1,W ; MOVWF R0 ; MOVF K20,W ;L += K[2]. ADDWF L0 ; ; MOVF K21,W ; SKPNC ; INCFSZ K21,W ; ADDWF L1 ; ; MOVF K22,W ; SKPNC ; INCFSZ K22,W ; ADDWF L2 ; ; MOVF K23,W ; SKPNC ; INCFSZ K23,W ; ADDWF L3 ; MOVF K30,W ;R += K[3]. ADDWF R0 ; ; MOVF K31,W ; SKPNC ; INCFSZ K31,W ; ADDWF R1 ; ; MOVF K32,W ; SKPNC ; INCFSZ K32,W ; ADDWF R2 ; ; MOVF K33,W ; SKPNC ; INCFSZ K33,W ; ADDWF R3 ; MOVF Y3,W ;SETUP TO CALCULATE L = (Y + SUM) ^ R ^ L. MOVWF C3 ; MOVF Y2,W ; MOVWF C2 ; MOVF Y1,W ; MOVWF C1 ; MOVF Y0,W ; ; ;FALL THROUGH TO "ADDANDXOR". ; ; ENTER WITH MOST-SIGNIFICANT 3 BYTES OF Y OR Z IN C3-C1, LEAST-SIGNIFICANT ; BYTE IN W. ; ADDANDXOR: ADDWF SUM0,W ;L = (C + SUM) ^ R ^ L. XORWF R0,W ; XORWF L0 ; ; MOVF SUM1,W ; SKPNC ; INCFSZ SUM1,W ; ADDWF C1 ; MOVF C1,W ; XORWF R1,W ; XORWF L1 ; ; MOVF SUM2,W ; SKPNC ; INCFSZ SUM2,W ; ADDWF C2 ; MOVF C2,W ; XORWF R2,W ; XORWF L2 ; ; MOVF SUM3,W ; SKPNC ; INCFSZ SUM3,W ; ADDWF C3 ; MOVF C3,W ; XORWF R3,W ; XORWF L3 ; RETURN ;RETURN. END