<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: asxeem</title>
    <description>The latest articles on DEV Community by asxeem (@asxeem).</description>
    <link>https://dev.to/asxeem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4028308%2Fd1be858f-8a66-4273-936e-edee5213bba4.png</url>
      <title>DEV Community: asxeem</title>
      <link>https://dev.to/asxeem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asxeem"/>
    <language>en</language>
    <item>
      <title>openaliro: an opensource UWB Aliro smart lock your iPhone Wallet unlocks on approach</title>
      <dc:creator>asxeem</dc:creator>
      <pubDate>Sun, 19 Jul 2026 18:39:19 +0000</pubDate>
      <link>https://dev.to/asxeem/openaliro-an-opensource-uwb-aliro-smart-lock-your-iphone-wallet-unlocks-on-approach-3212</link>
      <guid>https://dev.to/asxeem/openaliro-an-opensource-uwb-aliro-smart-lock-your-iphone-wallet-unlocks-on-approach-3212</guid>
      <description>&lt;p&gt;Walk up to a door with an iPhone in your pocket and it unlocks. Walk away, it relocks. No app, no button, no Face ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6yoalh2l21jrrqaw9qwi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6yoalh2l21jrrqaw9qwi.gif" alt="Demo Video2" width="560" height="996"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's &lt;a href="https://csa-iot.org/all-solutions/aliro/" rel="noopener noreferrer"&gt;Aliro&lt;/a&gt;, the CSA's digital key standard. &lt;a href="https://github.com/asxeem/openaliro" rel="noopener noreferrer"&gt;openaliro&lt;/a&gt; is the lock side of it, running on easily available, inexpensive chipsets. &lt;/p&gt;

&lt;p&gt;Real unlock, real hardware, live iPhone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What works
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NFC tap unlock (Express Mode, no Face ID)&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluetooth auth + key agreement&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-air ranging setup&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secure UWB ranging&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distance-gated unlock / relock&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Approach unlock has been driven end to end against a live iPhone. No tagged release yet; everything is on &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  It started as a bug
&lt;/h2&gt;

&lt;p&gt;NFC tap unlocked the door fine. Walking up to it did nothing.&lt;/p&gt;

&lt;p&gt;Tap working is a useful clue: it means the Bluetooth transport, provisioning, and credentials are all healthy, so whatever was broken lived in the UWB ranging path. Chasing that one bug turned into reverse-engineering the whole approach-unlock exchange, which is now written up in the repo.&lt;/p&gt;

&lt;p&gt;A few things I learned that surprised me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The whole conversation happens over Bluetooth.&lt;/strong&gt; UWB never carries any application data. It exists purely to measure distance. Everything else, auth, setup, the unlock decision, rides on BLE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't replay it.&lt;/strong&gt; Both sides work out the ranging key independently from the Bluetooth authentication. It never travels over the air, so you can record the radio all day and never open the door with a recording.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The radio lies quietly.&lt;/strong&gt; The setup handshake can report success while the radio stays completely silent. Every negotiated parameter gets folded into the ranging key, so if the two sides disagree on a single value, they derive different keys and simply never hear each other. A lot of this project was staring at a silent radio that insisted everything was fine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing that finally broke it open: instead of trusting the Bluetooth clock sync to line up the listening window, the lock recovers its timing from the first packet of each exchange, which arrives in the clear. That's what turned "setup looks good, radio is dead" into live distance readings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the hardware choice makes it hard
&lt;/h2&gt;

&lt;p&gt;Most UWB projects use a module that does the ranging for you, hiding the radio behind a friendly API, and expensive cost of the chipset. This one runs on a bare Qorvo DW3110 with no UWB coprocessor. So the medium-access layer, the physical framing, the scrambled timestamp sequence that makes a distance measurement trustworthy, and the key schedule all run in firmware on the nRF5340's application core.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqoic9w42lr899aepae92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqoic9w42lr899aepae92.png" alt="Tests Passing" width="605" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it fits together
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9fw3hotkgy66ngl00du.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9fw3hotkgy66ngl00du.gif" alt="Animated Mermaid" width="600" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nRF5340 DK&lt;/td&gt;
&lt;td&gt;Host SoC: BLE + Matter + ranging engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DWM3000EVB (DW3110)&lt;/td&gt;
&lt;td&gt;UWB radio, on the Arduino header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-NUCLEO-NFC12A1 (ST25R300)&lt;/td&gt;
&lt;td&gt;NFC reader for tap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three boards, off the shelf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Thanks to Nordic Semiconductor for the nRF Connect SDK and door-lock add-on, &lt;a href="https://github.com/br101" rel="noopener noreferrer"&gt;@Bruno Randolf&lt;/a&gt;  for the ISC DW3000 decadriver, and &lt;a href="https://github.com/kormax/" rel="noopener noreferrer"&gt;@kormax&lt;/a&gt;, &lt;a href="https://github.com/rednblkx/" rel="noopener noreferrer"&gt;@rednblkx&lt;/a&gt;, and &lt;a href="https://github.com/scottjg/" rel="noopener noreferrer"&gt;@scottjg&lt;/a&gt; for ideas on ECP, HomeKey, and UWB chipsets.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Independent personal project, not affiliated with any vendor or standards body. Provided as is. Don't rely on it to secure anything of value.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7pvqantggwgkb28axrbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7pvqantggwgkb28axrbt.png" alt="Get Started" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full source code &lt;a href="https://github.com/openaliro/openaliro" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smarthome</category>
      <category>opensource</category>
      <category>ios</category>
      <category>firmware</category>
    </item>
  </channel>
</rss>
