ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA ELÉCTRICA TEMA 'DISEÑO DE UN SISTEMA DE ENCRIPTACION DE VOZ UTILIZANDO EL MICROPROCESADOR ADSP-2181" LISTADO DE PROGRAMAS NOMBRE MIGUEL E. VICUÑA MUÑOZ Quito, Noviembre de 1.999 LISTADO DE LOS PROGRAMAS Y ALGORITMOS UTILIZADOS PARA EL PROCESO DE ENCRIPTACIÓN Y DESENCRIPTACIÓN DJE LA SEÑAL DE VOZ. Para la comprobación y ejecución de los programas principales de Encriptación y Desencriptación con sus respectivos algoritmos, es necesario que en el computador se haya instalado el siguiente sotfware, el cual viene incluido con el EZ-Kit Lite: C:\ADIJDSP\N (Assembler, Linker, Simulador, Prom Splitter) 21XX\LIB (Archivos de Descripción de la Arquitectura) 21XX\EZfGTL (Programa Host, y Programas Utilitarios) Los archivos que contienen los utilitarios para ejecutar los programas en el EZ-LAB y los programas de encriptación y desencriptación de la señal de voz, escritos en el lenguaje ensamblador del ADSP-2181 son: C:\ENCRIPTAC10N\P (Programa de Inicialización) IN1_KJK3.DSP (Programa de Inicialización) REG_CTRL.DSP (Programa de Control de Registros) FIN.DSP (Programa de Finalización) EZKIT_LT.ACH (Archivo de Descripción de la Arquitectura) PERMUTA\p (Algoritmo E/D N°l) Tx_perm.dsp Tx_perm.lin Rx_perm.dsp Rx__perm.lin Tablapl.hex Tablap2.hex XOR\\\\p dexor.dsp Tx_xor.dsp Tx_xor.lin (Algoritmo E N° 2) (Algoritmo D N° 2) Rx_xor.dsp Rx_xor.lin pseu.dsp (Algoritmo E/DN" 3) Tx_pseu.dsp Tx.__pseu.Iin Rx_pseu.dsp Rx_pseu.lin pseu2l81.dsp Tx_p2181.dsp Tx_p2l81.1in Rx_p2181.dsp Rx_p2181.1in (Algoritmo E/D N° 4) dcs'2181.dsp (Algoritmo E N° 5 ) (Algoritmo D N° 5) idcs2181.dsp gen_key.dsp Tx_dcs.dsp Tx_des.Iin Rx_des.dsp Rx des.lin Todo los archivos indicados en cada una. de las carpetas anteriores (dentro de C:\EncriptacionV.), son archivos de textos que contienen los algoritmos de cncriptación y clesencriptación, así como los programas principales con los cuales se ejecutan en cada uno de los bloques del sistema (Tx_*.dsp y Rx_*.dsp). Estos archivos de programa se encuentran en lenguaje ensamblador, el cual puede ser editado utilizando cualquier editor de texto, como por ejemplo el cdit de DOS, lo importante es que el archivo que contenga el listado del programa sea de extensión .DSP. Una vez escrito los programas en lenguaje ensamblador con extensión .DSP, se procede a Compilar y Enlazar, el archivo fuente utilizando los programas Assembler (asm21.exe) y Linkcr (Id21.exe), mediante las siguientes intrucciones desde el DOS: Assembler: C:\Encriplacion\CARPETA\asm2t programa -2181 Con este paso se genera a partir del archivo fuente programa.dsp como respuesta tres archivos, .CDE, .INT, .OBJ. El swítch -2T81 utilizado es aquel que le permite al Assembler aceptar instrucciones especificas del ADSP-2181. Algo muy importante que hay que indicar es que todos los archivos *.dsp deben ser previamente esamblados separadamente para luego ser enlazados y formar así un programa ejecutable. Linker; C:\Encriptacion\CARPETA\ld21-i programa.lin-a ..\ezkil_lt -e programa -x -g En es*ie paso el Linkcr crea un archivo ejecutable a partir de los módulos objeto creados por el Assembler, dando como resultado el archivo programa.exe. Los switchs utilizados en este proceso nos dan las posibilidades de: -i programa.lin : Los archivos listados en el archivo indirecto programa.lin son enlazados. -a ..\: El archivo de arquitectura es leído por el Linker. -e programa: El nombre del archivo dudo a los archivos de salida es programa.exe -x: Genera un archivo del mapa de memoria -MAF. -g: Genera un archivo de tabla de símbolos .SYM E3 archivo programa.lin es un listado donde se encuentran todos los archivos que se van a enlazar mediante el programa Linker (Id2l.exe) para generar un archivo ejecutable programa.exe. A continuación se detalla el contenido de cada uno de los archivos, .lin que se utilizaron en este trabajo de tesis. C:\Encriptacion\Permuta\Tx_perm.lin\Tx_perm permulG C:\Encnptacion\Permuta\Rx_perm.lin\Rx_perm permu!6 C:\Encriptacion\Xor\Txjsor.lin\Tx_xor Xor C:\Encriptacion\Xor\Rx_xorJin\Rx_xor Dexor C:\Encnptacion\Pseu\Tx_pseu.linYTx_pseu pseu2!81 C:\En criptacion\Pseu\Rx_pseu.lm\Rx_pseu pseu2181 C:\Encripiacion\Pseu2181\Txjp2181Jin\Tx_p2l81 . .\permuta\perrnul6 pseu2181 ..\xor\xor C:\Encriptacion\Pseu2181\Rx_p2181.Iin\Rx__p2181 ..\permuta\permul6 pseu2181 ..\xor\xor C:\Encriptacion\Des\Tx_dcs.lin\Tx_des ..\permuta\permul6 des2181 ..\xor\xor C:\Encriptacion\Oes\Rx_desJhi\Rx__des ..\permuta\permul6 ides2181 ..\xor\xor gen key Una vez obtenido el programa ejecutable programa.exe, este se almacena en el ADSP2181 utilizando el Programa Host proporcionado en el EZ-KIT Lite, para ejecutar los procesos de encriptación (Tx_*.exe) y dcsencriptación (Rx_*.exe) en cada uno de los bloques del sistema. Algoritmos de Encriptación N;^ ^(Archivo ejecutable en el ADSP-2181) Out Esquema del Bloque de Encriptación. f^'iuWitt.jpá'fti-^iC'w^í "K**iM?w-y-t9rrr/«*K'K-ií í.'- r^wííyHíy^í;^i'vs*ipy«í*'Jsaipiwtir£*tíSi*^Vví^M3a« Out Esquema del Bloque de Desencriptación A continuación se encuentra el listado de todos los archivos fuentes en lenguaje emsamblador que se utilizaron en la tesis: "DISEÑO DE UN SISTEMA DE ENCRIPTACION DE VOZ, UTILIZANDO ELMICROPROCESADORADSP-2181" Programa cié Tnici'aliznción ÍNI7.DSP: Este programa incluye los archivos de inicialización del microprocesador ADSP-21S1 y del codee ADIS47. Se utiliza con los programas de Tx_*.DSP y Rx_*.DSP de los algoritmos de encriplación y desencripLación respectivamente. Excepto en los del algoritmo DES2181.DSPe IDES2181.DSP { ¡ni7.clsp - Programa de Inicializacion del ADSP-2181 y el CODEC Miguel E. Vicuña Muñoz/ Encriptacíón de Voz/ Octubre 1999 Código lomado del programa mic2out.dsp de Analog Devices, Modificado para utilizar i6,Í7,m7 para laTx. y Rx de datos del CODEC Incluye siibrutina de atención a la Interrupción IRQ2 í { Variable and Buffer declarations .var/dm/ram/circ rx_buf[3]; {Status + L data -f- R data, AD1847 rx buffcr} .var/dm/ram/circ tx_buf[3]; {Cmd + L data + R data, AD1847 tx buffer) .var/dm/ram/circ init_cmds[13]; .var/din stat_flag; .var/dm fin_flag; | Variable and buffer initializaüon .init tx_buf: OxcOOO, 0x0000, 0x0000; {Initially set MCE} .init ¡n¡t_cinds: Oxc003, { Lcíl input control reg b7-6: 0=Ieft Une 1 - l=left aux 1 2=leftline2 3=lefl Une 1 post-mixed loopback b5-4:res b3-0: lefl ¡nput gain x 1.5 dB 1 Oxcl03, { Righí input control reg b7-6: 0=nght Une 1 I=right aux 1 2=rigbt Une 2 3=right Une 1 post-mixed loopback b5-4: res b3-0: right input gain x 1.5 dB Oxc2SS, { Icft aux 1 control reg b7 : l=Ieft aux 1 mulé b6-5: res b4-0: gaín/atten x 1.5, 08= OdB, 00= 1 2dB } Oxc3SS, { right aux 1 control reg b7 : l=righí aux ! mulé b6-5: res Oxc4S8, Oxc588, OxcóSO, Oxc780, b4-0: gaín/attcn x 1.5, 08= OdB, 00= 12dB } { Icft aux 2 control reg b7 : l=lefl. aux 2 nnitc b6-5: res b4-0: gain/atlen x 1.5, 08= OdB, 00= 12dB } { righí aux 2 control reg b7 : I=right aux 2 mute b6-5: res b4-0: gain/atlen x 1.5, 08= OdB, 00= 12dB } { leít DAC control reg b? : I=!efl DAC mute b6 : res b5-Q; attenuatíon x 1.5 dB } { right DAC control reg b7 : l=right DAC mute b6 : res b5-0: attenuaíion x 1.5 dB data forma t register b7 : res b5-6: 0=8-bit unsigned linear PCM I=8-bÍt u-law companded 2=16-bitsigned linear PCM 3=8-bÍt A-Ia\ companded b4 : 0=mono, l=stereo bO-3: 0= 8, 1= 5.5125 2^ 16. 3=* 11.025 4= 27.42857 5= 18.9 6=32. 7= 22.05 8= . 9=37.8 } c=48. d= 33.075 e= 9.6 f= 6.615 (bO): 0=XTAL1 24.576 MHz; I=XTAL2 16.9344 MHz Oxc909, interface configuration reg b7-4: res b3 : l=autocalibratc b2-1: res bO : l=playback enablcd OxcaOO, pin b7 b6 b5 control reg logíc state of pin XCTL1 logic state of pin XCTLO mastcr- l=lri-state CLKOUT slave -x-tri-stalcCLKOUT b4-0:res 0,xcc40, miscellaneous information reg b7 : 1=1 6 slots per frame, 0=32 slots per frame b6 : I=2-wirc system, 0=1 -wire system b5-0: res OxcdOO; _ digital mix control 'reg b7-2: attenuation x 1,5 dB b I : res bO : l=digital mix enabled Interrupt vector table -dis ints; jump start; rti; rti; {00: reset} jump irq2; rti; rti; rti; {04: IRQ2J rli; rti; rli; rti; {08: IRQLI-} rti; rli; rti; rti; {Oc: 1RQLOJ ar = dm(slat_flag); ar=passar; • if eq rt!; jump ncxt_cmd; 10: SportOtx} jump Ínput_samp]es; rti; rti; rti; {14:SportOrx} jump irqe; rti; rl¡; rti; {18: IRQE} rti; rti; rti; rti; {le: BOMA} rti; rti; rti; rti; {20: Sport 1 t x o r I R Q l } rti; rti; rti; rti; {24:Sportl rxorIRQO} {28: timer} rti; rti; rti; rti; rti; rti; rti; rti; {2c: power down} {—: ADSP 2181 intialization stait: ¡ó = A r.x_buf; ICÍ = %r,\_buf; ¡7 = A lx_buf; I7 = %tx__buf; ¡3 = A inÍt__cmds; 13 =%in¡t_cmds; mi = 1; m i - I; {poínl lo slart of buffcrj {inilialíze lenglh rcgister} Serial Port O (SportO) Sct Up axO = OxOfef; dm (SportO_Autobuf_CtrI) = axO; axO = 0; dm (SportO_Rfsdiv) = axO; axO = 0; dm (SportO_Sclkdiv) = axO; axü - b# 100001100000 l i l i ; dm (SportO_Ctrí_Reg) = axO; axO =* btfOOOOQOOOOQOOO 1 1 1 ; dm (SportO_Tx_WordsO) = axO; axO = b#000000000000011 I ; dm (SporlO_Tx_WordsI) = axO; axO = b//OOOOOOÜ0000001 11; dm (SportO_Rx_WordsO) = axO; axO = b//0000000000000111; dm (S|iortO_Rx_Words 1) = axO; Sportl Set Up dm(Sporll__Auíobur_Ctrl) - axO; dm(Sportl_Rrsdív) = axO; dm(Sport l_Sc!kdiv) - axO; dm(Sportl_Ctrl__Reg) = axO; dni(Tscale_Reg) = axO; dm(Tcount_Reg) == axO; dm(Tper¡od__Reg) ~ axO; {autobuffering disabled} {Rfsdiv not used} {Sclkdiv not used} {control functions disabled} {timer not used} - Syslcm ancl Memory Set Up axO = b#0000000000000000; dm (Dm_Wait_Reg) = axO; axO = bflOOO1000000000000; dm (Sys_CtrI_Reg) « axO; ifc = bffOOOOOOl 1 l i l i l í ; nop; {clcar pending interrupt) jenable SportO} 10 icnll = btfOQOOO; mstat = bfí i 000000; ADSP 1847 Codee intíalization axO = I-; dm(slat_riag} = axO; ena inls; imask = b#0001000000; axO = din (i?, m7); txO = :ixO; check_Jnit: axO-= din (slatjlag); af = píiss axO; if n c j u m p check_ínit; ayO = 2; check_aci I: axO = din (rx_buf); a r = axO and ayO; i f c q jump chcck_ac¡l; check_ací2: axO = dm (rx_buQ; ar = nxO and ayO; If ncjump cheek_acÍ2; ¡dle; {clear flag} {cnable transmit inteniipt} {start interrupt} {wait for en tire Init} {buffer to besent lo} {the codee } {once initialized, wait for codee} {to come out of autocalibration} {wait for bit set} [wait for bit clear} ayO = OxbOf; axO = dm (inít_cmds + 6); ar=axO ANDayO; dm (tx_buf) = ar; id le; {unmutc left DAC} axO = din (iníl_cnids + 7); ur = axO ANDayO; dm (tx_buO = ar; idle; {unmute ríghlDAC} axO = Oxc901; {clear autocalibration request} idle; ax 1 = OxíJOOO; dm(tx_bur) = a x l ; {control word tó clear over-range flags} ifc = b#Oüí)00011111 nop; ¡clear any pending interrupt} iniask = OxO(); axO = 0; din(fin_nag) = axO; jenable rxO interrupt} {Inicializa fin_flag} 11 Programa do Registros de Control REG_CTRL.DSP: Esle es un programa donde constan los Registros de Control Mapcados en Memoria, Se lo utiliza en los programas de Tx_* .DSP y Rx_*.DSP de los algoritmos de encriptación y desencriplacíón respectivamente. Excepto en los del algoritmo DES2181.DSP e IDES21S1.DSP, ya que éste viene incluido en el programa INIJCIK3.DSP { rcg_ctrl.dsp - Registros de control del ADSP-2181 Miguel E. Vicuña Muño?,/ Encriplación de Voz/ Octubre 1999 } .consl .consl .const .const .const .const .const .const .const .consl .const .const .const .const .const .const .const .const .const .const .const .const .const .const Sys_Ctrl_Reg= Dm_Wait_Rcg= Tperiod_Reg= Tcount_Reg= TscaIe_Reg= SpürtOJlx_Wordsl= SportO_Rx_WordsO= SportO_Tx_Wordsl = SportO_Tx_WordsO= SportO_Ctrl_Reg= '' SportO_Sclkdiv= SportO_Rrsdiv= B SportO_Aiitobuf,Ctrl=" Sportl_Ctrl_Reg= Sportl_Sclkdiv= Sportl_Rfsdiv= Sportl_Aiitobuf_Ctrl= Prog_Flag_Type= Prog_Plag__Datci= BDMA_Word_Count= BDMA_Control= BDMA_I;xtcrnal_Addrcss= BDMA_Intemíil_Address= IDMA Conlrol= 0x3 fTf; Ox3fie; • 0x3 íTd; Ox3ffc; 0,x3ffb; Ox3fTa; Ox3ff9; Ox3ff8; Ox3ff7; Ox3ff6; Ox3ff5; 0x3 ff4; Ox3ff3; 0x3 ff2; Ox3fFl; Ox3f¡Ü; Ox3fcf; Ox3fe6; 0x3 fc5; Ox3M; 0x3 fe3; 0x3fe2; 0x3fe 1; Ox3fcO; (System Control Registcr) {Data Memory Wait Control Rcgister} {Timer Pcnod} {Timcr Count) {Timer Scalíng Factor} {SportO Mullichannel Receivc} {Word Enable Regísíer (32-bil)} {SporLO Multichannel Transmit} {Word Enable Regisicr (32-bit)} {SportO Control Regíster} {SportO Serial Clock Divide Modulus} {SportO Rcv Frame Sync Divide Modulus} {SporíO AutobuHer Control Register} {Sportl Control Regisíer} {Sportl Serial Clock Divide Modulus} {Sportl Rcv Frame Sync Divide Modulus} {Sportl Autobufler Control Register} 12 Programa Ue l n i d a l í z a c í ú n ns T JJ<IK3.DSP: Al igual que en el programa JN17.DSP se incluye en este programa los archivos de iniciíilización del inícroprocesador ADSP-2181 y del codee AD1847. Se lo utiliza en los programas de T.x y R.x de ¡os algoritmos DES21SI.DSP e IDES. { ini_kik3.dsp-Proyrma de Inicinlíxücion del ADSP-2181 y el CODEC Miguel E. Vicuña iMiiiloz/ Encripüicíón de Va1/. I Octubre 1999 Código tomado del programa mic2oul.dsp de Analog Devices, Incluye stibrulina de atención a la Inlcrrtipcion 1RQ2 .modulc/RAM/ABS^O Encriplacion_dc_voz; { C o n s t a n ! Declaralions {inciiHiry mappcd ADSP-2181 c o n t r o l rcgistcr.s) .const Sys_CtrI_Reg= Qx3fff; .const Dm_W;iit_Reg=Ox3frc; .const Tpcriod_Rcg= Ox3ffd; {System Control Rcgísler} {Data Memory Wail Control Register} {Timcr Períod} .const Tcount_Reg= 0x3 ÍTc; {Tínicr Count} .consl .const .const .const .const .consl .consl .const .consl .const .const .const .const .const .const .consl .const .const .const {Timer Scaling Factor} {SportO Multichanncl Rcccive} {Word Enable Rcgislcr(32-bit)f {SportO Multichanncl Transmití {Word Enoble Regislcr (32-bit)} {.SportO Control Rcgístcr} ¡SporlO Serial dock Divide Modultis) . {SportO Rcv Frame Sync Divide Modulus} {SporlO Autobuffer Control Regislcr) {Sportl Control Register} {Sport 1 Serial dock Divide Modulus} {Sportl Rcv Frame Sync Divide Modulus} {Sportl Autobuffer Control Register} Tscale_Rcg- 0x3 fíb; SporlÜ_Rx_Words 1=0x3fía; SportO_Rx_WordsO= 0x3nV; SporlO_Tx_Wordsl = Ox3ff8; SporlO_Tx_\VordsO= Ox3ff7; SporlO_ClrI_Rcg* Ox3fnS; Sporlt)_Sclkdiv= Ox3ff5; SportO_Rfsd¡v= 0x3ff4; SportO_Aulobuf__Ctr[=Ox3rD; Sportl_CLrI_Rcg==Ox3ff2; Sport l_Sclkdiv= 0x3ffl; Sportl_Rfsdiv= 0x3ffÜ; SportI_Aulobuf_Círl=Ox3fcr; Prog_Flag_Typc=Ox3fe6; Prog Flag_Data=Ox3fe5; I3DMA_Word_CouiU=* 0x3fc4; I3DMA_Comrol= 0x3fe3; !3DMA_E.xterna!_Addrcss= Ox31"e2; I3DMA_Intenuil_Address= 0x3feI; .consl IDMA Control= Ox3fcO; Viii-íahic anü I3iiffcr dechirntions .var/clm/ram/circ rxjniíp]; .var/dni/rani/circ txJ)iif[3J; .VEir/dm/ram/circ Ínit_cmds[I3J; .var/dm staí_flag; .var/dm fi]iriiig; {Status -I- L data+ R data, A D I 8 4 7 rx buffer} ¡Cnid -i- L data 4- R dala, AD1847 tx buffer} 13 Variable and buffcr iniüalization .init tx_buf: OxcOOO, 0x0000, 0x0000; ,inií init_cmcls: OxcOQO, OxclOO, {InHíalIy set MCE} { Lcft input control reg b7-6: 0=leftlinc I I=left aux I 2=lefi I i n e 2 3=left line 1 post-mixed loopback b5-4: res b3-0: l e f t i n p u L g a i n x I . S d B } { Right input control reg b7-6: 0-right line 1 l=riglit aux 1 2=r¡ghtlÍne2 3=right Une 1 post-mixed loopback b5-4: res b3-0: right input gain x 1.5 dB } Qxc2S8, { Icft aux 1 control reg b? : l=Ieft aux 1 imite b6-5: res b4-0: gaín/attcn x 1.5, 08= OdB, 00= 12dB } Oxc388, { right aux 1 control reg b7 : l=right aux 1 mu te b6-5: res b4-0: gíiin/atten x 1.5, 08= OdB, 00= 12dB 1 Oxc488, { leñ aux 2 control reg b7 : l=left aux 2 mute b6-5: res b4-0: güin/atten x 1.5, 08= OdB, 00= 12dB } Oxc5SS, { right aux 2 control reg b? : l=right aux 2 imite b6-5: res b4-0: gain/atten x 1 .5, 08= OdB, 00= 12dB \, { left DAC control reg b7 : M e f t D A C m u l c b6 : res b5-0: attenuation x 1.5 dB OxcVSO, { right DAC control reg 14 b7 : I = r i g h l D A C m u t c bG : res b5-0: atlcnualion x 1.5 clB fs, daln forma t rcgisíer b? :res b5-6: 0=8-bil imsigned linear PCM l=S-bit u-law coinpandcd 2= 16-bÍt signcd linear PCM 3=8-bH A-Ia\ conipanded b'l : 0=1110110, I=sterco bü-3:0= 8. 1= 5.5125 2= 16. 3=11.025 , 4= 27.42857 5= 18.9 6= 32. 7= 22.05 8= . 9=37.8 a= . b= 44.1 c=48. d= 33.075 c= 9.6 f= 6.615 (bO): 0=XTAL1 24.576 MMz; 1^XTAL2 16.9344 MHz Oxc909, ¡nlcrfacc configuration reg b7-4:res b3 : I=autocalibrate b2-1: res bO : l=playback enabled OxcaOO, pin b7 b6 b5 control reg : logic stale ofpin XCTL1 : logic slale o f p i n XCTLO Miiastcr- l=lr¡-sUUe CLKOUT slave -x-lri-slate CLKOUT b4-0: res niisccllancoiis ¡nformalion reg b7 : 1 = 16 .slots per Trame, 0=32 slots per Trame b6 : l=2-wirc system, Ü=I-wirc syslem b5-0: res OxcdOO; digital niix control reg b7-2: altciuiation x 1.5 clB . b 1 : res bu : l=dígital mix enabled } 15 l.nlerrupt vector tablc — juiíip stiirl; rli; rlí; rlf; junip Írq2; rti; rlí; rlí; rlí; rli; rti; rti; rli; rt¡; rli; rli; {00: {04: {OS: {Oc: ar= dm(slaHlag); ar = pass ar; ífcq rli; jump ncxi_cmd; {HhSporlOtx} jimip inpul_sanip!es; rti; rli; jump írqc; rti; rlí; ríi; rli; r[¡; rti; rti; rli: rli; rli; ríi; rli; rli; rli; rli; rli; rli; rti; rti; rti; rli; rti; rti; rli; rescl) 1RQ2} IRQL1) IRQLOJ {!4:SportOrx} {ISMRQEJ {le; BOMA) ¡20: Sport I txorIRQ!} {24: Sport I r x o r I R Q O J ¡28: timer) {2c: powcr downj A D S P 2 I 8 J ¡nlializaliun i slarl: ÍO = Arx buf; !0 = %rjT_bur; ÍI = A tx_buf; II =%lx_buf; ¡3 = Ainil_cmds; 13 =%iníi_cmds; ni 1 = I; {poinf toslart of bufler} (ínitializc Icngth regís [crj { scriiil I'ort O (Spoi'(O) Set Up iixO = b//OOOOÜO!OIOOOOI I I; dm (SportO_Autobuf_C(rl) - axO; axO = 0; n,\ = 0; din (SporlO^RTscliv) = axO; clin (SporlO_Se¡kdiv) - axO; axO = btflOOOOi 1000001111; din (SpoilO_CtrI__Rcg) = axO; axO = bSOOOOOOOOOOOOO! din (SporLO_T.\_WordsO) = axO; iixO = b#00000000000001 din (SporlO_Tx_Wordsl) = axO; axO*b/ÍOOOOOOOOOOOOOI din (SporlO_Rx_WordsO) - axO; axQ = b//OOOÜOOOÜOOOOOl dm (SporlO_Rx_\Vordsl) = axO; Sporí 1 Set Up nxO « 0; diu(SportI_AiilobLif_CtrI)«3xO; dm(Sport l^Sclkdiv) = axO; dmCSport l"Ctr]_Rcg) = axO; {aulaburrcring disabled} ¡Rfídiv not uscd} (Sclkdiv not tisedf {control functions dísablcdj 16 axO = 0; dni(Tscalc_Rcg) = axO; dm(Tcount_Rcg) = axO; {limcr not uscd} dm(Tpcriod_J<cg) = axO; { -------------------------------- System and Memory Set Up ---------------- axO = b/íOGOOOÜOOOOQQOOOO; dm (Dm_Wait_Reg) = axO; axO = b//OÜO!OOOOOOOOÜOOO; dm (Sys_CtrI_Rcg) = axO; jenable SporiO} i fe = bflÜOOOOO ! 1 1 ! 1 1 11 ; nop; {olear pending interrupt} mstat = b# i 000000; AOSP 1847 Codee intiaÜTiation axO= 1; dm(stat_flag) = axO; {clear flag} imosk = W/0001000000; {enable transmit ¡nlerrupl} axO - dm (i 1, m 1); txO = axO; {start interrupt} } checkjnil: íixO = dm (statjlag); {wail for eiUire Init} af = p:iss axO; {buffer lo be sent ío} i f n c j u m p checkjnit; {Ihe codee } ayO = 2; check_acil: axO = dm (rx_buf); a r = axO and ayO; if eq jump check_acil; check_EicÍ2: a.xO = dm (rx_buf); ar= axO and ayO; if ne jump check_aci2; ¡dle; ayO = OxbGf; axO = dm (inil_cmds + 6); ar = axO ANDayO; ti ni (lx_buQ = ar; ¡d le; axO = dm (init_cmds + 7); ar = axO A N D a y O ; {once Initialízed, wait for codee} {to come out of autocalibration} {wait forbit set} {wait for bit clearj {unmute left DAC} {unmute right DAC} 17 clin (Lxjnif) = ar; ¡ule; axO«Oxc-yQl; {clcar aulocalibration rcqucsl) dm(U\_bnQ = axO; idlc; axl =0x3000; clni(tx_biiQ = a.x I; {control word to clear ovcr-range Hags) iíc=bí/QQOOOOm nop; {clcarany pcnding interruplj imaslc=0; {cnnblc rxO inlcmipt} axO = 0; dni(fin_nag)=:ixQ; rcsc! D I ; 18 P r u E i n i m n de Finalización IHN.ÜSP: Este programa se lo u t i l i z a en todos los programas Tx_*.DSP y Rx_*.DSP, como parte final del programa de mucslrco. {Mn.dsp - T'nrlc final tlel pruyrinna de Mu es (re o Migui-l 15. Vicuña M u ñ o z / E n c r i p t n c i ó n de VOY, I Octubre 1999 } Rutina de l:i liitcrriipcifin de Recepcifín- nc.\[_cnid: ena sec_reg; axO = dm (Í3, ni!); (lm (lx_buf) = a.\0; {Obtiene la palabra de comando del bnffcr ¡nit_cmds } ¡Coloca la palabra de comando en la primera localída de lx_buf} nxO = Í3; nyO = A init_cmt!s; a r = axO -ayO; i f g t rti; axO = QxaflJÜ; dm (lx_fauO-axO; - axO = U; dm (s!at_riag} = axO; {Verifica hi existencia do palabras de comando adicionales} {Retorna de la ¡memipcíiín si todav¡a existen palabras esperando} {SÍ no es as¡ rcsetea la stat_flag y remueve MCE si lia terminado la ¡niciaÜzacic'n } {Rcsetea la bandera statjlag} Arcliivo de Descripción de la A r q u i t e c t u r a EZK1T_LT.ACH: Este archivo proporeionado con el EZ-K1.T Lite se especifica con el parámetro —a. Su función es la de describir las características del hardware utilizado con el ADSP-21SI (en este caso el EZ-LAB), Es u t i l i z a d o por el Linkcr y el Simulador para señalar inconsistencia entre el software y y el hardware. EZKIT_LT.ACH $EZKIT $ADSP2181 $ 0 0 0 0 37FF paxIWT_PM_USER t $0000 3DFF dadINT_DM_USER t $ 19 PROGRAMAS DE ENCRIPTACION Y DESENCRIPTACION DE VOZ UTILIZANDO EL ALGORITMO PERMU16.DSP Y PERMU16I.DSP RESPECTIVAMENTE Programa P r i n c i p a l de Encriptacióii: {Tx_PERM.DSP-Programa Principa] de Encripi ación del Algoritmo P E R M U I 6 . D S P Miguel E. Vicuña M u ñ o z / ttncriptaeión de Voz/ Octuhrc 1999 ¡6 ¡7 ni? > Puntero para rx_buf > Puntero para tx_buf > Utilizado para el aulobufcrado: m7=l 1 .MODULE/RAM/ABS=0 | Rx_mueslras_Tx_io; Declaración de constantes utilizadas en el programa .CONST .INCLUDE .EXTliKNAL [s=0xc85l, num=1024 ! n¡vel_ru¡do=0x030r; { fs=5.5125 kl-Iz <..\reg_ctrl.dsp>; permutar; Declaración de variables — A'AR/DM/CIRC/ABS=Q .VAR/DM/CIRC ' xin[num]; xcjx[ñum]; .VAR/DM .1N1T .INIT .1NIT .INIT inicio, inijlenar, ncntr, tabla_per[32]; inicío:Ü; iniJlcnanO; ncnlniHim; tnblajicr:<tahlapl.hcx>; .INCLUDE <..\ini7.dsp>; { Programa para la inicialización de! CODEC y el DSP } mí)=l; 10-%x¡n; iO=Axin; ll=%xc_tx; Íl= A xc_tx; 13=0; axO=num; dni(nciHi') = EixO; axO=0; dm(inicio)=axO; dni(ini_llcnar)=a.xO; resct fl I ; sel flO; set f!2; icníl=b^OOIOO; {Activa bandera flO } {Acliva bandera H2 } { Activa la interrupción IRQ2 por flanco } 20 configurar: imask=0; • ifc=0xff; . nop; ' •. ímnsk=0x230: esperas Elimina interrupciones pendientes } Habiliia IRQB, IRQ2 y el puerto serial SPORTO } {Lazo principal del programa } idlc; axO=dm(r¡n_nag); ar=pass axO; Í f u e rts; jump espera; ¡ , S u b r u t i n a d o n d e se procesa las muestras de entrada en base al algoritmo PERMU16.DSP Ínput_?amples: ena sec_rcg; ax0=dni(inicio); ar=pass axG; ifcqrti; ayí)=dni(rx_bur+l); { } { Lee muestra de entrada por el canal izquierdo} Rutina para eliminar ruido de fondo } axO-ayO; ar=abs axt); . - ay0=nivel_ruido; ' • none=ar-ayO: if gt af=pass axO; 1 none=ar-ayO; if le af=pass 0; ar=pass af; ayO=ar; i3 =/1 tabia_pcr; cali permutar; dm(lx_buf+l)=ar; dm(tx_buf+2)=ar; reset HO; nop; io(0)=ar; nop; set nO; {Llama a la subrutina de encriptación} { Transmite la muestra encriptada por el canal izquierdo } { Transmite la muestra encriptada por el canal derecho } { Resel de la bandera flü} {Acíiva la bandera flO} axO=dm(ini_llcnar); none=pass axÜ; i f e q rli; dm(ÍO ! inO)=ayO; dm(Ü,niO)=ar; ar=dm(ncntr); ar=ar-I; dm(ncnlr)=ar; if ne rii; 21 ax0=0xl; din(nnjlag)=axü; rl¡; { Siibruíiir.i que atiende l:i I n t e r r u p c i ó n IRQE } irqc: ciin scc_rcg; togglc H1; ;ixQ=din(mÍcio); ar=nol axO; clni(!nicio)=ar; rti; { Suhriitina t|ue aíiendü l:i l i H c r r u p c í ñ n IKQ2 } irq2: cna scc_rcg; togglc n i ; nx 0=0x1; dm(¡ni_llcnar)=axO; rcsct ¡12; rl¡; '.INCLUDE <Afi[i.ds|)>; .ENDMOD; 22 Programa del Algoritmo PERMU16.DSP: { PERMU16.dsp.- Algorilmo tic cncriplacion de muestras r tal izando una permutación de bits Miguel E. Vicuña M u ñ o z - E n c r i p t a e i ó n de Voz- Octubre/ 99 Entrada: ayO = Palabra de 16 bits 13=0 ¡3 —> apuntando inicio de tabla de permutación ¡2 —> apuntando inicio de tabla sin permutación Salida: a r = Palabra de 16 bits permutada Registros alterados: a,xQ,axl ! ayl,ar,ar,srl,sc,i2,m2,12,i3,13 Tiempo de ejecución: 106 Ciclos de Maquina La labia de permutación debe ser llenada de acuerdo al siguiente criterio: Tabla sin permutación O—>OOOI FFFE 1 _.__> 0002 FFFD 2 —-> 0004 FFFI3 3 -—> OOOS FFF7 4_-._>0010 FFEF 5 —> 0020 FFDF 6 —> 0040 FFBF 7 —> Q080 FF7F S -—> 0100 FBFF 9 -—> 0200 FDFF 10—- >0400 FI3FF I I — - > 0800 F7FF 12-—> l ü O Ü EFFF 13____>2000 DFFF 14-__->4000 BFFF Í5_.._>3000 23 7F .MODULE/KAM pcnHilacioii_I6bils; .VA1VDM labla_bits[16j; .INIT Uib!a_bHs: 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080, 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000; .ENTRY permutar; permutar: ayl=0; m2=I; 12=0; i2= A tabla_bíts; srl=dm(¡2,m2); axO=dm(i3,ni2); axl=dm(i3,ni2); cnír=15; do \vord_a_bil u n t i l ce; ar=srl and ayü; sr!=clni(i2,m2); i f n c af=axO or a y l ; ifcq af=ax I and ay ar=píiss af; axO=clin(i3,m2); Eixl=clm(i3,ni2); \vord_a_bit: ayl=ar; ai-srl and ayO: i ["ne af=axO orayl; ifeq aí=ax I and ayl; ai^pass af; rts; {Encera e! registro AY! {Dclcrniinas! el bit n (O..I4) en el registro AYO es 0/1} {Almacena el nuevo dato de la labia sin permutación} { SÍ n es 1 pone en I la nueva posieiún del bit permutado en A!7} [ SÍ n es o pone en O la nueva posición del bit permutado en Al 7 } {Almacena en AII el muestra permutada y guardada en AF} {Almacena el nuevo dato de la tabla de pcrmiilíición} {Almacena el siguiente dato de la tabla de permutación) {Almacena en AY1 la muestra que se está permutando} (para ser utilizada dentro del lazo} {Determina si el bit 15 en el registro AYO es 0/1} { SÍ el bil 15 es 1 pone en 1 su nueva posición permutada en AF} { SÍ el bit 15 es O pone en O su nueva posición permutada en AF} {Guarda la muestra del mensaje cifrado al registro AR} .RNDMOD; El archivo T A B L A P I . I I E X , es un ai-chivo que contiene los datos TABLAPER1 de la tabla 1 en base a los cuales se realiza la permutación de los bits de las muestras de entrada. En lo que respecta al proceso de dcscncriplación, se utiliza el Algoritmo PERMU16I.DSP, que es el mismo PERMU16.DSP, pero con los datos TABLAIPERIdc la tabla 1, con los cuales se realiza el proceso de rcordcnamicnto cíe !os bits de las muestras encripíadas. 24 a PniicÍ|Kil de Dcjjcncrjrjjncíún: { RxJMEKM.DSI1- l'ruíjramn Principnl de ilcscneriplacmn del Algoritmo PISRMUlíjl.DSP Miguel E. Víctina Muño/,/ l£iicnplac¡óii de Vox/ Ocluí) re 1999 ¡(j ----- > Puntero para rx_bur ¡y ----- > puntero para txj.nil" ni? ----- > Utilizado para el autobuferadu: m7-l .MODULE/RAM/ABS=0 { R,x_muestrasjo_Tx__CODEC; Declaración de conslanles uíilixadas en el programa .CONST Ps=-0.xcS51, N=2, nuni=l024; .INCLUD12 <Arcg_clrl.dsp>; .EXTERNAL permutar; ¡ Dcclarncion cíe varí:il)lcs .VAR/DM/C!RC/ABS=Ü xc_r.x[rnmij; .VAIVDM/C1RC xout[nuin]; entrada [N]; .VAK/DM/CIRC iiu_rx, inijlenar, nciilr, lablajicr[32]; .VAR/DM .INIT .INIT .INIT .1NIT ini_rx:Ü; ¡iiMlcnnnO; ncntnniJni; critr;ida:0,0; .INIT lnblaj)er:<tnbliip2.hex>; .INCLUDE <..\iuÍ7.dsp>; rcset fl I ; icntl-bííOOlOO; m4=l; I4=N; (Programa para Inicializacion del CODEC y el DSP } (Rcsct de la bandera fl I} { Activa la interrupción IRQ2 por flanco } i5=Aentrada; mO=l: 10=%xc_i-x; iO=Axc rx; ll=%xoul; ü=Axoul; configurar: ¡ni¡isk=0; ií!=Ae ni ráela; ¡5=Aei lirada; axO=nuni; 25 dm(ncntr)=axO; axO=0; dm(ÍnÍj7í)=axO; dm(ÍnÍJlenar)=axO; ifc=Qxff; nop; imask=0x230; espera: { Elimina interrupciones pendientes } { Habilita !RQ2, IRQE y el puerto serial SPORTO } { Lazo principal del programa } id I e; axO=drn(fm_riag); ar=pass axO; if nc rts; junip espera; { Suhrutina que atiende a la Interrupción IRQ2 } Írq2: ena sec_rcg; si=io(0)¡ dm(i4,rn4) 5:s sÍ; axO=l; dm(inÍj'X)=axO; toggleTll; { Almacena muestras encriptaüas en el buffer entrada } rti; { Subrutino donde se procesa las muestras encriptadas en base al algoriüno PERMU16I.DSP } inpul_samplcs: cna scc_rcg; axí)=dm(ini_ni); ar=pass axO; if eq rti; ayü=dm(¡5,ni4); Í3= A tabla_pcr; cali permutar; { Lee muestras del buffer rcsul } dm(lx_buf+¡)=ar; dm(lx_buF+2)=ar; { Transmite muestra desencríptada por el canal izquierdo j { Transmite muestra dcscncriptadaporel canal derecho } { Llama a la subrutina de descncriptaclón} axQ=dm(Qx3re5); ar=lstbilOoraxO; if ne rl¡; dm(¡0,mO)=ayO; dm(il,mO)=nr; ar=dm(ncntr); ai-=ar-l; dm(ncnlr)=;¡r; if nc rti; axO=Ox.f; dm(fin_nag)=axO; rti; 26 ¡N" TABLASINPER 0 0001 FFFI-; 0002 FFFD 0004 FFFB 0008 FFF7 0010 FFEF 0020 FFDF 0040 FFBF 0080 FF7F 0100 FGFF 0200 FDFF 0400 FBFF 0800 F7FF JOOO EFFF 2000 OFFF 4000 BJT ir [T 8000 7FFF 1 2 3 4 5 6 7 8 9 10 .11 12 13 14 15 TABLAl'i 0020 FFDF 8000 7FFF ÜOOS FFP7 0040 FFIiF 0200 FDFF : 1000 JEKITF 0004 FFFB 0100 FIÍFF 0010 FFEF 0400 FBFF - 4000 BFI7F 0002 FFFD 0080 FF7F 2000 DFFF 0800 F7FF 0001 FFFF, TABLAP2 8000 7FFF 0800 F7FF 0040 FFBF 0004 FFFB 0100 FIÍFF 0001 FFFF, 0008 FFF7 1000 EFFF 0080 FF7F 0010 FFIÍF 0200 FDFF 4000 BFFF 0020 FFDF . 2000 -DFFF 0400 FBFF 0002 FFFD Tablo 1.-.Tablas tic permutación para la Encriplacíún y la Descncriplíieioii 23 P R O G R A M A S PARA LA E N C R I P T A C I O N Y DESEINCRIPTACION DE VOZ U T I L I Z A N D O EL A L G O R I T M O XOR.DSP Y OEXOR.DSP RESPECTIVAMENTE Programa Principal de Encrintación: { Tx_XOK.DSP- Programa Principal de eneripíaeión del Algoritmo XOR.DSP ¡Miguel E. V i c u ñ a M u ñ o z / lüncriplación de Voz/ O e l u b r c 1999 \() ¡7 in7 > Puntero paca rx_biiC > puntero para (x_biif > Utilizado para el anlolni(erado: ni7=l .MODUL£/RAM/AQS=0 { Rx_imieslras_Tx_io; Declaración de conslanícs nlilixadas en el programa — .CONST .INCLUDE .EXTERNAL ís-OxeS51, mim=!024, n¡vc!_niido=0x02ar; { fs=5.5I25 kHz <..\rc'g_círl.dsp>; xor_erip; / üecl:iración de variables ,VAR/DM/CIRC/AI3S=0 .VAR/DM/CIRC xiii[num]; xc_lx[nii[]i]; .VAR/DM inicio, ínMIcníir, ncnlr; .INIT .INIT .INIT inicio:Ü; ÍnÍ_llcnar:0; ncnlnmim; .INCLUDE <.\Íni7.dsp>; Programa para !nlcialización del CODGC y el DSP } mO=l; 10=%x¡n; ÍO=Axin; ll=%xc_!x; il=Axc_t.x; axO=[H!in; dm(ncnír}":ixO; axO=Ü; dmCinicio)=!ixÜ; rcsel H I ; set no; sel H2; icnll=W/OOIOO; {Aclivii Inbíindcm HOJ { Activa la bandera Í12} { Activa la interrupción IRQ2 (lüneo configurar: Ímask=0; 29 iíc=üxlT; nop; iinask=0.\230; espera: Elimina interrupciones pendientes } Habilita IRQG, l R Q 2 y c l puerto serial SPORTO Laxo principal del programa } id le; axO=dni(fin_Miig); ¡ir= pass axO; i fue rls; jump cspcni; { Subriitina donde se procesan las mueslrus de entrada en base :il algoritmo XOR.DSP inpni_sí]inp]cs: ena scc_rcg; axO=dm(inicio); tu—pass axO; ifcq rti; ar=dm(rx_bul'H); { axO=ar; ar=abs a.\0; ayü=n¡vcl_niído; nonc=ar-ayQ; ¡fgt af=pass axO; none=ar-ayO; i f i e ar=pass 0; ar=pass ai'; } { Lee muestra de entrada por cl canal izquierdo} Uutina paríi eliminar ruido de fondo mrO=ar; cali xor_crip; dm(lx_buPH)=ar; dm(tx_bur-i-2)^ar; Llama a la subnilina de Ilncriplación} Transmile entrada cncriptada por el canal izquierdo Transmite entrada cncriptada por el canal derecho } rcscl nO; Reselde la bandera HO} j nop; io(0)=ar; nop; sel 00; {Activa bandera 110} nxO=dm(inÍJIcn¡)r); none-pass axO; ifeq rli; tlm{i0,m0)=mrü; dni(ÍI,mO)=ar; ar=dni(nenlr); ar=ar-l; dm(ncnlrj=ar; i fue rti; axü=0xf; 30 IVnyruimi del Al^orilniu XOR.OSP: {XOR.DSr - Algoritmo de eiicriplneiuii de mucslras rcalr/.umlu un XOR :i la secuencia de bits Miguel I£. Vicuña Muño/, - E n c r i p l a c i ú n de V o z — Octubre/ 99 inri) = dalo original de entrada Registros allenidos ar,sr,axO,ayO,rnxO,mxl S:ilidn ar = dalo de salida cncriptado Tiempo de ejecución 219 ciclos de maquina sub_xor; xor_er¡p; .MODULE/llAM J-NTRV xor_cnp: ai-tstbil Ü o r n i r Ü ; axO=ar; ar=tslbít I ofmrO; s r = I s h Í Q a r b y - l (lo); ayO=srO; ar=axO xor ayÜ; s r = I s h i r t m r O b y - l (lo); mxO=srO; s r = l s h m a r b y 15 (hi); mxl=srl; cntr=I4; do lazo u n t i l ce; {Determina si el bil O de la muestra del mensaje de entrada es O/1 {Alnuiceiia el bit O en el registro AXO} {Determina si el bit I d c la muestra del mensaje de entrada es 0/1} {Desplaza el bit I de la muestra una posición hacia la derecha } {Almacena el bit I en AYO guardado en SRO} {Se obtiene el bit Cu de la muestra del mensaje cncriptado} (Desplaza la muestra del mensaje de entrada una} {posición hacia la derecha y se almacena en MXO} {Desplaza el bit C<j 15 posiciones a la izquierda y almacena} {el bit aislado en el registro M X I } ar=tslbit 1 ofsrO; sr=ishin a r b y - I (lo); ayQ=srO; ai—axO xor ayO; {Muestra del mensaje de entrada desplazado al registro SRO} {Determina si el bit O (M¡) de la muestra desplazada es 0/1} {Almacena el bit 0(M¡) en el registro AXÜ} {Determina si el bit 1 (M¡ f l ) de la muestra desplazada es 0/1 ] {Desplaza el bit I (M¡ ( [) una posición hacia la derecha } {Almacena el bit l(M¡n) en el registro AYO} {Se obtiene e! bit C¡,i de la muestra del mensaje encriptado} sr=I;>hin srO by -i do); mxO=srO; {Se mueve la palabra del mensaje de entrada desplazado u n a ) {posición hacia la derecha y se guarda en el registro MXO} srO=mxO; ar=tstbil O ofsrO; axO~:ir; srl =mxl; lazo: sr=!shin srl by -I (hi); {l;l bit C¡ se desplaza una posición hacia la derecha} sr=sror I s h i f t a r b y 15 (hi); {Une el bit Q y el bit GUI y los mx !=srl; {almacena en el registro mx I ¡ ayO=mxO; ar=tstbit 1 o f s r l ; {Determina si el bit M !5 de la muestra de entrada es 0/1} sr=lshiíl ar b y - I (hi); ar=srl; :ir=ar Nontyü; {Se obtiene el bil C [5 de la muestra del mensaje encriptado} srl=mxl; sr=lshiR srl hy -1 (hi); si=sr or Ishift ar by 15 (hí); { Une el bit Ci¡ con los bits CM.....CD de la muestra encriplada} ai~srl; {Asigna al registro AR la muestra de 16 bits del mensaje encriptado } rts; JiNDMOD; 32 Programa IVincipiil de Dcsencriptaciún: Principal de Dcseiirnplación üel Algoritmo OEXOR.DSI' ¡Miguel E. Vicnn:i Muño/,/ iCncrípi ación de Voz/ OcUibre 1999 ¡5 ----- > Puniera para rx_buf ¡7 ----- > Puntero para lx_buf nl 7 ----- > Utilizado para el autobul'erado: m7=I 1 .MODULI¿/RAM/ABS=0 Rxjiiuestrasjo_Tx_CODEC; ¡-------------------------------Declaración fie c u n s l n n f e s ulilixadus en el progrnma ---------.CONST fs-0.xc85l, N=2, num=l024; .1NCLUDE <.\rcg_clrl.dsp>; .EXTEIINAL xor_decrip; Declarneion de varíublcs .VAR/DM/CIRC/AI3S=0 .VAR/DM/CIIIC .VAR/DM/CIRC xc_rx[iuim]; xoiULiiurn]; enlrada[N]; .VAR/DM ínij'x, Íni_llen:ir, ncntr; .IN1T .INIT .INIT .INIT Ín¡_rx:0; ÍnÍ_llenar:0; [icntr:nuni; cntnula:Ü,Ü; .INCLUDE <..\ini7.ds])>; resé! H l ; ¡ciill-bffOOlOO; im!=l; I4=N; {Programa de Inicialiwción del CODlíC y el DSP { Rcsel de la bandera II I } { Activa la interrupción IRQ2 por flanco j Í5= A entrada; mO=l; I0=%xc_r.x; iO= A xc_rx; il= A xoul; configurar: i'l=AenIrada; Í5= A cnlrada; í].\0=[Uiin; din(ni;[ifr)-axÜ; 33 axü-0; dm(ini_llenar)~;ixO; i!c=0.xlT; nop; Elimiriíi interrupciones pendiente:; } Ímask-0x230; I l a b i l i l a 1RQ2, IRQE y el puerto serial SPORTO Lazo principal de programa } espera: idlc; axO=dm(fin_riag); ar=pass axO; i f n e rts; jump espera; -- Siilti'iiliníi que : i t i e n d e la I n t e r r u p c i ó n 1RQ2 — cna scc_rcg; si=¡o(0); dm(i4,m4)-s¡; axÜ=¡; Almacena muestra cncnptada en c! buffcr cntr:icla logglc n i ; ni; j Subrutina (londü se procesa las muestras encrípladas en base al algoritmo DIÍXOR.DSP } input_s:implcs: cna see_rcg; ar=píiss axO; i f c q rti; mrO=din(i5,m í l); ayl=mrO; Lee dato del bufTcr resul } cali xor_dccrip; Llama a la subrulina de deseneriplación} dm((x_buPH)=ar; dm(tx_buf-¡-2)-ar; Transmite muestras descnci'iplachi por el canal izquierdo Transmite muestra dcsencriptada por c! canal derecho } axO=dm(Ox3fe5); :ir=tstbitOoi"axü; ¡Tuc rti; dm(il,mO)-¡ir; ar=dm(ncnlr); nr=ar-l; tl]n(ncntr)=ar; i f n c rti; axO«=0.\r; clin(nn_nag,)=a.\0; rli: 34 { ----------------------- S u l > r i i l i i i : i que aliciuli! hi hiícrrupciún IRQK ----- ¡rqe: cn¡i scc_reg; logglc f l l ; ;ixO=ü; . (lin(cntríiíla)-axO; d[ii(Íní_rx)=axO; rii; .1NCLUDE <..\nn.tls|»; .I-NDMOD; 35 P r o t / m m a del A l g o r i t m o DICXOR.DSF: ¡DKXOU.DSP - A l ó n i m o tic di'.scncnp ración de miicsírns realizando un XOR n la .secuencia de bits Miguel lí- Vicuña Muño?,- líncripiación de Voz- Oclubre/ 99 }£n Irada inri) = dalo de en I rada cncriplado Ki!»isln)S aderados ar,sr,axO,ayO,mxO,mx 1 S:ilid:i ¡ir - dato de salida dcscncriptadü 'l'ieinpo de ejecución 30! ciclos de maquina sub_dc.\or; xor_dccrip; .MODUU-/RAM .I-NTRY xor_decrip: ar=lstb¡l O ofnirO; (Determina si el bit O (Cu ) de la muestra del mensaje cncriplado es 0/1} sr=lshifíarby 15 (hi); {Desplaza el bit Cu ,15 posiciones a la izquierda y almacena) ax0=srl; {el bil ¡lisiado en el registro AxO} {Determina si el bil C|3 de la muestra de! mensaje cncriptadof iir=lstbil [ S o f i n r O ; ayO=ar; {es 0/1 y lo almacena en AYO} {Se obiiene el bil M 1 3 de la muestra del mensaje dcscncriplado} ar=axO xornyO; {y lo almacena en AX1 j a.x I=ar; cnlr=!5; do lazo I t i n l i l ce; sr=lshin mrO by (lo); {Desplaza la muestra de! mensaje encriptado 1 posición hacia} {la ¡7(]i!Ícrda y lo almacena en M X 1 } mxI-srO; {Delei'inina si el bil C|.| ,¡ de la muestra del mensaje encri|)lado} nr=tslbit ISofsrO; {es 0/í y lo almacena en A X O } axü-nr; {Analiza sí el bit M U . ¡ es 0/1 y lo almacena en AYO} ai-lstbil 15 o f a x l ; ayudar; ai~axO xor ayü; srl=ax 1; ¡Se oblicué el bit M M . ¡ } {Almacena el bit M^.j en SR! ¡ {Desplaza el bil M U - ¡ u n a posición hacia !a derecha} {Une los bils M|.i.¡y el bil M I 5 . t y los almacena en A X I ] sHshmsrl b y - l (ii¡); sr=sror Isliiíl a r b y U (lii); axl=srl; ñu 0=mx]; lazo I : la zo 2: »r=tslbit 15 o f s r l ; si=ar; enli~15; do Iazo2 unlil ce; sr=lsliiü srl by 1 mxl=srl; ar=ls(bit 15 ofsi si=lsliifl si by -I sr= sr or Ishift ar by O (hi); si=srl; srl=mxl; ¡ir=si; rls; {Almacena en mrO el mensaje cneríptado desplazado hacia la} (izquierda para rcalimcntar el lazo} {Analiza si el bít 15 (M,,) es 0/1) {Guarda el bíl MO en el registro SI} {Rcordena la muestra del mensaje descifrado M (l M^} {Desplaza la muestra dcsencriptada 1 posición hacia la } {izquierda y la almacena en e! registro M X I } {Analiza si el bít 15 de la muestra desplazada (M() n) es 0/1} {Desplaza los bits inordenados 1 posición hacia la derecha} {Une los bils rcodenados (M| 5 M(l) y los almacena en) {el regislroSI} {Almacena la mueslra desplazada en SR1 para realimenUir} {el lazo) {Almacena el mensaje descifrado y rcordenado en el regístroAR) .RNDMOD; 36 P R O G R A M A S P A R A L A ENCRIPTACiON Y DESENCRII'TACION DE VOZ UTILIZANDO EL ALGORITMO PSEU.DSP Prugrnniii P r i n c i p a l do EncrípUiciún: { TxJ'SEU.DSI1- Proyrnmo Principal de Encrípíiu-ión del Algoritmo I'SEU.USP ¡Miguel E. Vicuña M u ñ o z / En eript ación de V o z / Octubre 1999 ¡6 i? 111? > puntero para rx^buf > puntero para tx_buf > ulilizado para el auíobiil'cniílü m7=l í .MO D U LG/RA M/A BS=0 { Rx jn«estras_Tx Jo; Doclai-ncion de consta ni es ulili^ndn.s en el programa .CONST kl \7. } .INCLUDE .EXTERNAL fs=OxcS5l, !nim=Ox40Ü, kcy=üxiy7],n¡vel_ruido=0x030r, nummucs=32500; { fs=5.5I25 <..\rcg_clrl.dsp>; pscu_cri; D e c l a r a c i ó n de v:n-iabltis .VAR/DM/CIR.C/A8S=0 .VAR/DM/C1RC xiiil'iiiiin]; xcjxLnum]; .VAR/DM inicio, ¡nÍ_llenar, psciitlo_\vo]'ci, ncntr, rcinicio, iii_c!Hr, grab_kcy, llave; .INIT .INIT .INIT .INIT .INIT .INIT .INIT .INIT ¡nicioiO; reinicio:0; ¡iiiJIcnanO; ncnlnnum; ni_ciilr:ni]mmiics; psetido_v/ord: kcy; gnib_kcy:0; Ilave.-O; .GLOBAL pseudu_\vord; .1NCLUD1I <..\iiiÍ7.dsp>; { Programa de lnicíaIÍ7.ación del C O D U C y e l DSP } mÜ- 1; KMfam; _ ¡I= A xc_tx; :ixO=iHini; {lin(ncnlr)=;ixO; axü=kcy: din(pseudo_wortl)~axO; nxO-Ü; dmCmicio)=axÜ; 37 dm(inÍ_llenar)=axO; dm(grab_kcy)=axü; rcsct H l ; sel Mu; sel 112; icnll=b#OOIOO; {Activa la bandera flO} {Activa la bandera (12} { Activa Inlerrupción IRQ2 por naneo } configurar: iniíisk=0; axOO; dm(reinicio)=axO; axO=key; dm(pseudo_\vord)=axO; axO=nummues; dm(m_cnlr)~axO; ifc=0xfr; { Elimina interrupciones pendientes } nop; ¡mask=Qx230; { Habilita IRQE, 1RQ2 y el puerto serial SPORTO } Idle; axO=dm(n¡i_flag); ar=pass axí); i f u e rts; axQ=dm(rcinicio); ar=pass axO; i f n c j u n i p configurar; j u m p espera; { Lazo principal de programa } espera: { S u b r u t i n a d o n d e se procesa las muestras de end'iida en base al algoritmo PSfíU.DSP } input_SEiinples: ena sec_reg; ax0=dni(inicio); ar=píiss axO; ífeq rti; a.xO=dm(grab_key); ai~pass axO; i f c q junip siga; ar=dm(pseu(lo_word); dm(Ilave)=ar; ai-=0; dm(grab_key)=ar; siga: ayl=dm(rx__buPH); { Lee muestras del canal izquierdo} cali pscu_cri; { Llama a la subrutina de Encriptación} d¡n(íx_buri-I)-ar; dm(tx_buR-2)=ar; si=ar; rcsct HO; { Transmite muestras cncriptadas por el canal izquierdo } { Transmite muestras cncriptadas por el canal derecho } {Rcsct de la bandera flO} nop; Ío(0)=ar; nop; 38 sel 00; {Activa la bandera flO} ar=dm(ni_cntr); ar=ar- 1 ; dm(m_enlr)=nr; ir lie juinp llcmi^buffer; axO=niiniiiuies; dm(reínicio)=axO; llcna_buflcr: nxO=c!m(iniJIcnar); none=pass axO; If eq rlí; t!m(iO,mQ)=ay[; dni(Íl,m())=si; dm(ncnlr)=ar; i f u e rti; axO=Oxf; dm(fin_n:ig)=axO; rti; { ------------------------ Siibrutina ((lie atiende In Interrupción IRQE ---------------- } irqc: cna scc_rcg; (oggle fl 1 ; axO=dm(inicio); ar=not axü; dm(inicio)=ar; axO-key; dni(pscuclo_würd)=axO; axO-numnuics; dni(ni_culr)=axO; axO=0; dm(rcinÍeio)-axO; axO=num; dm(ncnlr)"axO; rt¡; { Írq2: Snbi'ulina que a t i e n d e la Inlerrupeión 1RQ2 , . cna sec_rcg; tog'gle (11; axÜ=Üxr; dni(ÍnÍ_!lcnar)=axO; dm(grñb_key)~axO; resct Í12; rt¡; .INCLUDE .HNDMOD; <..\Pm.dsp>; 39 r r n p i - n m n (Id /Vhjorilnio PSEU.OSP: {1'tSlíU.DSl 1 — Algoritmo de Encnplación (Dcscncnpl-aciáii) de muestras con clave de generación lciitofin. Miguel lí. Vicuñíi Muño?. - Encripíación de Vox - Ocíubre/99 Entrada: ayl = dato origina! de entrada Registros alterados: mrO, axO, ayO, ar, sr, mxl, inri, Salida: ar = Dato de salida cncriplado Tiempo de ejecución: 449 Ciclos de máquina subj)scu pscu eri; .MODULE/RAM .BNTRY .Víir/dm/ram . var/dm/ram .var/dm/ram .var/dm/ram .var/dm/ram slikey; mendcs; cilr; mcssl; ciírj; JZXTERNAL pseudo_word; pseti_cri: mrO=dm(pscudo_\vord); af=tstbit Oofmrü; ar=istb¡l 1 ofnirO; sr=Ishin ar by-l.(Io); ai~srO xoraf; dm(shkcy)-srl; sr=lsh¡nmrüby-l (lo); ai— srO; srl^dmfshkey}; sr=sr or Ishift ar by O (hi); mx 1= srl ; mrl=ayl; ar=LslbÍl O ofinrl; dm(messl)=ar; mrO=Eiyl; sr=lsh¡n nirO by-l (lo); a,xü=dm(mc.ssl); ni~a.xO xor ¡if; si-lsliillarby I5(hi); dni(dír)=srl; cnl!-=15; do laxo unlil ce; mrO=m.x 1; {Almacena la llave pseudoalcatoría desplazada} {Almacena la muestra del mensaje desplazada} {Almacena mensaje cifrado) {Asigna la Nave inicial pscudoaleatoría al registro MKO ) {Determina si el bit O de la llave pscudoaleatoría es 0/1} {Determina si el bit I de la llave pseudoalcatona es 0/1} {Desplaza el bif I una posición hacia la derecha y lo almacena} {en SRO} {Obtiene el nuevo bit Yo a realímcntarse a la secuencia) {de la llave p<;cudoalealaria {Desplaza el bit Yo 15 posiciones a la izquierda y¡ {lo almacena en e! buffcrslikey} {Desplaza la llave Inicial pseudoalcaloria una posición hacia} [derecha y la almacena en el registro A R } ¡Almacena el bit Yo desplazado en el registro SR I } ¡Une el bit Yo con la llave inicial pseudoalcatona desplazada} {y lo almacena en el registro MX1} {Asigna la muestra del mensaje de entrada al registro MRI} {Determina si el bit O de la muestra del mensaje de entrada} {es 0/1 y lo almacena en el bufTcr mcssl} {Almacena la muestra del mensaje de entrada al registro MRO} {Desplaza la muestra del mensaje de entrada ! posición) {hacía I ¡i derecha y lo almacena en el bufTcr mondes} ¡Asigna el bit MO al registro AXO } ¡Obtiene el primer bit del mensaje cifrado CO=MO xor ICO} {Cu lo desplaza 15 posiciones hacia la izquierda} {y lo almacena en el bulTcr cifr) ¡Asigna ¡a palabra de la secuencia pscudoaleatoria rcaümentadaj 40 ar=lstbitOofmrO; ni—tslbit 1 ofmrQ; sr=]s!iiííarby-l (lo); ar=srü xoraf; {al registro MROJ {Determina sí el bit O de la llave rcalinicntada (Ki) es 0/1 } {Determina si el bit I de la llave rcalinientada (Ki-H) es 0/1 } {Desplaza el bit ! (Ki-H) una posieión a dcreclia y lo almacena} {enSRÜi {Obtiene el nuevo bit Yi de la secuencia de palabra} {pseudolaeatoria } sr=Ishiriarby 15 (hi); dm(shkcy)=srl; mrO=mxl; sr=lshiflmrO b y - I (lo); ar=srO; srO=dm(shkcy); sr=sr or Isliiíl tir by O (lo); mxl=srO; iiirl=dii](inciulcs): ni— istbit O o f m r l ; dm(messl)=ar; mrO=dm(mcndcs); s i = I s h i f t m r ü b y - [ (¡o); dm(mcnclcs)=srO; ax0=dm(mcssl); ar=axQ xor al"; {Asigna la muestra del mensaje desplazado a! registro MRl j {Determina si el bit Ü de Mi de la muestra del mensaje despla-j {zado es 0/1} {Asigna cl bit Mi a! registro AYO } {Obtiene cl nuevo bit Ci de la palabra del mensaje cifrado} {Ci-M¡.xorKÍ) sr=lshifl nr by 15 (Iii); dm(cifr_I)=srl; ar=dm(c¡fr); s r = I s ! i i f t a r b y - l (lo); ar=dm(cífr_l); sr=sr or Ishin ar by O (lo); dm(cifr)=srO; lazo: srl=din(cifr); ar=pass srl; dni(psci]do_\\'ord)=nix 1; {Une el bit C¡ con los demás bits de la muestra del} {mensaje cifrado desplazado y lo almacena en buffcr cifr} {Almacena la muestra del mensaje cifrado en el registro M R l (Asigna la muestra cifrada al registro AR} {Almacena la nueva llave Pseudoalcaloria al } {pscudo_\vord} rts; .I2NDMOD; Noisi: Como se indico en la sección 3'.2, PSEU.DSI 1 es un algoritmo de ida y vuelta, es dccii - que se utiliza el mismo algoritmo para e! proceso de dcscncriptación. 41 " P r i n c i p a l cíe Üesencriptación: iMii l'rincipitl de Dcsciicriplnclón del A l g o r i t m o PSlSU.DSí* K. Vicuñn M u ñ o z / línerip Ilición de Voz / Ocluí) re 1999 K x P S I £ U . D S l ' - IV ¡(j ----- > puntero par» rx_buC ¡7 ----- > puntero pañi tx_bnf ,n7 ----- > uiílizado pañi el autobtileriulo .MODULE/RAM/ABS=0 | R*jnuestrasjojrx_CODEC; Declaración de constantes utilizadíis un el progríinia .CONST rs=0.xc85l, N=2, nuin=0.x400, kcy^Oxl97I, iHiminues=32500; .INCLUDI- <..\reg_clrl.dsp>; .liXTI-RNAL pscu_cri; / Declaración de varinhlcs .VAR/DM/CIRCMBS=0 .VAR/DM/C1RC .VAR/DM/CIRC xc_rx[num]; ,\oiil[ntim]; e!itrnda[N]; .VAR/DM in¡_rx, ini_llcnar, ncntr, psciitlo_\vord, reinicio, m^cntr; .INIT .INIT .INIT .INIT .INIT .INIT .INIT ini_i-x:0; reinlciorO; ÍnÍ_Ilenar:Ü; nentr:num; ni^cnínninnimics; enTrada:0,0; psciiílo_word:key; .GLOBAL pscudo_word; JNCLUDI! <..\Íni7.íls|í>; rose I n i ; ¡ciilMjffüÜIOO; in4=l; { Prognuii» de Inícíulizaeión del CODEC y el DSP (Resct de la bandera n i ) { Activa Interrupción IRQ2 por flnnco ¡ H=N; i4= A cntrada; 15-N; !5= A cntrada; niO=l; I0=%.\c_rx; \Q^*xz_rx; ll=%xout: ¡!= A xout; configurar: íiníisk=Ü; i'I= A entrada; 42 i5= A ciitrad¡i; axO-key; dni(psendo_\vord)=axO; axO-mim; dm(ncn!r)=axO; axO=mimimies; dm(m_cnlr)=axO; nxO=0; dm(in¡_rx)-axQ; dm(mi_llcnar)=ax0; dm(rcinicio)=a.xO; ¡Fc^OxIT; nop; imask=0x230; espera: Elimina inlen'upciones pendientes } |-[¡ibilitíiIR.Q2, IRQB y pnerlo serial SPOUTO L;i7o principal de jirogrania } idlc; axO=clm(fin_fhig); ni—pass :ixÜ; Í f u e ris; ax0=din(reinicio); ar=pass axO; i r n e j u i n p configurar; junip espera; S u h r u í i n a que n l i c n d c la I t i t c r r u p c i n n IRQ2 irí|2: en a sccj'cg; si=¡o(0); dm(Í4,in t l)=sÍ; axO=l; dm(ini_r.\)=axO; logglc 111; ar=dm(m_cntr); ar=ar-1; dm(m_cntr)=ar; i f n c rti; Almacena muestra en el buffer entrada axO=niiinmiics; dmCreÍiiicÍo)=axO; dm(m_cinr)=:i.xO; rti; { S u b r u l i n a donde se procesa las rmiL'Sd'as encripliidas cu base al algoridno f'SEU.DSI* } inpi)i_sí)mp!es: ena scc_i1eg; a.xO=dmCÍni_rx); ar=piiss íixü; íf cq rfi; ayI~dni(Í5,in'1); Lee nuicslras del bufrcrrcsul ¡ cali pscu_cri; Llama a la subruUna de Dcsciicnplación} dm(íx_buB-|)=ar; Transmite muestras descncripladas por cl canal izquierdo 43 dm(lx_bi]R-2)=ar; { Tninsinile muestras dcsencriptnclas porcl canal derecho n.\0-diii(0x3íc5); íil'-tsíbit O o f a x O ; ií'nc rti; c¡m(¡0,inO)=ayi; dm(il,niO)=ar; ar=dni(ncntr); ;ir=ar-l; dm(ncntrj=ar; ifnc rti; axO=Oxf; dm(fin_fl¡ig)=axQ; rli: { ------------------------------- S n h r n l i n a q u e a l l e n d e la Iiilerrupciiín IRQIÍ ---------------------- írqe: cna sec_rcg; logglelll; axü=0; din(cntrada-i-l)=axO; din(inÍ_rx)=axO; (¡m(rc¡nicíü)=axO; ¡ixO=key;" din(psciido_word)=axO; !ixO=nuniinncs; dni(m_cnlr)=axO; rti; .INCLUDB <..\fin.[lsp>; .ÜNDMOD; 44 P R O G R A M A S PARA LA ENCRII'TACION V UESENCRIPTAC10N DE VOZ U T I L I Z A N D O EL ALGORITMO PSEU2181.DSP lVu*jnmi:i IVincipiíl tic iMicrip < TNj'2 18 1. DS1'~ Programa Principal cíe Encriplación ttcl Algoritmo PSEU21 81.DSP ¡Miguel E. Vicuñn Muño?. / Encrip (ación de V o z / Ocí ubre 1999 16 ----- > puntero para rx_buf ¡7 ----- > puntero para Lx_buF ni? ----- > utilizado pnra el Eiutobuíenulo m7=l 1 .MODULIi/KAM/ABSM) R.x_niucstras_Tx_io; { ------------------------------- Declaración ile constiinles utilizadas en el programa .CONST .INCI.UDI.IIXTEIÍ.NAL rs=0.xc85I, mim=0.x400, HaveO=Üxl í J99, Ilavcl=0x 1971, nununues=325ÜO; (fs=5.5125 kl-lz) <..\rcg_cír].clsp>; criptüjiscu, xor_crip, permular, kcyO, kcyi; Declnracion tic variables .VAK/DM/CIRC/ABS=G .VAR/DM/C1RC .VAR/DM .1NIT .IN1T JN1T .1N1T .IN1T .1NIT .1NIT xin[nnm]; xcjx[num]; inicio, ¡injlenar, pseudo_\vürd, ncntr, rcinício, m_cntr, grab_kcy, Ilavc_0, IIave_I-, cnlradíi, salida; Ibl_perl[32j; inicio:0; rcinic¡o:0; iniJIenanO; ncnlrriium; in_ciitr:iHiiii[iuics; gnib_key:ü; tblj)cr[:<..\pcriim(a\(ablapl,liex>; .GLOBAL tbljicrl; .INCLUDI5 <..\ini7.dsp>; niO=l; I0=%xin; Í()=Axin; ll-%xc_tx; il= A ,xc_lx; axü=nnm; nxO=!lnvcO; nxO=llíivcl; din(kcyl)=axü; axO=0; {Prognimn de Inicmliwción del CODHCye! DSP dni(Íniciu)=axO; dm(ÍnÍ_Jlcnar)=axO; ciin(gr:tb_kcy)-axO; reset I I I f sel 110; sel H2; iciUH>ffOOÍOO; con fi gurai" imask-Q; axOO; dm(rcinicio)=ax0; axOHIavcü; dm(kcyO)=axO; axtHlavel; dm(kcyl)=axO; ¡ixO-iiiimmues; clm(in_cnlr)~axü; Ífc=QxíT; (Resé! de la bandera 111} {Activa la bandera flO¡ (Activa la bandera 112} {Activa hi Interrupción IKQ2 por flanco { Elimina inlcrrupcioncs pendientes } nop; iniask=0x23ü; esperíi: { Habilito IRQli, IRQ2 y el puerto serial SPOIITO { Lazo principa! de programa } idle; :!xO=dm(fln_flag); ni-pass axO; Íl" na lis; axO^dmfrcinieio}; ar=pass axO; if Mcjuiiip configurar; jiimp espera; { ---- S u h r u t i n a do tul e se procesa his mu es I ras de en I rada en base al algor! (mu F'Slí inpiit_s:unples: una secj-cg; ax0=dni(inicio); ¡ir=pass axO; if'cq rli: axO=din{grab__kcy); ai-pass axO; i f c q j u m p siga; dtn(l!ave_0)~ar; ai— clm(kcyl); dtn(llavc_l)-ar; ni-Ü; dm(grab_key)=ar; siga: axO=dni(]-x_bur-!-l); dm(enlrada)~:iNO; cali criplo_pseu; a ("iixO; dm(l.x_bur-i l)-ar; { Lee muestras de entrada por el canal izquierdo! { Llama a lasulmtlina de Encriptación} { Transmite mués tras ene-ripiadas porcl cana! izquierdo 46 Transtnile muestras encriptadas por el canal izquierdo } tlm(lx_bur-l-2)=ni~ din(salii!a)-íir; rcsct HO; nop; ¡u(0)=ar; nop; .sel HÜ; {Rescl de la bandera Í10} ¡Activa la bandera HO} ai— dm(m_cnlr); ar=ar-l; din(in_cnlr)=ar; if nc jump Ílcna_lnir!cr; axO=miinmnes; din(reimcio)=axü; drn(m_c!ilr)~uxO; llena_bulTcr: axO=dm(in¡_llcnar); ncmc=pnss nxü; ifcq rli; axÜ=dm(cnirada); dni(i0.mü)=axÜ; axO-dm(salida); dni(Í!,mO)-axÜ; at— (iin(ncntr); :n— ar-1; ¡fnc rli; axO=Oxf; din(fin_nag)=axO; rl i; Subnifina que aticiulc la Internipcíón'IRQli irqe: cnn scc_rcg; lügglc DI; axü=dm(inic¡o); ar=not axO; din(inicio)=ar; ax()=IlavcÜ; dni(kcyO)=nxO; axÜ=!l:ivc¡; dni(kcyl)=íix0; axO=niimnuics; flinfm cnlr)=a,\0; axO=üT dni(rcinicio)~axü: dni(ncnlr)~iixÜ; rli: 47 Prtjuninuí del Ali'ürihno i > SEU218I.DSI > : {l*SlíU21fll.I)SP.- A l g o r i t m o de Üjicriptación (Dcsencriplación) de muestras con clave de generación l'5(Midoalealori:i K. V i c u ñ a Muñox- lino rip I ación de Vo?, - O c í u h r c 99 En I rada: axO - Doto original de entrada Salida: axQ = Dato cncriptado íle salida Kegisíros alterados: axO, ayO, i n r i , mrO, ar, Tiempo de ejecución: 576 Ciclos de máquina .MODULE .ENTRY J-XTIiRNAL .EXTERNAL cncriplac¡on_pseu; criplo_pscu; permutar, xor_crip; tbljierl; .VAR/DM .INIT .INIT k c y l , kcyO, keyN, mcnen; kcyl:Oxl971; kcyO: 0x1999; .GLOBAL criptujíseu: dinfinenenJ-axO; ay()=dm{key!); 13=0; i3- A tbl_perl; cali peniuiliir; {Guarda la niuestni de entrada en el bufTer menen {Guaixiü la clave K l en el registro AYO} nii'0=nirl; c:ill xor_cnp; mrl=nr; {Almacena el dato Ll guardado en inri en el registro} (tnrO y llama a la Subrutina XOR_CRIP y vuelve a} {guardar este dalo en m r l } ayO^dm(kcyO); 13=0; ¡3= A tbl_pcr!; cali permutar; mrO=ar; {Guarda la clave KO en el registro AYO} {Llama ¡i la Subruliim P E R M U T A R } {Obtiene los 16 bils permutados de !a Í7,t¡i!Ícrd:i L l } {de la clave y los guarda en el registro MK 1 j ¡Llama a la Subnitina P E R M U T A R } {Obtiene los 16 bits permutados de la derecha LO} {de la clave y los guarda en el registro M R O } cali ,\or_c:np; mrü=ar; {Llama a la Subriilina XOR_CRIP y guarda cslcj { resultado en M R O } si^ashifí i n r i by A {lii}; si=sr or Ishifl mrü by 4 (lo); clm(kcyN}=srl; {Obtención tic la clave Kn para e.sla etapa desplazando) {Ll ctinlro posiciones hacia la izquierda} 49 sr=asiiill i n r i by 3 (lii); sr=sr or IsIiiH n i i Ü by 3 (lo); dm(I;ey l ) = s r l ; nyíKsrí); {Rotación de la clave (Ll y LO) I res posiciones a l ¡izquierda, |)ara ser utilizada en la .siguiente etapa} sr=lshillinrl by-!3(Io); a¡—srü or ayO; dm(kcyO)=ar; axO=ciin(mcnt:n) ayÜ=dm(kcyN); ar=axO xorayO; axO=ar; rls; {Encuentra la muestra cncriplada realizando la {xor entre e¡ dato de entrada y la clave Kn ¡ {y lo almacena en A R } {El resultado es alniaccnndo en el registro AXÜ¡ .IZNDMOD; Nula: Como se indico cu la sección 3.2, PSBU21SÍ.DSP es un algoritmo de ida y vuelta, es decir que se utiliza cl mismo algoritmo para el proceso de desencriptación. 50 Programa P r i n c i p a l üe Dcsoiicríptaciun: { R.\_I'2I81.I)SP- Programa Principal de I)e.sencn|ítadón del A l g o r i t m o PSEU2181.DSP M i g u e l E. V i c u ñ a M u ñ o / , / lí u cnp tildón de Vox/ O c t u b r e 1999 ¡6 ¡7 in7 > puntero parn rx_bu[* > puntero para lx_buf > utilizado para el autobiiferado ¡117=1 í .MODULlI/RAM/AlíS-0 Rx_mucslmsjo_Tx_COD!íC; ¡ Dccliii'iicion ílc c o i i s l a i i l c s u l i l i x a d a s en e! progi':nn:i .CONST rs=0.xcS51, N=2, mmi=0x400, lliivcO=Üxl999, I l a v e l = 0 x l 9 7 1 , nummLies=325ÜO; .INCLUDE <..\rt'B_cirl.tlsp>; .EXTfiKNAL criplojiscu, xor_erip, pecnmíar, keyü, k c y l ; { D c c l n r a c i o n de variables .VAR/OM/C1RC/ABS=0 .VAR/OM/CIRC .VAIVDM/CIRC xc_rx[numj; xoullmim]; cnirada[N]; .VAR/DM inijT:, ínijlciiar, ncnír, pscudo_\vord, rcinicio, ni_cntr, tbljicrl [32], entra, salida; JNMT .1NIT .1NIT .INIT .IN1T .1N1T .INIT ini_rx:0; rcinicio:ü; ÍnÍ_!lenar:0; ncntr:imni; [ii_cntr:iniiii!iHics; cntrada:0,0; tbIjicrI:<..\pcrnHitn\Í!ihl!ipl.licx>; .GLOBAL Ibljicrl; .1NCLUOE <..\iiii7.ilsp>; rcsct H l ; icntl=b//001ÜÜ; ni4= I; |4=N; { Prograniíi de Iniciulización del COOEC y el DSP {Rcsct de la bandera H l J ¡Activa la Intcmipción 1RQ2 por Hanco} Í4= A entr:Kla; I5=N; ¡5= A enlr;ula; iiiO=-J: ÍÜ= A xc_rx; ll=%xotit; il=Axout; 51 configurar: miask=0; i5=Acntr¡ul¡i; axtHIavcO; clm(kcy0)=»x0; axOllavcl; din(keyl)-axO; :ixO=mim; din(ncnlr)=a.\0; nxO=iiiiniiiHics; dm(m_cnlr)=axO; axO=0; dtn(ini_rx)=¡ixO; (lm(iiiHIcnar)=axO; ifcKJxlT; nop; imask=0x230; {Hliniina interrupciones pendientes ¡ {llabililo IKQ2, IRQ!] y e! puerto seria! SPOR'I'Ü espera: {Ui/.o principal de programa } Ídle; axO=din(nn_flag); ai"=pass axü; ¡fnc rts; a,xO=dm(rcin¡cio); ar=pass nxü; ifncjump configurar; jump espera; { -------------------------------- Subrulina que1 alietide l:i InloiTiipción IRQ2 -------------------------- } irq2: ena sec_reg; sHo(O); dm(i4,m4)=si; axOl; d[)i(ÍnÍ__rx)=axO; loggleíl!; ai-dni(iu_cntr); ar=ar-I; dni(ni_cnlr)=ar; Í fue rti; axO=nuinnu!Ch" dni(rcin¡cÍa)=axO; (|[ii(ni_ailr)=axÜ; ¡ Almaceno inneslra encripíadas en el bufiercnfrada } ni; { ----- Subrulirui diunlesc [intccsa las miiesfrns c-iicnpdubis en base ;il al^nrilnio P.SICU2 I 8 I .I)Sl' ----- } ena scc_rcg; axO=dni(ini_rx); ar=pass axO; iTeq rlí; 52 ¡i.NO=dm(i5,ni4); (Im(cnlríi)-iixO; cali criploj>seu; { Lee muestras encripladas del buffer resul ¡ i Llama a la subrutina de desencriplación} iir=a.xü; dm(sal¡da)-¡ir; ilin(íx_bur-H)=:ir; ílni((x_buf+2)=ar; {Traiismile ¡nuestras deseiicriptadas por el canal izquierdo) {Transinilc mucslras dcsencríplatlas por el canal derecho} fi.\0=dm(0x3fc5); aNslbitOofaxO; ifnc rt¡; axQ=dni(entríO; din(ÍO,mü)-axÜ; a.xO=din(saIÍ<la); dm(i],mO)=a.xO; ai—dni(ncnlr); ai—ar-1; dii!(ncnlr)=:ir; ¡ f u e rt¡; axO=OxH dm(íln_nag)=a.xO; rli; j S u b r u í i n a q u e a t i e n d e In I n t c r i ' u p c i ó n I R Q E Irqe: cna sec_reg; loggle f l l ; a.xü=ü; din(enlrada)=a.xü; c!in(cnlríidn-)-l}=¡ixO; dm(ini_rx)=tixü; din(rcin¡ciü}=:ixO; a.xO=IIavcü; din(kcyU)=íix(J; a,xÜ=llavc!; dm(kcyl)=axO; axü=ni]iiiniues; ilni(!n_ciitr)-:ixO; rti; .INCLUDE <..\ííri.<!,sp>; .RNDMOD; 53 ' R O C K A M A S I'ARA LA ÜNCRIPTAClOiN 1 Y D I C S Ü N C R I P T A C I Q N DE VOX UTILIZANDO ULALCOmTMO OESIW.DSP'Y RES I'ÉCTIV A M E N T É j'PEjraMja l > riiici¡ni] cié E n c r i p U i c i ú n : { TxJMÜS.DSP- Programa P r i n c i p a l de Gncnplación del A l g o r i t m o DES2I81.DSP ¡Miguel E. V i c u ñ a M u ñ o ? , / Encrip (ación (le Voz/ Oclnhi'c 1999 1 Declaración de c o n s l a n l e s u t i l i z a d a s en el programa — .CONST!s=ÜxcS5l; { Frecuencia de mneslrco = 5.5125kl I?, } .CONSTIliivcl=Oxl97l; .CONSTcl¡ipns=0,1111111= i 024; .1NCLUDB <.Aini_kik.dsp>; {Inicializncifín del ADSP-2181 y el AD-I847} Declaración (le variables .VAR/DM/CIRC/ABS-0 .VAll/DM/CiRC xinfiiiini]; xc_lx[nuni]; .VAR/DM Inicio, inijleiw, limpiar, ucntr, m_cntr, o i i l l , üiitO, lbl_per![32], grab_inÍ, grab_key, IIavc_0, !l;n f e_l; .INIT .1NIT .INIT .INIT .INIT Ínicio:0; m_cnlr:0; oiitOrO; oul 1:0; lbl_pcrI:<.ApLM'mula\íab]ap].!iex>; .IZXTIiIlNAL .GLOBAL cripto_tlcs s kcyO, k c y l ; tljl_pc'i-l; resol n I ; 15=%xin; i5= A xin; {Rcsct de la bandera fll ¡6=AxcJ.\ ni? 85 !; sel nO; sel (12; {Activa la bandera (10} ¡Acllva la bandera I12¡ tliii(grab_kcy)-nxO: (Ím(gi'iibJiiÍ)~;ixü; dni(Í[]ÍJlcnar)-axü; din(limpiar)=;!xO; nxO=)unii; 54 dm(ncnlr)=nxü; ¡re=o,\rr; nop; ¡ii]nsk=0.x230; espera {Lazo principal de programa idle; :ixO=dm(fin_nag); ai— pass axO; i f u e rls; jump espera; { ----- S i i í ) r u l i n a d o n d e se proccsn t;is mucsínis de entrad u en base ni algoritmo DES2181.DSP ------ } ¡nput_samplcs: cna scc_reg; ¡ixO=dm{Ín¡cio); ar=pass axO; Ifct] rlí; a.\0=c!in(gnib_key); ar=pass a.xü; ífeq jump siga; ar=din(keyO); ih]i(llavc_Ü)=ar; íii— dm(kcyl); din(ll;ivc l)=ar; nr=0; (ini(gnib_kcy)=ar; sga: ai=dm(rx_btir-!-I); mrl=ar; ar=dm(m_cnlr); aNslbil O ofar; i f n e juinp primcrn_vcz: axO~mrl; cnlr=ctapíis; do c!apa_des tinlil ce; cali eriplo_dcs; clnp:i_dcs: nop; mrl=dm((ni!Ü); dni(oull)=a.\l; dm(on!Ü}-axO; jump transmitir; primera_vez: íixl=mrl; mr!=dm(ont I): transmitir: dni(tx_bi)f-i l ) = - n i r ) ; diii(t\_bur-t-2)-inrl; rcscl flO; nop; io{0)=mr!; nop; Lee nnieslras de entrada por el eanal izquierdo) Llama a la subruliii» de cncrip(aciún) {'l'raiüanite unicslras cncripladas porcl cuñal izquierdo} {Transmite muestras encripladas por el canal derecho} {líese! de la bandera no} 55 sel flO; {Activa la bandera HO) axQ=dn](mÍ_llc¡mr); ifcq rli; mrO-dm(rxjHiPH); (Iin(i5,in7)-nir0; dm(Í6,ni7)=nirl; ni^dnifncnlr); ar=ar-l; d!ii(ncntr)=ar; if nc rli; axO=0.\r; dm(Ini_nag)=:ixO; rli; Subi-ulina i¡ue uíicmk hi ínlcrrupciún IRQIÍ irqe: cníi sec_reg; axO=dm(ÍMÍcio); ar=not a.xO; din(iuicio)=iir; tügglc fl 1; axü=llaveO; ilm(keyO)=axQ; axO=Ilavcl; din(keylh;ix(); axO=0; diii(ni_cntr)=íixO; ifc=0.\rr; nop; rti; Subriilinn (juc nlicndc la IrileriMipciüii IRQ2 c irt|2: cna scc_rcg; axO=0.\f; (Íin(grali_kcy)-axü; i-cscrn2; rti; .includc <..\rin.dsp>; .IZNDMOD; tlül AI»ün<moDIJ:S2181.DSP: .- Eiimplnnon tic mneslrns par» im¡i i I oración del Algoritmo OES2I8 l.USP [Miguel lí. Vicuña (Muñoz- Encnplai-ión tie Voz- Octubre 99 axl — Oíito anlerior axO = Datu aclual Siiluhi: axl = Dato anterior axO = Dato actual Ucyislros nllerntlos: ayü, inri , iniO, axO, ax de ejecución: 1005 ciclos cíe máquina encriptacion_tlcs; cnpto_dcsx; permutar, ,xor_crip; Ibljjcrl; .MODULE .I-NTRY .I-XTHRNAL .EXTERN AL .VAR/DM .1NIT .IN1T keyl, keyO, keyN, incncnt, mcncnO; keyl:Oxl97I; kcyO:0x1999; .GLOBAL kcyl,keyO; críplo ciesx: dni(mcnenl J~ax!; din(mcnenOJ~¡ixü; ¡Guarda c! dato anterior en mcncn I ¡ {Guarda el dato actual en mcncnO} {Guárela la clave Kl en cl registro AYO} 13=0; Í3=A!bl_pcrl; cali permutar; mrl=ar; {Llama a la Subrulinn PERMUTAR) {Oblienc las 16 bits permutados cíe la izquierda L l } {de la clave y los guarda en cl rcgislro M R ! } mr0=inrl; cali ,xor_críp; mrl=ar; {Almacena el dato Ll guardado en inri en el registro} {mrO y llama a la Subrulino XOR_CRIP y vuelve a} {guardar este dalo en M R ) } nyO-dm{keyO); 13=0; Í3=Albljierl; cali permutar; mrO=ar; {Guarda la clave KO en cl registro AYO} cali xor_crip; mrO=ar; {Llama a la Suhrulum XOR_CRIP y guarda cslc| { resultado en MRO} {Llama a ¡a Subruüna PERMUTAR} {Obtiene los 16 bits permutados de la derecha LO} {de la clave y los guarda en cl registro MROj 57 sr=ashíft m r l by 4 (hi); si^sr or IsliiR nirO by 4 (lo); dm(kcyN)=srI; {Obtención de la clave Kn para esta etapa desplazando} {Ll cuatro posiciones hacia la izquierda}. sr=ashifl i n r i by 3 (!ii); sr=sr or Isliill nirO by 3 (lo); dm(key!)=srl; ayO=srO; sr=Ishiftmrl b y - ! 3 (lo); ar=srO orayO; ¡Rotación cíe la clave (Ll y LO) tres posiciones a la] {izquierda, para ser utilizada en la siguiente etapa} dni(kcyO)=nr; ayQ=dm(incnenl); 13=0; Í3= A tbl_perI; cali permutar; inri—ar; ¡Dato anterior A ! se guarda en el registro AYO} ayQ-dm(mcnenO); 13=0; {Dato actual AO se guarda en el registro AYO} ¡3= ft lblj)crl; cali permutar; nirO=ar; ayO=dm(kcyN); ar=arxor ayO; ayO=ar; 13=0; i3= A lbl.j)crl; cali permutar; {Llama a la subrulma PERMUTAR} {Se obtienen los 16 bits de entrada izquierda 131 {permutados y los almacena en M R 1 } {Llama a la subrutina PERMUTAR y se obtienen los 16 bits de) {entrada derecha BO permutados y los almacena en MRO} {Encuentra C! realizando la función xor entre el ciato de {entrada permutado BO y la clave Kn para esta etapa} { y lo almacena en AR: Cl = 130 xor Kn} {El dato CI guardado en el registro AR ¡o almacena} {AYO, ]iara luego llamar a la Subrutina PERMUTAR} ¡y encontrar el dato Fl y finalmente almacenarlo} {en el registro AYO = F l } ayO=ar; ai-mrl xor ayü; axO=ar; ¡1.x l-mrO {Se encuentra el dalo DO, realizando una operación í {xor a nivel de bit entre DI y F I y lo almacena en} {AXO: DO = 131 xor Fl, y DI lo almacena en A X I } rls; .ENDMOD; 58 Proprama Principal tic Dcseucriptación: Rx_I)RS. DSP -Programa Principal de Encriptación del Algoritmo DESI2Í81.DSP E. Vicuña Muñoz / Encriplación de Voz/ Octubre 1999 ( ------------------------------ Declaración de constantes ulili/.adas en el programa .CONSTfs=Oxc851, Ilave0=0xl999, I l a v c l = 0 x l 9 7 i , ctapas=3, num=1024; .¡NCLUDE<..\inÍ_kÍk3.dsp>; {Inicializacijín del ADSP-2I81 y el AD-1847} ( -------------------------------------------- Declaración de variables .VAR/DM/C!RC/ABS=0 xc_rx[num]; .VAR/DM/CIRC xoul[num]; .VAR/DM par_entr, inicio, limpiar, ¡ni_rx, i n l , inO, o u t l , outO, ncntr, tbljperl[32j, tbl_perl[32], llaves_N[etapas], daloin, puntj4; bunbr[2]; .VAR/DM/CIRC par_cntr:0; ¡iiicio:0; inÍ_r,x:Ü; bufrcr:0,Ü; inl:0; .1NIT .INIT .1NIT .INIT .INIT .INIT JN1T .INIT JN1T .INIT .INIT inO: 0; ouíl:0; oulO:0; ncntr: nuin; tblJpci-l:<.Apeniinta\tablap2.hc,\>; íbl_perl:<..\permutn\tablapl.hcx>; .EXTERNAL .GLOBAL criptojdes, genjlave, kcyl, kcyQ; Ibljperl.tbljierl; • m7-l; m4=l; 14=0; 12=0; 15=%xout; i5= A xoul; 16=%burier; ¡6=Abiirfcr; 17=%burfcr; i7==Abiifrcr; rcscí fl 1; sct f!2; iinask=0; ÍI.XÜ--G; din(limpiar)~ax0; {Rcset de la bandera f l l (Activa la bandera (12} axO=num; dni(ncnlr)=axO; axü=Axc_rx; din(punlJ4J=axO; ilc=0.sff; Elimino interrupciones pendientes 59 nop; imask=0x230; espora: { Habilito IRQE, IRQ2 y el puerto serial SPOllTÜ {Lazo principa! de programa } idlc; ax0-dm{finjlag); at~piiss ¡i.xü; ¡fue rts; jiimp espera; { S u b r u l i n a donde se procesa las muestras cíe entrada en base al algoritmo IDES2181.DSP } inpiit_síiinples: ena sec_reg; ax0=dm(inicio); ar=pass axO; Ifcq i'! Í; Íix0=dni(i7,m7): dm(dntoin)=íixO; mrl=axU; ar=din(par__cnír); ai—ar¡-1; dm(par_cntr)=ar; af=tstbi!0orar; if ne jump primera_vez; dm(inO)-mrl; •Í4= A lIaves_N; cnlr=etapas; do lazo_IIaves until ce; cali genjlave; lazojlaves: dm(i4,m4)=si; ¡4= A l!aves_N-!-ctapas-1; ni5=-l; axl=dni(inl); axO=dm(inÜ); cnd"ctnpa.s; do et;ipíi_ides n n t i l ce; si~dm(i4,m5); cnl! criptojdcs; c(apa__!de.s: nop; nirl=dni(ou¡0); dm(ontl)-ax I ; dm(oul0)=axü; j u m p tnmsniilir; pi'iniera_vez: dm(in l ) = n i r l ; mrl=dm(üull); Iransmilir: dm(ix_buf-t-1)=mrl; dm(tx_btiPf-2)=mi-l; axU=dm(Üx3le5); aíHslbii O o f a x O ; il'ne i'li; {Llama a la Snbrutina de generación de llavesj (Llama ;t In Subrntina de desüiicnplaciónj ÍTransmite muestras desencriptadas por el canal izquierdo} iTransniilc muestras dcsencnpUuias por ei canal derecho} 60 ayO~dni(dak>iii); i*!~t!m(pimt_M); din(¡'l,in<])~ayü; dm(puníj'l}=¡4; dm(Í5,n]'I)-mrl; ¡ir= dm(ncnlr); ;ip=ar-l; din(ncnlr)=ar; if nc rtí; axO=Oxf; dni(rín_nng)=a.\0; rli; { -------------------------------- Subriiíiiiii cjnc nliüiitk' In Inlcrrnpción 1RQ2 Írq2: clin scc_rcg; si=io(0): axO=tlin(iiiÍ_r.x); ayü=2; ai-=nxO-ayO; ifcq jumpsigtiej-xio; iliníiní_rx)=íir; rli; sigue_rxio: din(iC,m7)=s¡; axO=¡; dni(Í!iÍc¡o)=axO; logglc fll; j rl¡; ----------------------------- Suhriiiiiin (|iie aticiidL 1 In fntemipeión IRQIÍ ¡rqe: lugglcni; axü=0; diii{Íni_rx}-¡!x(); dni(oiilO)=iixO; din(mQ)-axO; din(burfcr)=axt); dni(buricr-M)-axÜ; din(¡nícÍo)=axO; axü=!laveü; din(kcyO)=axü; axO=l!avel; dniCk-cyl)=iixÜ; ifc-OxIT; nop; rti; .include <Aíin.(lsp>; .RNDMOD; 61 Programa del Alüorílmo DESI2181.DSP: { U E S I 2 1 8 1 . U S P . - Encriplacion de muestras para una iteración del Algoritmo OESI2181.DSP Miguel E. Vicuña Muño?;- líncripíación de Voz - Octubre 99 Entrada: axl = Dato anterior axO = Dato actual s¡ = Clave Kn Salida: a x l = Dato anterior axO = Dato actual Rcpistros alterados: ax 1, axQ, a y l , ayü, sr, mr , ar, 13, Í3 Tiempo de ejecución: 564 ciclos de máquina .MODULE .ENTRY .EXTERNAL .EXTERN AL dcsencriptacion_dcs; criptojdesx; permutar; tbl_j>erl, tbMpcrl; .VAR/DM nienenl, mencnO; cripto_idesx: dni(mcnenl)=axl; dm(mcncnO)=axO; {Guarda el dato anterior cncriptado DI en mencn I } (Guarda el dato actual cncriptado DO en mencnO} ayO=dm(mcnenl); 13=0; ¡3= A tbl_ipcrI; cali permutar; mrO=ar; (Guarda el dato anterior D I = BO en el } {registro AYO y llama a la Subruüma PERMUTAR inversa} (a la utilizada en la encriptación para obtener así el dato } (de entrada AO} {El dato actual desencriptado lo almacena en MRO = AO } ayO=dm(mcncnl); axO=si; ar=axO xor ayO; (Guarda el dato anterior DI en el registro AYO} (Almacena la Llave Kn utilizada en esta etapa en AXO ] (Encuentra el dato Cl y lo almacena en AR realizando un] (XOR a nivel de bit entre D I y Kn } {Cl es almacenado en AYO y se llama a la S u b r u t i n a ) {PERMUTAR utilizada en la encriplacíón} (para encontrar el dato de Fl y almacenarlo en AR} ayO=ar; 13=0; Í3= rt lbl_perl; cal! permutar; ayO=dm(menenO); ar=ar xor ayü; ayO=ar; 13=0; ¡3= A tbMperl; cali permutar; ax! =ar; ax()=mrO; rts; .ENDMOD; (Almaceno el dato actual DO en AYO} { Se encuentra el dato B I realizando una operación Xor} {a nivel de bit entre Fl y DO y lo almaceno en AR} (Almacena el dato de B l en AYO} (Luego se llama a la Subrutina PERMUTAR inversa} (para encontrar el dato anterior desencriptado de entrada A (AK-AI } (Almacena el dato anterior desencriptado al registro AXI } { Almacena el dato actual desencriptado al registro AX I } Programa del Algoritmo GEN KEY.DSP: gcri_kcy.dsp - S u b r n l i n a para generar la clave de una iteración de la dcsciicriptacion DESI.2181 Miguel Eni-i(|ue Vicuña M u ñ o z / Encrip(ación de Voz/ Octubre 1999 Salida: SÍ = llave N Registros alterados: ayO, mr, ar, sr, 13, i3 Tiempo de ejecución: 564 ciclos de máquina Llamadas a subrutinas permutar xor_críp .MODULE .[•NTRY .EXTERNAL .EXTERNAL Gcnerac¡on_Ilave; gcn_llave; pcnnutar, xor_crip; tbl_pcrl; .VAR/DM .IN1T .INIT keyl,kcyO: k e y l : 0x1971; kcyO:Ox!999; .GLOBAL keyl, keyü; gcn_llave: ayO=dm(keyl); 13=0; i3= A tbl_perl; cali pcrmtiííir: mrl=ar; mrO=mrl; cali xor_cnp; mr!=ar; {Almacena la clave [Cien el registro AYO} (Llama a la subrutirm PERMUTAR} {Obtiene los 16 bits permutados de la izquierda de la clave) { Ll y lo almacena en el registro MRO = LI} ¡Llama a la subrutína XOR_CR1P y se obtiene Ll.xor} [y se lo almacena en el registro M R 1 = Ll xor } ayO-dni(keyO); 13=0; Í3= A lbl_peri; cali permutar; mrO=ar; {Almacena la clave KO en el registro AYO} cali xor_crip; mrO=ar; {Llama a la subrutina XOR_CRIP y se obtiene LOxor} { y lo almacena en el registro MRO= LO xor } si-;ishift m r l by 4 (hi); sr=sr or LshiA mrü by 4 (lo); si=srl; {Obtención de la clave Kn para esta etapa desplazando} {LI cuatro posiciones hacia la izquierda! sr=ashiñ mrl by 3 (hij; sr=sr or Ishift mrO by 3 (lo); dm(keyl)=srl; {Rotación de la clave (LI y LO) tres posiciones a la} (izquierda, para ser utilizada en In siguiente etapa} {Almacena la clave K¡, ,, } {Llama o la subrutina PERMUTAR} {Obtiene los 16 bits permutados de la derecha de la clave} { LO y lo almacena en'el registro MRO = LO} 63