; generated by ARM C/C++ Compiler, 4.1 [Build 894]
; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o.\STM324xG_EVAL\stm32f4xx_cryp_tdes.o --asm_dir=.\STM324xG_EVAL\ --list_dir=.\STM324xG_EVAL\ --depend=.\STM324xG_EVAL\stm32f4xx_cryp_tdes.d --cpu=Cortex-M4.fp --apcs=interwork -O0 -Otime -I..\ -I..\..\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include -I..\..\..\Libraries\STM32F4xx_StdPeriph_Driver\inc -I..\..\..\Utilities\STM32_EVAL\Common -I..\..\..\Utilities\STM32_EVAL\STM3240_41_G_EVAL -IC:\Keil\ARM\RV31\Inc -IC:\Keil\ARM\CMSIS\Include -IC:\Keil\ARM\Inc\ST\STM32F4xx -D__MICROLIB -DUSE_STM324xG_EVAL -DSTM32F4XX -DUSE_STDPERIPH_DRIVER --omf_browse=.\STM324xG_EVAL\stm32f4xx_cryp_tdes.crf ..\..\..\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c]
                          THUMB

                          AREA ||i.CRYP_TDES_CBC||, CODE, READONLY, ALIGN=1

                  CRYP_TDES_CBC PROC
;;;197      */
;;;198    ErrorStatus CRYP_TDES_CBC(uint8_t Mode, uint8_t Key[24], uint8_t InitVectors[8],
000000  e92d4ff0          PUSH     {r4-r11,lr}
;;;199                              uint8_t *Input, uint32_t Ilength, uint8_t *Output)
;;;200    {
000004  ed2d8b02          VPUSH    {d8}
000008  b093              SUB      sp,sp,#0x4c
00000a  4680              MOV      r8,r0
00000c  4689              MOV      r9,r1
00000e  4692              MOV      r10,r2
000010  469b              MOV      r11,r3
000012  ed9d8a1f          VLDR     s16,[sp,#0x7c]
;;;201      CRYP_InitTypeDef TDES_CRYP_InitStructure;
;;;202      CRYP_KeyInitTypeDef TDES_CRYP_KeyInitStructure;
;;;203      CRYP_IVInitTypeDef TDES_CRYP_IVInitStructure;
;;;204      __IO uint32_t counter = 0;
000016  2000              MOVS     r0,#0
000018  9004              STR      r0,[sp,#0x10]
;;;205      uint32_t busystatus = 0;
00001a  9003              STR      r0,[sp,#0xc]
;;;206      ErrorStatus status = SUCCESS;
00001c  2001              MOVS     r0,#1
00001e  9002              STR      r0,[sp,#8]
;;;207      uint32_t keyaddr    = (uint32_t)Key;
000020  464c              MOV      r4,r9
;;;208      uint32_t inputaddr  = (uint32_t)Input;
000022  465d              MOV      r5,r11
;;;209      uint32_t outputaddr = (uint32_t)Output;
000024  ee186a10          VMOV     r6,s16
;;;210      uint32_t ivaddr     = (uint32_t)InitVectors;
000028  4657              MOV      r7,r10
;;;211      uint32_t i = 0;
00002a  2000              MOVS     r0,#0
00002c  9001              STR      r0,[sp,#4]
;;;212    
;;;213      /* Crypto structures initialisation*/
;;;214      CRYP_KeyStructInit(&TDES_CRYP_KeyInitStructure);
00002e  a809              ADD      r0,sp,#0x24
000030  f7fffffe          BL       CRYP_KeyStructInit
;;;215    
;;;216      /* Crypto Init for Encryption process */
;;;217      if(Mode == MODE_ENCRYPT) /* TDES encryption */
000034  f1b80f01          CMP      r8,#1
000038  d103              BNE      |L1.66|
;;;218      {
;;;219        TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
00003a  2000              MOVS     r0,#0
00003c  f8ad0044          STRH     r0,[sp,#0x44]
000040  e002              B        |L1.72|
                  |L1.66|
;;;220      }
;;;221      else
;;;222      {
;;;223        TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
000042  2004              MOVS     r0,#4
000044  f8ad0044          STRH     r0,[sp,#0x44]
                  |L1.72|
;;;224      }
;;;225      TDES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_CBC;
000048  2008              MOVS     r0,#8
00004a  f8ad0046          STRH     r0,[sp,#0x46]
;;;226      TDES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
00004e  2080              MOVS     r0,#0x80
000050  f8ad0048          STRH     r0,[sp,#0x48]
;;;227    
;;;228      CRYP_Init(&TDES_CRYP_InitStructure);
000054  a811              ADD      r0,sp,#0x44
000056  f7fffffe          BL       CRYP_Init
;;;229    
;;;230      /* Key Initialisation */
;;;231      TDES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr));
00005a  6820              LDR      r0,[r4,#0]
00005c  ba00              REV      r0,r0
00005e  900b              STR      r0,[sp,#0x2c]
;;;232      keyaddr+=4;
000060  1d24              ADDS     r4,r4,#4
;;;233      TDES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr));
000062  6820              LDR      r0,[r4,#0]
000064  ba00              REV      r0,r0
000066  900c              STR      r0,[sp,#0x30]
;;;234      keyaddr+=4;
000068  1d24              ADDS     r4,r4,#4
;;;235      TDES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr));
00006a  6820              LDR      r0,[r4,#0]
00006c  ba00              REV      r0,r0
00006e  900d              STR      r0,[sp,#0x34]
;;;236      keyaddr+=4;
000070  1d24              ADDS     r4,r4,#4
;;;237      TDES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr));
000072  6820              LDR      r0,[r4,#0]
000074  ba00              REV      r0,r0
000076  900e              STR      r0,[sp,#0x38]
;;;238      keyaddr+=4;
000078  1d24              ADDS     r4,r4,#4
;;;239      TDES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr));
00007a  6820              LDR      r0,[r4,#0]
00007c  ba00              REV      r0,r0
00007e  900f              STR      r0,[sp,#0x3c]
;;;240      keyaddr+=4;
000080  1d24              ADDS     r4,r4,#4
;;;241      TDES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr));
000082  6820              LDR      r0,[r4,#0]
000084  ba00              REV      r0,r0
000086  9010              STR      r0,[sp,#0x40]
;;;242      CRYP_KeyInit(& TDES_CRYP_KeyInitStructure);
000088  a809              ADD      r0,sp,#0x24
00008a  f7fffffe          BL       CRYP_KeyInit
;;;243    
;;;244      /* Initialization Vectors */
;;;245      TDES_CRYP_IVInitStructure.CRYP_IV0Left = __REV(*(uint32_t*)(ivaddr));
00008e  6838              LDR      r0,[r7,#0]
000090  ba00              REV      r0,r0
000092  9005              STR      r0,[sp,#0x14]
;;;246      ivaddr+=4;
000094  1d3f              ADDS     r7,r7,#4
;;;247      TDES_CRYP_IVInitStructure.CRYP_IV0Right= __REV(*(uint32_t*)(ivaddr));
000096  6838              LDR      r0,[r7,#0]
000098  ba00              REV      r0,r0
00009a  9006              STR      r0,[sp,#0x18]
;;;248      CRYP_IVInit(&TDES_CRYP_IVInitStructure);
00009c  a805              ADD      r0,sp,#0x14
00009e  f7fffffe          BL       CRYP_IVInit
;;;249    
;;;250      /* Flush IN/OUT FIFO */
;;;251      CRYP_FIFOFlush();
0000a2  f7fffffe          BL       CRYP_FIFOFlush
;;;252    
;;;253      /* Enable Crypto processor */
;;;254      CRYP_Cmd(ENABLE);
0000a6  2001              MOVS     r0,#1
0000a8  f7fffffe          BL       CRYP_Cmd
;;;255    
;;;256      for(i=0; ((i<Ilength) && (status != ERROR)); i+=8)
0000ac  2000              MOVS     r0,#0
0000ae  9001              STR      r0,[sp,#4]
0000b0  e028              B        |L1.260|
                  |L1.178|
;;;257      {
;;;258        /* Write the Input block in the Input FIFO */
;;;259        CRYP_DataIn(*(uint32_t*)(inputaddr));
0000b2  6828              LDR      r0,[r5,#0]
0000b4  f7fffffe          BL       CRYP_DataIn
;;;260        inputaddr+=4;
0000b8  1d2d              ADDS     r5,r5,#4
;;;261        CRYP_DataIn(*(uint32_t*)(inputaddr));
0000ba  6828              LDR      r0,[r5,#0]
0000bc  f7fffffe          BL       CRYP_DataIn
;;;262        inputaddr+=4;
0000c0  1d2d              ADDS     r5,r5,#4
;;;263    
;;;264        /* Wait until the complete message has been processed */
;;;265        counter = 0;
0000c2  2000              MOVS     r0,#0
0000c4  9004              STR      r0,[sp,#0x10]
;;;266        do
0000c6  bf00              NOP      
                  |L1.200|
;;;267        {
;;;268          busystatus = CRYP_GetFlagStatus(CRYP_FLAG_BUSY);
0000c8  2010              MOVS     r0,#0x10
0000ca  f7fffffe          BL       CRYP_GetFlagStatus
0000ce  9003              STR      r0,[sp,#0xc]
;;;269          counter++;
0000d0  9804              LDR      r0,[sp,#0x10]
0000d2  1c40              ADDS     r0,r0,#1
0000d4  9004              STR      r0,[sp,#0x10]
;;;270        }while ((counter != TDESBUSY_TIMEOUT) && (busystatus != RESET));
0000d6  9804              LDR      r0,[sp,#0x10]
0000d8  f5b03f80          CMP      r0,#0x10000
0000dc  d002              BEQ      |L1.228|
0000de  9803              LDR      r0,[sp,#0xc]
0000e0  2800              CMP      r0,#0
0000e2  d1f1              BNE      |L1.200|
                  |L1.228|
;;;271    
;;;272        if (busystatus != RESET)
0000e4  9803              LDR      r0,[sp,#0xc]
0000e6  b110              CBZ      r0,|L1.238|
;;;273       {
;;;274           status = ERROR;
0000e8  2000              MOVS     r0,#0
0000ea  9002              STR      r0,[sp,#8]
0000ec  e007              B        |L1.254|
                  |L1.238|
;;;275        }
;;;276        else
;;;277        {
;;;278    
;;;279          /* Read the Output block from the Output FIFO */
;;;280          *(uint32_t*)(outputaddr) = CRYP_DataOut();
0000ee  f7fffffe          BL       CRYP_DataOut
0000f2  6030              STR      r0,[r6,#0]
;;;281          outputaddr+=4;
0000f4  1d36              ADDS     r6,r6,#4
;;;282          *(uint32_t*)(outputaddr) = CRYP_DataOut();
0000f6  f7fffffe          BL       CRYP_DataOut
0000fa  6030              STR      r0,[r6,#0]
;;;283          outputaddr+=4;
0000fc  1d36              ADDS     r6,r6,#4
                  |L1.254|
0000fe  9801              LDR      r0,[sp,#4]            ;256
000100  3008              ADDS     r0,r0,#8              ;256
000102  9001              STR      r0,[sp,#4]            ;256
                  |L1.260|
000104  991e              LDR      r1,[sp,#0x78]         ;256
000106  9801              LDR      r0,[sp,#4]            ;256
000108  4288              CMP      r0,r1                 ;256
00010a  d202              BCS      |L1.274|
00010c  9802              LDR      r0,[sp,#8]            ;256
00010e  2800              CMP      r0,#0                 ;256
000110  d1cf              BNE      |L1.178|
                  |L1.274|
;;;284        }
;;;285      }
;;;286    
;;;287      /* Disable Crypto */
;;;288      CRYP_Cmd(DISABLE);
000112  2000              MOVS     r0,#0
000114  f7fffffe          BL       CRYP_Cmd
;;;289    
;;;290      return status; 
000118  9802              LDR      r0,[sp,#8]
;;;291    }
00011a  b013              ADD      sp,sp,#0x4c
00011c  ecbd8b02          VPOP     {d8}
000120  e8bd8ff0          POP      {r4-r11,pc}
;;;292    /**
                          ENDP


                          AREA ||i.CRYP_TDES_ECB||, CODE, READONLY, ALIGN=1

                  CRYP_TDES_ECB PROC
;;;95       */
;;;96     ErrorStatus CRYP_TDES_ECB(uint8_t Mode, uint8_t Key[24], uint8_t *Input, 
000000  e92d4fff          PUSH     {r0-r11,lr}
;;;97                               uint32_t Ilength, uint8_t *Output)
;;;98     {
000004  ed2d8b02          VPUSH    {d8}
000008  b08b              SUB      sp,sp,#0x2c
00000a  4680              MOV      r8,r0
00000c  468b              MOV      r11,r1
00000e  ed9d8a1a          VLDR     s16,[sp,#0x68]
;;;99       CRYP_InitTypeDef TDES_CRYP_InitStructure;
;;;100      CRYP_KeyInitTypeDef TDES_CRYP_KeyInitStructure;
;;;101      __IO uint32_t counter = 0;
000012  2700              MOVS     r7,#0
;;;102      uint32_t busystatus = 0;
000014  46b9              MOV      r9,r7
;;;103      ErrorStatus status = SUCCESS;
000016  2001              MOVS     r0,#1
000018  9000              STR      r0,[sp,#0]
;;;104      uint32_t keyaddr    = (uint32_t)Key;
00001a  465c              MOV      r4,r11
;;;105      uint32_t inputaddr  = (uint32_t)Input;
00001c  ed9d0a0f          VLDR     s0,[sp,#0x3c]
000020  ee105a10          VMOV     r5,s0
;;;106      uint32_t outputaddr = (uint32_t)Output;
000024  ee186a10          VMOV     r6,s16
;;;107      uint32_t i = 0;
000028  f04f0a00          MOV      r10,#0
;;;108    
;;;109      /* Crypto structures initialisation*/
;;;110      CRYP_KeyStructInit(&TDES_CRYP_KeyInitStructure);
00002c  a801              ADD      r0,sp,#4
00002e  f7fffffe          BL       CRYP_KeyStructInit
;;;111    
;;;112      /* Crypto Init for Encryption process */
;;;113      if(Mode == MODE_ENCRYPT) /* TDES encryption */
000032  f1b80f01          CMP      r8,#1
000036  d103              BNE      |L2.64|
;;;114      {
;;;115         TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
000038  2000              MOVS     r0,#0
00003a  f8ad0024          STRH     r0,[sp,#0x24]
00003e  e002              B        |L2.70|
                  |L2.64|
;;;116      }
;;;117      else /*if(Mode == MODE_DECRYPT)*/ /* TDES decryption */
;;;118      {
;;;119         TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
000040  2004              MOVS     r0,#4
000042  f8ad0024          STRH     r0,[sp,#0x24]
                  |L2.70|
;;;120      }
;;;121    
;;;122      TDES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_ECB;
000046  2000              MOVS     r0,#0
000048  f8ad0026          STRH     r0,[sp,#0x26]
;;;123      TDES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
00004c  2080              MOVS     r0,#0x80
00004e  f8ad0028          STRH     r0,[sp,#0x28]
;;;124      CRYP_Init(&TDES_CRYP_InitStructure);
000052  a809              ADD      r0,sp,#0x24
000054  f7fffffe          BL       CRYP_Init
;;;125    
;;;126      /* Key Initialisation */
;;;127      TDES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr));
000058  6820              LDR      r0,[r4,#0]
00005a  ba00              REV      r0,r0
00005c  9003              STR      r0,[sp,#0xc]
;;;128      keyaddr+=4;
00005e  1d24              ADDS     r4,r4,#4
;;;129      TDES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr));
000060  6820              LDR      r0,[r4,#0]
000062  ba00              REV      r0,r0
000064  9004              STR      r0,[sp,#0x10]
;;;130      keyaddr+=4;
000066  1d24              ADDS     r4,r4,#4
;;;131      TDES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr));
000068  6820              LDR      r0,[r4,#0]
00006a  ba00              REV      r0,r0
00006c  9005              STR      r0,[sp,#0x14]
;;;132      keyaddr+=4;
00006e  1d24              ADDS     r4,r4,#4
;;;133      TDES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr));
000070  6820              LDR      r0,[r4,#0]
000072  ba00              REV      r0,r0
000074  9006              STR      r0,[sp,#0x18]
;;;134      keyaddr+=4;
000076  1d24              ADDS     r4,r4,#4
;;;135      TDES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr));
000078  6820              LDR      r0,[r4,#0]
00007a  ba00              REV      r0,r0
00007c  9007              STR      r0,[sp,#0x1c]
;;;136      keyaddr+=4;
00007e  1d24              ADDS     r4,r4,#4
;;;137      TDES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr));
000080  6820              LDR      r0,[r4,#0]
000082  ba00              REV      r0,r0
000084  9008              STR      r0,[sp,#0x20]
;;;138      CRYP_KeyInit(& TDES_CRYP_KeyInitStructure);
000086  a801              ADD      r0,sp,#4
000088  f7fffffe          BL       CRYP_KeyInit
;;;139    
;;;140      /* Flush IN/OUT FIFO */
;;;141      CRYP_FIFOFlush();
00008c  f7fffffe          BL       CRYP_FIFOFlush
;;;142    
;;;143      /* Enable Crypto processor */
;;;144      CRYP_Cmd(ENABLE);
000090  2001              MOVS     r0,#1
000092  f7fffffe          BL       CRYP_Cmd
;;;145    
;;;146      for(i=0; ((i<Ilength) && (status != ERROR)); i+=8)
000096  f04f0a00          MOV      r10,#0
00009a  e024              B        |L2.230|
                  |L2.156|
;;;147      {
;;;148        /* Write the Input block in the Input FIFO */
;;;149        CRYP_DataIn(*(uint32_t*)(inputaddr));
00009c  6828              LDR      r0,[r5,#0]
00009e  f7fffffe          BL       CRYP_DataIn
;;;150        inputaddr+=4;
0000a2  1d2d              ADDS     r5,r5,#4
;;;151        CRYP_DataIn(*(uint32_t*)(inputaddr));
0000a4  6828              LDR      r0,[r5,#0]
0000a6  f7fffffe          BL       CRYP_DataIn
;;;152        inputaddr+=4;
0000aa  1d2d              ADDS     r5,r5,#4
;;;153    
;;;154        /* Wait until the complete message has been processed */
;;;155        counter = 0;
0000ac  2700              MOVS     r7,#0
;;;156        do
0000ae  bf00              NOP      
                  |L2.176|
;;;157        {
;;;158          busystatus = CRYP_GetFlagStatus(CRYP_FLAG_BUSY);
0000b0  2010              MOVS     r0,#0x10
0000b2  f7fffffe          BL       CRYP_GetFlagStatus
0000b6  4681              MOV      r9,r0
;;;159          counter++;
0000b8  1c7f              ADDS     r7,r7,#1
;;;160        }while ((counter != TDESBUSY_TIMEOUT) && (busystatus != RESET));
0000ba  f5b73f80          CMP      r7,#0x10000
0000be  d002              BEQ      |L2.198|
0000c0  f1b90f00          CMP      r9,#0
0000c4  d1f4              BNE      |L2.176|
                  |L2.198|
;;;161    
;;;162        if (busystatus != RESET)
0000c6  f1b90f00          CMP      r9,#0
0000ca  d002              BEQ      |L2.210|
;;;163        {
;;;164           status = ERROR;
0000cc  2000              MOVS     r0,#0
0000ce  9000              STR      r0,[sp,#0]
0000d0  e007              B        |L2.226|
                  |L2.210|
;;;165        }
;;;166        else
;;;167        {
;;;168    
;;;169          /* Read the Output block from the Output FIFO */
;;;170          *(uint32_t*)(outputaddr) = CRYP_DataOut();
0000d2  f7fffffe          BL       CRYP_DataOut
0000d6  6030              STR      r0,[r6,#0]
;;;171          outputaddr+=4;
0000d8  1d36              ADDS     r6,r6,#4
;;;172          *(uint32_t*)(outputaddr) = CRYP_DataOut();
0000da  f7fffffe          BL       CRYP_DataOut
0000de  6030              STR      r0,[r6,#0]
;;;173          outputaddr+=4;
0000e0  1d36              ADDS     r6,r6,#4
                  |L2.226|
0000e2  f10a0a08          ADD      r10,r10,#8            ;146
                  |L2.230|
0000e6  9810              LDR      r0,[sp,#0x40]         ;146
0000e8  4582              CMP      r10,r0                ;146
0000ea  d202              BCS      |L2.242|
0000ec  9800              LDR      r0,[sp,#0]            ;146
0000ee  2800              CMP      r0,#0                 ;146
0000f0  d1d4              BNE      |L2.156|
                  |L2.242|
;;;174        }
;;;175      }
;;;176    
;;;177      /* Disable Crypto */
;;;178      CRYP_Cmd(DISABLE);
0000f2  2000              MOVS     r0,#0
0000f4  f7fffffe          BL       CRYP_Cmd
;;;179    
;;;180      return status; 
0000f8  9800              LDR      r0,[sp,#0]
;;;181    }
0000fa  b00b              ADD      sp,sp,#0x2c
0000fc  ecbd8b02          VPOP     {d8}
000100  b004              ADD      sp,sp,#0x10
000102  e8bd8ff0          POP      {r4-r11,pc}
;;;182    
                          ENDP


;*** Start embedded assembler ***

#line 1 "..\\..\\..\\Libraries\\STM32F4xx_StdPeriph_Driver\\src\\stm32f4xx_cryp_tdes.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___21_stm32f4xx_cryp_tdes_c_2fc87a0d____REV16|
#line 114 "C:\\Keil\\ARM\\CMSIS\\Include\\core_cmInstr.h"
|__asm___21_stm32f4xx_cryp_tdes_c_2fc87a0d____REV16| PROC
#line 115

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___21_stm32f4xx_cryp_tdes_c_2fc87a0d____REVSH|
#line 128
|__asm___21_stm32f4xx_cryp_tdes_c_2fc87a0d____REVSH| PROC
#line 129

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
