<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9849">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sniffer: add state definitions, improve IRQ handling, update pins configuration<br><br>Change-Id: I6b5dfd6d573ac122a60585a24c8a620642805ad5<br>---<br>M firmware/libcommon/source/sniffer.c<br>1 file changed, 78 insertions(+), 27 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/49/9849/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/libcommon/source/sniffer.c b/firmware/libcommon/source/sniffer.c</span><br><span>index 7cc688b..987e3e5 100644</span><br><span>--- a/firmware/libcommon/source/sniffer.c</span><br><span>+++ b/firmware/libcommon/source/sniffer.c</span><br><span>@@ -17,6 +17,9 @@</span><br><span>  * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span>  *</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+/* This code implement the Sniffer mode to sniff the communication between a SIM card and a phone.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For historical reasons (i.e. SIMtrace hardware) the USART peripheral connected to the SIM card is used.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> #include "board.h"</span><br><span> #include "simtrace.h"</span><br><span> </span><br><span>@@ -35,20 +38,51 @@</span><br><span> /** Maximum ucSize in bytes of the smartcard answer to a command.*/</span><br><span> #define MAX_ANSWER_SIZE         10</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/** Maximum ATR ucSize in bytes.*/</span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_ATR_SIZE            55</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Maximum Answer-To-Reset (ATR) size in bytes ucSize in bytes</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @note defined in ISO/IEC 7816-3:2006(E) section 8.2.1 as 32, on top the initial character TS of section 8.1</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @remark technical there is no size limitation since Yi present in T0,TDi will indicate if more interface bytes are present, including TDi+i</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_ATR_SIZE 33</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! ISO 7816-3 states relevant to the sniff mode */</span><br><span style="color: hsl(120, 100%, 40%);">+enum iso7816_3_sniff_state {</span><br><span style="color: hsl(120, 100%, 40%);">+     ISO7816_S_RESET, /*!< in Reset */</span><br><span style="color: hsl(120, 100%, 40%);">+  ISO7816_S_WAIT_ATR, /*!< waiting for ATR to start */</span><br><span style="color: hsl(120, 100%, 40%);">+       ISO7816_S_IN_ATR, /*!< while we are receiving the ATR */</span><br><span style="color: hsl(120, 100%, 40%);">+   ISO7816_S_WAIT_APDU, /*!< waiting for start of new APDU */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_S_IN_APDU, /*!< inside a single APDU */</span><br><span style="color: hsl(120, 100%, 40%);">+    ISO7816_S_IN_PTS, /*!< while we are inside the PTS / PSS */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Answer-To-Reset (ATR) sub-states of ISO7816_S_IN_ATR</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @note defined in ISO/IEC 7816-3:2006(E) section 8</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum atr_sniff_state {</span><br><span style="color: hsl(120, 100%, 40%);">+    ATR_S_WAIT_TS, /*!< initial byte */</span><br><span style="color: hsl(120, 100%, 40%);">+        ATR_S_WAIT_T0, /*!< format byte */</span><br><span style="color: hsl(120, 100%, 40%);">+ ATR_S_WAIT_TA, /*!< first sub-group interface byte */</span><br><span style="color: hsl(120, 100%, 40%);">+      ATR_S_WAIT_TB, /*!< second sub-group interface byte */</span><br><span style="color: hsl(120, 100%, 40%);">+     ATR_S_WAIT_TC, /*!< third sub-group interface byte */</span><br><span style="color: hsl(120, 100%, 40%);">+      ATR_S_WAIT_TD, /*!< fourth sub-group interface byte */</span><br><span style="color: hsl(120, 100%, 40%);">+     ATR_S_WAIT_HIST, /*!< historical byte */</span><br><span style="color: hsl(120, 100%, 40%);">+   ATR_S_WAIT_TCK, /*!< check byte */</span><br><span style="color: hsl(120, 100%, 40%);">+ ATR_S_DONE, /*!< to indicated all ATR bytes have been received */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /*------------------------------------------------------------------------------</span><br><span>  *         Internal variables</span><br><span>  *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(0, 100%, 40%);">-/* Pin configuration to sniff communication (using USART connection to SIM card) */</span><br><span style="color: hsl(0, 100%, 40%);">-static const Pin pins_sniff[] = { PINS_SIM_SNIFF_SIM };</span><br><span style="color: hsl(0, 100%, 40%);">-/* Connect phone to card using bus switch */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* note: the sniffer code is currently designed to support only one sniffing interface, but the hardware would support a second one.</span><br><span style="color: hsl(120, 100%, 40%);">+ * to support a second sniffer interface the code should be restructured to use handles.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Pin configurations */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Pin configuration to sniff communication (using USART connection card) */</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pins_sniff[] = { PINS_SIM_SNIFF };</span><br><span> static const Pin pins_bus[] = { PINS_BUS_SNIFF };</span><br><span style="color: hsl(0, 100%, 40%);">-/* Power card using phone VCC */</span><br><span style="color: hsl(0, 100%, 40%);">-static const Pin pins_power[] = { PWR_PINS };</span><br><span style="color: hsl(0, 100%, 40%);">-/* Timer Counter pins to measure ETU timing */</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pins_power[] = { PINS_PWR_SNIFF };</span><br><span> static const Pin pins_tc[] = { PINS_TC };</span><br><span style="color: hsl(120, 100%, 40%);">+/* USART related variables */</span><br><span> /* USART peripheral used to sniff communication */</span><br><span> static struct Usart_info sniff_usart = {</span><br><span>         .base = USART_SIM,</span><br><span>@@ -59,23 +93,6 @@</span><br><span> static struct ringbuf sniff_buffer;</span><br><span> </span><br><span> /*------------------------------------------------------------------------------</span><br><span style="color: hsl(0, 100%, 40%);">- *         Global functions</span><br><span style="color: hsl(0, 100%, 40%);">- *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void Sniffer_usart0_irq(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Read channel status register */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint32_t csr = sniff_usart.base->US_CSR & sniff_usart.base->US_IMR;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Verify if character has been received */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (csr & US_CSR_RXRDY) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Read communication data byte between phone and SIM */</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t byte = sniff_usart.base->US_RHR;</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Store sniffed data into buffer (also clear interrupt */ </span><br><span style="color: hsl(0, 100%, 40%);">-             rbuf_write(&sniff_buffer, byte);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*------------------------------------------------------------------------------</span><br><span>  *         Internal functions</span><br><span>  *------------------------------------------------------------------------------*/</span><br><span> </span><br><span>@@ -88,6 +105,38 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Interrupt Service Routine called on USART activity */</span><br><span style="color: hsl(120, 100%, 40%);">+void Sniffer_usart_irq(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Read channel status register */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t csr = sniff_usart.base->US_CSR & sniff_usart.base->US_IMR;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Verify if character has been received */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (csr & US_CSR_RXRDY) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Read communication data byte between phone and SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t byte = sniff_usart.base->US_RHR;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Store sniffed data into buffer (also clear interrupt */</span><br><span style="color: hsl(120, 100%, 40%);">+            rbuf_write(&sniff_buffer, byte);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*------------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *         Global functions</span><br><span style="color: hsl(120, 100%, 40%);">+ *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void Sniffer_usart1_irq(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ID_USART1==sniff_usart.id) {</span><br><span style="color: hsl(120, 100%, 40%);">+              Sniffer_usart_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void Sniffer_usart0_irq(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ID_USART0==sniff_usart.id) {</span><br><span style="color: hsl(120, 100%, 40%);">+              Sniffer_usart_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*-----------------------------------------------------------------------------</span><br><span>  *          Initialization routine</span><br><span>  *-----------------------------------------------------------------------------*/</span><br><span>@@ -128,8 +177,10 @@</span><br><span>  USART_SetReceiverEnabled(sniff_usart.base, 1);</span><br><span>       /* Enable interrupt to indicate when data has been received */</span><br><span>       USART_EnableIt(sniff_usart.base, US_IER_RXRDY);</span><br><span style="color: hsl(0, 100%, 40%);">- /* Enable interrupt requests for the USART peripheral (warning: use IRQ corresponding to USART) */</span><br><span style="color: hsl(0, 100%, 40%);">-      NVIC_EnableIRQ(USART0_IRQn);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Enable interrupt requests for the USART peripheral */</span><br><span style="color: hsl(120, 100%, 40%);">+      NVIC_EnableIRQ(IRQ_USART_SIM);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* TODO configure RST pin ISR */</span><br><span> }</span><br><span> </span><br><span> /* main (idle/busy) loop of this USB configuration */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9849">change 9849</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9849"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I6b5dfd6d573ac122a60585a24c8a620642805ad5 </div>
<div style="display:none"> Gerrit-Change-Number: 9849 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>