<rss xmlns:source="http://source.scripting.com/" version="2.0">
  <channel>
    <title>News From Timo</title>
    <link>https://tperfitt.twocanoes.com/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Sat, 04 Jul 2026 15:31:27 -0500</lastBuildDate>
    <item>
      <title>Gemalto IDPrime 930 Cards</title>
      <link>https://tperfitt.twocanoes.com/2026/07/04/gemalto-idprime-cards.html</link>
      <pubDate>Sat, 04 Jul 2026 15:31:27 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/07/04/gemalto-idprime-cards.html</guid>
      <description>&lt;p&gt;For some reason, i really enjoy writing to binary interfaces, like the binary interface for smart cards.&lt;/p&gt;
&lt;p&gt;Smart cards communicate devices by sending hex codes (called APDU codes). i have implemented compatibility with a bunch of smart cards but all of them had a published spec for how the interface works. A customer wanted support for smart cards they are using for their Windows PCs. They selected the Gemalto IDPrime 930 smart card because it doesn&amp;rsquo;t require a separate mini driver in Windows. It isn&amp;rsquo;t supported on iOS. I&amp;rsquo;ve added support for other types of cards so I agreed to add support for IDPrime card to Smart Card Utility on iOS. However, the IDPrime cards do not have a publish spec. The cards appear to generally follow the standard ISO 7816 APDU commands with some proprietary commands.&lt;/p&gt;
&lt;p&gt;I started by getting a trace of a working smart card session on Windows. Here is the start of a trace:&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:47;Reset&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 01 51 00 00&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;6A 82&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 00 03 00 00&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;6A 82&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 00 18 43 4D&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;61 69&lt;/p&gt;
&lt;p&gt;2026-05-13;09:17:48;00 C0 00 00 69&lt;/p&gt;
&lt;p&gt;Each APDU command has a instructions, 2 parameters and (optionally) some data. Looking at the example above, the first 2 lines sent return &amp;ldquo;6A 82&amp;rdquo; which is like a 404 error in HTTP. Those are good indicators that the driver is probing the card. The third line sent returns a &amp;ldquo;61 69&amp;rdquo; which means &amp;ldquo;Data available of length 69 bytes&amp;rdquo;. I can then see what data comes back and see if I can recognize it. I know that is a mTLS authentication so I know what generally is needed.&lt;/p&gt;
&lt;p&gt;The fun part is once I get the translation layer implemented, it all starts to work in the app to authenticate with the website. I figure out what codes are needed for which operation (certificate reading, PIN validation, hash signing) and like magic, the card starts working with smart card readers and our app. It is like filling in a crossword puzzle to start your car.&lt;/p&gt;
&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/smartcard2universaluniversal1x.png&#34;&gt;
</description>
      <source:markdown>For some reason, i really enjoy writing to binary interfaces, like the binary interface for smart cards.

Smart cards communicate devices by sending hex codes (called APDU codes). i have implemented compatibility with a bunch of smart cards but all of them had a published spec for how the interface works. A customer wanted support for smart cards they are using for their Windows PCs. They selected the Gemalto IDPrime 930 smart card because it doesn&#39;t require a separate mini driver in Windows. It isn&#39;t supported on iOS. I&#39;ve added support for other types of cards so I agreed to add support for IDPrime card to Smart Card Utility on iOS. However, the IDPrime cards do not have a publish spec. The cards appear to generally follow the standard ISO 7816 APDU commands with some proprietary commands.  

I started by getting a trace of a working smart card session on Windows. Here is the start of a trace:

2026-05-13;09:17:47;Reset

2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 01 51 00 00 

2026-05-13;09:17:48;6A 82 

2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 00 03 00 00 

2026-05-13;09:17:48;6A 82 

2026-05-13;09:17:48;00 A4 04 00 07 A0 00 00 00 18 43 4D 

2026-05-13;09:17:48;61 69 

2026-05-13;09:17:48;00 C0 00 00 69 


Each APDU command has a instructions, 2 parameters and (optionally) some data. Looking at the example above, the first 2 lines sent return &#34;6A 82&#34; which is like a 404 error in HTTP. Those are good indicators that the driver is probing the card. The third line sent returns a &#34;61 69&#34; which means &#34;Data available of length 69 bytes&#34;. I can then see what data comes back and see if I can recognize it. I know that is a mTLS authentication so I know what generally is needed.

The fun part is once I get the translation layer implemented, it all starts to work in the app to authenticate with the website. I figure out what codes are needed for which operation (certificate reading, PIN validation, hash signing) and like magic, the card starts working with smart card readers and our app. It is like filling in a crossword puzzle to start your car.

&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/smartcard2universaluniversal1x.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Social Rules</title>
      <link>https://tperfitt.twocanoes.com/2026/06/19/social-rules.html</link>
      <pubDate>Fri, 19 Jun 2026 13:50:21 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/06/19/social-rules.html</guid>
      <description>&lt;p&gt;good social rules both online and offline:&lt;/p&gt;
&lt;p&gt;No well-actually’s
No feigned surprise
No backseat driving
No subtle-isms&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.recurse.com/social-rules&#34;&gt;www.recurse.com/social-ru&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>good social rules both online and offline:

No well-actually’s
No feigned surprise
No backseat driving
No subtle-isms


[www.recurse.com/social-ru...](https://www.recurse.com/social-rules)
</source:markdown>
    </item>
    
    <item>
      <title>The Last Bit</title>
      <link>https://tperfitt.twocanoes.com/2026/06/14/the-last-bit.html</link>
      <pubDate>Sun, 14 Jun 2026 15:33:16 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/06/14/the-last-bit.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://social.twocanoes.com/uploads/2026/c889eecd-8b70-48e6-9d43-600179059953.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I spent the last couple of months fine tuning DFU Blaster Pro for a large update (DFU Blaster 5). We seeded it out to customer in production, and got some great feedback. I went back in and updated the pieces that needed updating.&lt;/p&gt;
&lt;p&gt;Leaving a codebase for a bit and coming back gives a fresh perspective and a bit of joy. Finishing up a release can be hectic and stressful but going back to it is like seeing an old friend.&lt;/p&gt;
</description>
      <source:markdown>![](https://social.twocanoes.com/uploads/2026/c889eecd-8b70-48e6-9d43-600179059953.jpg)

I spent the last couple of months fine tuning DFU Blaster Pro for a large update (DFU Blaster 5). We seeded it out to customer in production, and got some great feedback. I went back in and updated the pieces that needed updating.

Leaving a codebase for a bit and coming back gives a fresh perspective and a bit of joy. Finishing up a release can be hectic and stressful but going back to it is like seeing an old friend.


</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2026/05/15/productive-week-we-released-xpsso.html</link>
      <pubDate>Fri, 15 May 2026 18:11:31 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/05/15/productive-week-we-released-xpsso.html</guid>
      <description>&lt;p&gt;Productive week. We released Xpsso (enables Platform SSO with Google cloud), XCreds Mobile (cloud auth on iPad) passed QA and DFU Blaster 5 is now feature complete.&lt;/p&gt;
&lt;p&gt;I also hired two new people.&lt;/p&gt;
&lt;p&gt;Excelsior!&lt;/p&gt;
&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/24b1dda5ed.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Productive week. We released Xpsso (enables Platform SSO with Google cloud), XCreds Mobile (cloud auth on iPad) passed QA and DFU Blaster 5 is now feature complete. 

I also hired two new people. 

Excelsior!

&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/24b1dda5ed.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>DFU Restore for Mac is now almost 4 times faster!</title>
      <link>https://tperfitt.twocanoes.com/2026/04/19/dfu-restore-for-mac-is.html</link>
      <pubDate>Sun, 19 Apr 2026 21:30:02 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/04/19/dfu-restore-for-mac-is.html</guid>
      <description>&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/5b36189227.png&#34; width=&#34;600&#34; height=&#34;375&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Big news! The firmware on M4 and M5 Macs supports USB 3 speeds during DFU restores! This will make a huge difference for restoring multiple Mac systems at the same time. Our &lt;a href=&#34;https://twocanoes.com/erase-and-restore&#34;&gt;Erase and Restore system&lt;/a&gt; is based on DFU Restores for Apple Silicon Macs and the time to restore 15 Macs has gone from 35 minutes to less than 10 minutes! That is total time, not per device.&lt;/p&gt;
&lt;p&gt;If you are already using DFU Blaster with the Acroname Hub3c, you have everything you need! Make sure you are using USB 3 cables and you will see the increased speed when restoring M4 and M5 Macs. We have tested on the M4 MacBook Air, the M5 MacBook Pro and the M4 Mac mini. All of these devices restored at USB 3 speeds and took about 3 minutes to restore a single Mac!&lt;/p&gt;
&lt;p&gt;You can mix and match Macs that restore at USB 2 and USB 3 speeds, and can even mix in USB-C iOS devices as well. We haven&amp;rsquo;t tested the new Mac Neo, but hopefully that will support the new faster speeds as well. We will have the newest Mac in our lab early next week and will know soon!&lt;/p&gt;
&lt;p&gt;Here is a photo of our lab with a mix of Apple Silicon Macs and iPads all restoring at the same time:&lt;/p&gt;
&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/img-1552.jpg&#34;&gt;
</description>
      <source:markdown>&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/5b36189227.png&#34; width=&#34;600&#34; height=&#34;375&#34; alt=&#34;&#34;&gt;

Big news! The firmware on M4 and M5 Macs supports USB 3 speeds during DFU restores! This will make a huge difference for restoring multiple Mac systems at the same time. Our [Erase and Restore system](https://twocanoes.com/erase-and-restore) is based on DFU Restores for Apple Silicon Macs and the time to restore 15 Macs has gone from 35 minutes to less than 10 minutes! That is total time, not per device. 

If you are already using DFU Blaster with the Acroname Hub3c, you have everything you need! Make sure you are using USB 3 cables and you will see the increased speed when restoring M4 and M5 Macs. We have tested on the M4 MacBook Air, the M5 MacBook Pro and the M4 Mac mini. All of these devices restored at USB 3 speeds and took about 3 minutes to restore a single Mac! 

You can mix and match Macs that restore at USB 2 and USB 3 speeds, and can even mix in USB-C iOS devices as well. We haven&#39;t tested the new Mac Neo, but hopefully that will support the new faster speeds as well. We will have the newest Mac in our lab early next week and will know soon!

Here is a photo of our lab with a mix of Apple Silicon Macs and iPads all restoring at the same time:

&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/img-1552.jpg&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Tracing USB-PD</title>
      <link>https://tperfitt.twocanoes.com/2026/04/14/tracing-usbpd.html</link>
      <pubDate>Tue, 14 Apr 2026 22:23:22 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/04/14/tracing-usbpd.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://tperfitt.twocanoes.com/uploads/2026/ipad-a16.jpg&#34; alt=&#34;iPad Image&#34; title=&#34;iPad with Device&#34;&gt;&lt;/p&gt;
&lt;p&gt;It looks like the command to put an iPad (A16) into DFU mode changed. There are some introspection that you can with USB-PD to find out what commands a device supports, but none of them seemed to work. I needed to go deeper and see the actual USB-PD packets. I got a CY4500 EZ-PD Protocol Analyzer from Mouser. It promised to show me the power delivery packets on the wire. I was going to hook it up to a PC when I got home, but when I got it at the office today, the docs said it worked on macOS.&lt;/p&gt;
&lt;p&gt;I got it working, but it wasn&amp;rsquo;t easy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The macOS installer package was not signed. I had to allow it from System Settings -&amp;gt; Privacy &amp;amp; Security.&lt;/li&gt;
&lt;li&gt;Once the app was installed, it crashed with a Java error. Looking closer, it couldn&amp;rsquo;t find libUSB. So I installed it with &amp;ldquo;brew install libusb&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;The app launched! Yea! But then it said I had to install a firmware update on the device and told me where it was and how to run it.&lt;/li&gt;
&lt;li&gt;The firmware updater is a macOS app but wouldn&amp;rsquo;t launch. It had an invalid code signingin signature. I had to sign to code sign it to get it to launch.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once I did all that, the traces started to work! It seems the issue is the version of the Vendor Defined Message (VDM) packet that is being sent is the only difference and I suspect the new iPads require it. No way to test it yet, but it was pretty cool to do a &amp;ldquo;man in the middle&amp;rdquo; trace of USB-PD traffic.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/1826825dc5.jpg&#34;&gt;
</description>
      <source:markdown>
![iPad Image](https://tperfitt.twocanoes.com/uploads/2026/ipad-a16.jpg &#34;iPad with Device&#34;)

It looks like the command to put an iPad (A16) into DFU mode changed. There are some introspection that you can with USB-PD to find out what commands a device supports, but none of them seemed to work. I needed to go deeper and see the actual USB-PD packets. I got a CY4500 EZ-PD Protocol Analyzer from Mouser. It promised to show me the power delivery packets on the wire. I was going to hook it up to a PC when I got home, but when I got it at the office today, the docs said it worked on macOS. 

I got it working, but it wasn&#39;t easy:

1. The macOS installer package was not signed. I had to allow it from System Settings -\&gt; Privacy &amp; Security.
2. Once the app was installed, it crashed with a Java error. Looking closer, it couldn&#39;t find libUSB. So I installed it with &#34;brew install libusb&#34;.
3. The app launched! Yea! But then it said I had to install a firmware update on the device and told me where it was and how to run it.
4. The firmware updater is a macOS app but wouldn&#39;t launch. It had an invalid code signingin signature. I had to sign to code sign it to get it to launch. 

Once I did all that, the traces started to work! It seems the issue is the version of the Vendor Defined Message (VDM) packet that is being sent is the only difference and I suspect the new iPads require it. No way to test it yet, but it was pretty cool to do a &#34;man in the middle&#34; trace of USB-PD traffic.



&lt;img src=&#34;uploads/2026/1826825dc5.jpg&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>A Keychain to Store Your Secrets</title>
      <link>https://tperfitt.twocanoes.com/2026/04/02/a-keychain-to-store-your.html</link>
      <pubDate>Thu, 02 Apr 2026 22:06:47 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/04/02/a-keychain-to-store-your.html</guid>
      <description>&lt;p&gt;It is rare that I see a dialog that has been around for a &lt;em&gt;long&lt;/em&gt; time in macOS that I have never seen. It happened to me yesterday. And the dialog itself was confusing.&lt;/p&gt;
&lt;p&gt;When logging into macOS with a SmartCard at initial login, I got a dialog that said:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;The system will now create a keychain to store your secrets. Your SmartCard will automatically unlock it. Please choose a password that can unlock it separately. You may use your account password or pick another one. For security reasons, do not use your SmartCard PIN or similar text.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It turns out that you are supposed to enter in the user’s local password here. If you use a different password, it will work fine until you log in with a password rather than the SmartCard. Once you do that, the Login keychain that was created during the initial SmartCard login will get moved aside and a new keychain will get created with the user account password. The keychain will not get out of sync and logging in with both the SmartCard and a username/password will work fine.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you are curious about how I figured this out, read on…&lt;/p&gt;
&lt;p&gt;The dialog presented was confusing on many levels. It wasn’t asking for my login password but rather having me set a password for a new keychain. The user account already had a password but it wasn’t asking for that. I was logging in with a SmartCard, and I know that a SmartCard can log in without a password and can also unlock the user’s keychain without a password. So why did it need a password for a new keychain? On top of all this, there are 2 keychains for the user account (one “login” keychain that is file-based, and one “Local/iCloud” keychain that is secure enclaved-backed and based on the iOS keychain). Which keychain requires the password since two needed keychains were created (the Login keychain and the Local keychain)?&lt;/p&gt;
&lt;p&gt;I am getting ahead of myself. Here is the problem I was trying to solve. I wanted to be able to have a Mac fully set up with the most recent macOS version and allow initial login with a SmartCard. Using our DFU Blaster Pro app, the Mac gets wiped and updated to the most recent version of macOS. After that completes, the Mac automatically enrolls in MDM using Automatic Device Enrollment. A local admin is created during device enrollment as well. After enrollment, a package is sent down to create a local user that has an attribute in local directory service that has the RFC 822 username defined on the user’s SmartCard. MDM also pushes down a SmartCard attribute mapping file that maps the RFC 822 username from the SmartCard certificate to an attribute on the local user account.&lt;/p&gt;
&lt;p&gt;It worked great. The Mac was at the login window asking for the local admin username. I inserted a smart card and the login window changed to enter a PIN for the SmartCard user. After entering the PIN, I expected to wait a bit and then be at the desktop. However, I saw the “The system will now create a keychain to store your secrets” dialog.&lt;/p&gt;
&lt;p&gt;I put in a new generated password from my brain and everything seemed to work fine. I was able to open Keychain Access and the keychain was unlocked. I logged out and logged in with the user’s password and checked the keychain, and it was again unlocked. How could a keychain have 2 passwords?&lt;/p&gt;
&lt;p&gt;So I investigated. It turns out the Login Keychain didn’t have 2 passwords, but rather the keychain created when logging in with a SmartCard was replaced when I logged in with a user’s password. Here is what happened:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;When the account was created with a password during MDM setup, the account got a password and home directory, but no keychain was created.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the user logged in using a SmartCard, a keychain had to be created. While a SmartCard can unlock a keychain, you cannot open Keychain Access or view a keychain item without entering in a password. The system forces you to set a password when creating the keychain so you’ll have a known password to use to view passwords in Keychain Access. SmartCard can unlock the keychain but you’ll need a password to view the passwords in Keychain Access. I have no idea why macOS doesn’t prompt for the local account password and use that to set the password on the new keychain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When logging out and logging in with a password, macOS sees that you have a keychain with a password that doesn’t match the login keychain so the login keychain is moved aside and a new keychain is created using the login password. Any items in the login keychain are no longer available in the Login keychain, though are still in a separate keychain file in the keychain folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When logging out and logging back in as a SmartCard user using a SmartCard, macOS sees that there is a keychain that cannot be unlocked using the SmartCard but has an unknown password, so it prompts the user for the password to unlock the keychain. This password is the login user’s password since it was created when logging in with a user’s password. Once the password is given, the keychain is updated to allow the SmartCard to unlock it. This keychain is now able to be unlocked with the user’s login password and the SmartCard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So where is the password used that the user was forced to create when first logging in with a SmartCard? Nowhere. It is associated with a keychain that was moved aside and not used any longer. If the smart card user never logged in with a password, the keychain is never moved aside and still uses that “special” password. That keychain will be moved aside as soon as the user logs into the user account using a password. If the user had any items in the keychain, they will no longer be available to the system or in Keychain Access unless added manually.&lt;/p&gt;
&lt;p&gt;What about the iOS style keychain versus the macOS-style keychain? It seems that all of this behavior is around the macOS-style keychain and the “Local/iCloud” iOS style keychain is not related. Though perhaps related, the Local/iCloud Keychain has a “legacy login keychain” entry that cannot be viewed regardless of the password used.&lt;/p&gt;
&lt;p&gt;Perhaps that is an investigation for another day.&lt;/p&gt;
&lt;p&gt;Additional note: I found out from the MacAdmins SmartCard slack channel that Platform SSO will prompt with this same dialog when creating a user at login window with a SmartCard.&lt;/p&gt;
&lt;p&gt;I also created a video of the setup:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twocanoes.com/video/dfu-blaster-with-automatic-device-enrollment-and-attribute-mapping/&#34;&gt;https://twocanoes.com/video/dfu-blaster-with-automatic-device-enrollment-and-attribute-mapping/&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;uploads/2026/image-2.png&#34;&gt;
</description>
      <source:markdown>It is rare that I see a dialog that has been around for a *long* time in macOS that I have never seen. It happened to me yesterday. And the dialog itself was confusing. 

When logging into macOS with a SmartCard at initial login, I got a dialog that said:

&#34;The system will now create a keychain to store your secrets. Your SmartCard will automatically unlock it. Please choose a password that can unlock it separately. You may use your account password or pick another one. For security reasons, do not use your SmartCard PIN or similar text.&#34;

*It turns out that you are supposed to enter in the user’s local password here. If you use a different password, it will work fine until you log in with a password rather than the SmartCard. Once you do that, the Login keychain that was created during the initial SmartCard login will get moved aside and a new keychain will get created with the user account password. The keychain will not get out of sync and logging in with both the SmartCard and a username/password will work fine.*

If you are curious about how I figured this out, read on…

The dialog presented was confusing on many levels. It wasn’t asking for my login password but rather having me set a password for a new keychain. The user account already had a password but it wasn’t asking for that. I was logging in with a SmartCard, and I know that a SmartCard can log in without a password and can also unlock the user’s keychain without a password. So why did it need a password for a new keychain? On top of all this, there are 2 keychains for the user account (one “login” keychain that is file-based, and one “Local/iCloud” keychain that is secure enclaved-backed and based on the iOS keychain). Which keychain requires the password since two needed keychains were created (the Login keychain and the Local keychain)?

I am getting ahead of myself. Here is the problem I was trying to solve. I wanted to be able to have a Mac fully set up with the most recent macOS version and allow initial login with a SmartCard. Using our DFU Blaster Pro app, the Mac gets wiped and updated to the most recent version of macOS. After that completes, the Mac automatically enrolls in MDM using Automatic Device Enrollment. A local admin is created during device enrollment as well. After enrollment, a package is sent down to create a local user that has an attribute in local directory service that has the RFC 822 username defined on the user’s SmartCard. MDM also pushes down a SmartCard attribute mapping file that maps the RFC 822 username from the SmartCard certificate to an attribute on the local user account. 

It worked great. The Mac was at the login window asking for the local admin username. I inserted a smart card and the login window changed to enter a PIN for the SmartCard user. After entering the PIN, I expected to wait a bit and then be at the desktop. However, I saw the “The system will now create a keychain to store your secrets” dialog.

I put in a new generated password from my brain and everything seemed to work fine. I was able to open Keychain Access and the keychain was unlocked. I logged out and logged in with the user’s password and checked the keychain, and it was again unlocked. How could a keychain have 2 passwords? 

So I investigated. It turns out the Login Keychain didn’t have 2 passwords, but rather the keychain created when logging in with a SmartCard was replaced when I logged in with a user’s password. Here is what happened:

1. When the account was created with a password during MDM setup, the account got a password and home directory, but no keychain was created.

2. When the user logged in using a SmartCard, a keychain had to be created. While a SmartCard can unlock a keychain, you cannot open Keychain Access or view a keychain item without entering in a password. The system forces you to set a password when creating the keychain so you’ll have a known password to use to view passwords in Keychain Access. SmartCard can unlock the keychain but you’ll need a password to view the passwords in Keychain Access. I have no idea why macOS doesn’t prompt for the local account password and use that to set the password on the new keychain.

3. When logging out and logging in with a password, macOS sees that you have a keychain with a password that doesn’t match the login keychain so the login keychain is moved aside and a new keychain is created using the login password. Any items in the login keychain are no longer available in the Login keychain, though are still in a separate keychain file in the keychain folder.

4. When logging out and logging back in as a SmartCard user using a SmartCard, macOS sees that there is a keychain that cannot be unlocked using the SmartCard but has an unknown password, so it prompts the user for the password to unlock the keychain. This password is the login user’s password since it was created when logging in with a user’s password. Once the password is given, the keychain is updated to allow the SmartCard to unlock it. This keychain is now able to be unlocked with the user’s login password and the SmartCard.

So where is the password used that the user was forced to create when first logging in with a SmartCard? Nowhere. It is associated with a keychain that was moved aside and not used any longer. If the smart card user never logged in with a password, the keychain is never moved aside and still uses that “special” password. That keychain will be moved aside as soon as the user logs into the user account using a password. If the user had any items in the keychain, they will no longer be available to the system or in Keychain Access unless added manually.

What about the iOS style keychain versus the macOS-style keychain? It seems that all of this behavior is around the macOS-style keychain and the “Local/iCloud” iOS style keychain is not related. Though perhaps related, the Local/iCloud Keychain has a “legacy login keychain” entry that cannot be viewed regardless of the password used. 

Perhaps that is an investigation for another day.

Additional note: I found out from the MacAdmins SmartCard slack channel that Platform SSO will prompt with this same dialog when creating a user at login window with a SmartCard. 

I also created a video of the setup:

[https://twocanoes.com/video/dfu-blaster-with-automatic-device-enrollment-and-attribute-mapping/](https://twocanoes.com/video/dfu-blaster-with-automatic-device-enrollment-and-attribute-mapping/)


&lt;img src=&#34;uploads/2026/image-2.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Designed for iPad</title>
      <link>https://tperfitt.twocanoes.com/2026/03/01/designed-for-ipad.html</link>
      <pubDate>Sun, 01 Mar 2026 19:06:27 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/03/01/designed-for-ipad.html</guid>
      <description>&lt;p&gt;There has been a distinct push by Apple to make macOS more iOS-like. I have been using a Mac since the &amp;rsquo;90s, it wasn&amp;rsquo;t something that I was particularly fond of. Apple made statements about &amp;ldquo;Let the Mac be the Mac&amp;rdquo;, but release after release, there was a definitive &amp;ldquo;iOS first&amp;rdquo; feeling.&lt;/p&gt;
&lt;p&gt;With Apple Silicon, Apple brought the ability to run iPad apps on macOS (&amp;ldquo;Designed for iPad&amp;rdquo;). While this might seem like a great thing for macOS, it resulted in removing motivation from macOS developers to continue building macOS native versions of their apps. SwiftUI helped unify the interface work for all platform but it still required building and updating two separate targets.&lt;/p&gt;
&lt;p&gt;Our Smart Card Utility app started on macOS. We now have a macOS and an iOS version. The iOS version is much more popular than the macOS version but I liked having a native macOS app to keep it Mac-like. It wasn&amp;rsquo;t always easy because some external devices we support have libraries for iOS only. We reached out to 3rd party library vendors to provide macOS native versions without much success. However, since some of the devices were Bluetooth devices, some vendors provided the Bluetooth profile characteristics and we created a direct Bluetooth connection instead of using the library. This worked for some external devices, but not all of them. Without native libraries, it was not possible to have full support of all the external devices across both the macOS and iOS apps. It was also not possible to use SwiftUI since that would require native libraries on both iOS and macOS.&lt;/p&gt;
&lt;p&gt;This led to confusion and frustration with our customers and I realized that most of our customers would be fine with an app that looks like an iPad app on macOS since they are already used to that interface on iOS. It also means that our tutorials, documentation, and screen shots could be unified.&lt;/p&gt;
&lt;p&gt;So we are now going to be building a single, unified version for iOS that runs on Apple Silicon Macs. Also, since Apple will stop supporting Intel macOS post-Tahoe, we will still have to keep the old version around for a while that runs on Intel.&lt;/p&gt;
&lt;p&gt;It feels the scales have tipped and it is easier for both developers and customers to have an iOS version and support the Mac using Designed for iPad. I am not convinced on SwiftUI for macOS, since it is difficult to get it to look native on macOS. Without a bunch of platform specific implementations, the user interface ends up looking a lot like iOS anyways due to Apple unifying of a lot of the UI elements, making them look more iOS flavored.&lt;/p&gt;
&lt;p&gt;I suspect it was inevitable but this marks an acceptance on my part on what the future looks like.&lt;/p&gt;
&lt;p&gt;It looks like iOS.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/designed-for-ipad.jpg&#34;&gt;
</description>
      <source:markdown>There has been a distinct push by Apple to make macOS more iOS-like. I have been using a Mac since the &#39;90s, it wasn&#39;t something that I was particularly fond of. Apple made statements about &#34;Let the Mac be the Mac&#34;, but release after release, there was a definitive &#34;iOS first&#34; feeling.

With Apple Silicon, Apple brought the ability to run iPad apps on macOS (&#34;Designed for iPad&#34;). While this might seem like a great thing for macOS, it resulted in removing motivation from macOS developers to continue building macOS native versions of their apps. SwiftUI helped unify the interface work for all platform but it still required building and updating two separate targets. 

Our Smart Card Utility app started on macOS. We now have a macOS and an iOS version. The iOS version is much more popular than the macOS version but I liked having a native macOS app to keep it Mac-like. It wasn&#39;t always easy because some external devices we support have libraries for iOS only. We reached out to 3rd party library vendors to provide macOS native versions without much success. However, since some of the devices were Bluetooth devices, some vendors provided the Bluetooth profile characteristics and we created a direct Bluetooth connection instead of using the library. This worked for some external devices, but not all of them. Without native libraries, it was not possible to have full support of all the external devices across both the macOS and iOS apps. It was also not possible to use SwiftUI since that would require native libraries on both iOS and macOS.

This led to confusion and frustration with our customers and I realized that most of our customers would be fine with an app that looks like an iPad app on macOS since they are already used to that interface on iOS. It also means that our tutorials, documentation, and screen shots could be unified.

So we are now going to be building a single, unified version for iOS that runs on Apple Silicon Macs. Also, since Apple will stop supporting Intel macOS post-Tahoe, we will still have to keep the old version around for a while that runs on Intel. 

It feels the scales have tipped and it is easier for both developers and customers to have an iOS version and support the Mac using Designed for iPad. I am not convinced on SwiftUI for macOS, since it is difficult to get it to look native on macOS. Without a bunch of platform specific implementations, the user interface ends up looking a lot like iOS anyways due to Apple unifying of a lot of the UI elements, making them look more iOS flavored.

I suspect it was inevitable but this marks an acceptance on my part on what the future looks like. 

It looks like iOS.

&lt;img src=&#34;uploads/2026/designed-for-ipad.jpg&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>XCreds on iPad</title>
      <link>https://tperfitt.twocanoes.com/2026/01/25/xcreds-on-ipad.html</link>
      <pubDate>Sun, 25 Jan 2026 22:33:09 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/25/xcreds-on-ipad.html</guid>
      <description>&lt;p&gt;I was curious about the options for authenticating with a cloud provider to get access to an iPad (similar to what you get on macOS with XCreds). I got it working. Here is how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;iPad is enrolled in MDM with Automatic Device Enrollment. This is required for putting into Autonomous Single App Mode. Autonomous Single App Mode means the MDM puts the app in Single App mode, but the app itself can exit Single App Mode. The user can&amp;rsquo;t exit the app or get access to other features of the iPad like Control Center.&lt;/li&gt;
&lt;li&gt;The app shows a web view to authenticate the user using their OIDC credentials.&lt;/li&gt;
&lt;li&gt;On successful authentication, the tokens are verified and if successful, the app allows the user to go out of Single App Mode.&lt;/li&gt;
&lt;li&gt;When the user is done with the session, they open the app again and the app puts itself into Single App Mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I found that if restarted the iPad when it is locked in Single App Mode, it goes back into Single App Mode. If the iPad is restarted when the user is logged in and not in Single App Mode, it will be out of Single App Mode when the iPad comes back up.&lt;/p&gt;
&lt;p&gt;I created a short video showing how it works:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twocanoes.com/video/xcreds-on-ipad-with-autonomous-single-app-mode/&#34;&gt;twocanoes.com/video/xcr&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;uploads/2026/hero-sam.jpg&#34;&gt;
</description>
      <source:markdown>I was curious about the options for authenticating with a cloud provider to get access to an iPad (similar to what you get on macOS with XCreds). I got it working. Here is how it works:

1. iPad is enrolled in MDM with Automatic Device Enrollment. This is required for putting into Autonomous Single App Mode. Autonomous Single App Mode means the MDM puts the app in Single App mode, but the app itself can exit Single App Mode. The user can&#39;t exit the app or get access to other features of the iPad like Control Center.
2. The app shows a web view to authenticate the user using their OIDC credentials.
3. On successful authentication, the tokens are verified and if successful, the app allows the user to go out of Single App Mode. 
4. When the user is done with the session, they open the app again and the app puts itself into Single App Mode.

I found that if restarted the iPad when it is locked in Single App Mode, it goes back into Single App Mode. If the iPad is restarted when the user is logged in and not in Single App Mode, it will be out of Single App Mode when the iPad comes back up.

I created a short video showing how it works:

[twocanoes.com/video/xcr...](https://twocanoes.com/video/xcreds-on-ipad-with-autonomous-single-app-mode/)



&lt;img src=&#34;uploads/2026/hero-sam.jpg&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Twocanoes Signage</title>
      <link>https://tperfitt.twocanoes.com/2026/01/19/twocanoes-signage.html</link>
      <pubDate>Mon, 19 Jan 2026 21:32:59 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/19/twocanoes-signage.html</guid>
      <description>&lt;p&gt;They installed our signage outside our office today and it felt like a milestone had been reached.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/img-0128.png&#34; alt=&#34;Tim Perfitt in front of the new Twocanoes sign at the new office.&#34;&gt;
</description>
      <source:markdown>They installed our signage outside our office today and it felt like a milestone had been reached.

&lt;img src=&#34;uploads/2026/img-0128.png&#34; alt=&#34;Tim Perfitt in front of the new Twocanoes sign at the new office.&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Canada breaks with US, slashes 100% tariffs on Chinese EVs to 6%</title>
      <link>https://tperfitt.twocanoes.com/2026/01/16/canada-breaks-with-us-slashes.html</link>
      <pubDate>Fri, 16 Jan 2026 14:30:18 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/16/canada-breaks-with-us-slashes.html</guid>
      <description>&lt;pre&gt;&lt;code&gt;Of course, this is going to make Washington furious. The US has been trying to build a “Fortress North America” against Chinese EVs. By letting 49,000 units in tariff-free (or near tariff-free), Canada is effectively saying it values affordable climate solutions (and canola exports) more than complete alignment with US industrial policy, which is understandable since the US was the one to go hostile on trade with Canada.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EVs are the future. That much is clear.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://electrek.co/2026/01/16/canada-breaks-with-us-slashes-100-tariffs-chinese-evs/&#34;&gt;electrek.co/2026/01/1&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>    Of course, this is going to make Washington furious. The US has been trying to build a “Fortress North America” against Chinese EVs. By letting 49,000 units in tariff-free (or near tariff-free), Canada is effectively saying it values affordable climate solutions (and canola exports) more than complete alignment with US industrial policy, which is understandable since the US was the one to go hostile on trade with Canada.

EVs are the future. That much is clear.

[electrek.co/2026/01/1...](https://electrek.co/2026/01/16/canada-breaks-with-us-slashes-100-tariffs-chinese-evs/)
</source:markdown>
    </item>
    
    <item>
      <title>The Personal Price of AI (so far)</title>
      <link>https://tperfitt.twocanoes.com/2026/01/13/the-personal-price-of-ai.html</link>
      <pubDate>Tue, 13 Jan 2026 17:38:03 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/13/the-personal-price-of-ai.html</guid>
      <description>&lt;p&gt;Let me get this out of the way, first: I use AI but it isn&amp;rsquo;t called AI. It is called autocomplete. It is called spelling and grammar correction. It is called finding photos by describing them. It is forced on me by algorithms in YouTube and Spotify.&lt;/p&gt;
&lt;p&gt;What I don&amp;rsquo;t do is allow statistical models to take over my decisions. In the last few months, I have been on the receiving end of the carnage brought about by the rush to allow statistical models to make decisions.&lt;/p&gt;
&lt;p&gt;The first example is a contract. I was entering into a large contract for a 3 year plus term and was sent the first draft. I sent it over to a lawyer to review. I had looked over the contract to prepare for our meeting to discuss the contact, and it looked like what a contract should look like, but had some weird clauses in it. When I got a call from the lawyer, he said that he suspected it was written by ChatGPT (or another LLM/word predictor) service. It had vague language, included unrelated items, and had sections that didn&amp;rsquo;t make any sense. My lawyer called the other party&amp;rsquo;s lawyer, and they said that they had not seen the contract and would never recommend that their client sign the contact their own client had sent over.&lt;/p&gt;
&lt;p&gt;Our lawyer had to rewrite the contact and it ended up costing me a bunch of money that was unnecessary. It was clear to me that the other party saved a bunch of money by using ChatGPT on their side, and it ended up shifting the responsibility (and cost) to us. They also ended up paying their lawyer to review the changes.&lt;/p&gt;
&lt;p&gt;The other example is related to IT software. A few days ago, I was on a support call to discuss an issue with our software. A web page was redirecting to another web page and that page never loaded. It only affected one user and only on one machine. It was very strange. After an hour of troubleshooting, we narrowed it down to a web filter client on the machine and, after disabling it, everything worked fine. The customer went off to investigate and reported that the next day, multiple machines had the same issues across multiple users, machines, and software. It turns out that the web filtering vendor had pushed out an AI update that determines the rules for blocking traffic. It was unrelated to our software and both myself and my customer spent days going back and forth, and spent an hour on the phone, to determine that the statistical model was being used to block traffic in unexpected ways.&lt;/p&gt;
&lt;p&gt;Just because something looks correct doesn&amp;rsquo;t mean it is. Be skeptical and verify. Test. Review.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/twocanoes-horizontal-cmyk.png&#34;&gt;
</description>
      <source:markdown>Let me get this out of the way, first: I use AI but it isn&#39;t called AI. It is called autocomplete. It is called spelling and grammar correction. It is called finding photos by describing them. It is forced on me by algorithms in YouTube and Spotify. 

What I don&#39;t do is allow statistical models to take over my decisions. In the last few months, I have been on the receiving end of the carnage brought about by the rush to allow statistical models to make decisions.

The first example is a contract. I was entering into a large contract for a 3 year plus term and was sent the first draft. I sent it over to a lawyer to review. I had looked over the contract to prepare for our meeting to discuss the contact, and it looked like what a contract should look like, but had some weird clauses in it. When I got a call from the lawyer, he said that he suspected it was written by ChatGPT (or another LLM/word predictor) service. It had vague language, included unrelated items, and had sections that didn&#39;t make any sense. My lawyer called the other party&#39;s lawyer, and they said that they had not seen the contract and would never recommend that their client sign the contact their own client had sent over.

Our lawyer had to rewrite the contact and it ended up costing me a bunch of money that was unnecessary. It was clear to me that the other party saved a bunch of money by using ChatGPT on their side, and it ended up shifting the responsibility (and cost) to us. They also ended up paying their lawyer to review the changes.

The other example is related to IT software. A few days ago, I was on a support call to discuss an issue with our software. A web page was redirecting to another web page and that page never loaded. It only affected one user and only on one machine. It was very strange. After an hour of troubleshooting, we narrowed it down to a web filter client on the machine and, after disabling it, everything worked fine. The customer went off to investigate and reported that the next day, multiple machines had the same issues across multiple users, machines, and software. It turns out that the web filtering vendor had pushed out an AI update that determines the rules for blocking traffic. It was unrelated to our software and both myself and my customer spent days going back and forth, and spent an hour on the phone, to determine that the statistical model was being used to block traffic in unexpected ways.

Just because something looks correct doesn&#39;t mean it is. Be skeptical and verify. Test. Review.

&lt;img src=&#34;uploads/2026/twocanoes-horizontal-cmyk.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Tim Versus the Algorithm</title>
      <link>https://tperfitt.twocanoes.com/2026/01/11/tim-versus-the-algorithm.html</link>
      <pubDate>Sun, 11 Jan 2026 18:19:21 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/11/tim-versus-the-algorithm.html</guid>
      <description>&lt;p&gt;I spent a bunch of time importing music from the Solomon Islands, Vanuatu New Caledonia, and Papua New Guinea. I got far enough into it that I wanted to start listening to the newly ripped music both at home and when I was out and about. I have VLC on my phone that I use to play some music, but that meant I have to import each song to each device. I also want to remove myself from the algorithm-based services.&lt;/p&gt;
&lt;p&gt;It felt like I was going backward, looking at local music storage and manually syncing. The internet I want isn&amp;rsquo;t centralized with a few services controlling what I see and hear. A decentralized internet would give me autonomy and control. So instead of loading up my music on an old MP3 player and yelling at the clouds, I did something better. I installed an open source web streaming service at home with an overlay VPN that gives me access to it on all my devices. No Spotify. No Apple Music. No algorithm deciding what I hear next.&lt;/p&gt;
&lt;p&gt;Here is how it works:&lt;/p&gt;
&lt;p&gt;I installed &lt;a href=&#34;https://jellyfin.org&#34;&gt;Jellyfin media server&lt;/a&gt; on my home debian linux desktop and imported all the music that I have. I installed the iOS app on my phone and pointed it to the media server. All my music was instantly available. It even has an offline mode. But since I have installed &lt;a href=&#34;https://github.com/slackhq/nebula&#34;&gt;Nebula&lt;/a&gt;, I am able to get to any of my devices regardless of what network I am on. Nebula is very sweet. It isn&amp;rsquo;t a VPN that connects networks, but is an overlay network that connects any host you install it on to the same virtual network. There are clients for most platforms (including iOS and Linux) and is open source.&lt;/p&gt;
&lt;p&gt;I am now living in a future where I have a network that has all my devices on it, controllable and accessible by me, without a cloud service pushing their crap to my devices. I am now looking at replacing my home automation, smart speakers, and even my phone so that I actually own my devices and the service they connect to. I am NOT going off the grid, but setting up my own grid in a decentralized way. You know, like the internet we helped build.&lt;/p&gt;
&lt;p&gt;Imagine that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;uploads/2026/fin.png&#34;&gt;&lt;img src=&#34;uploads/2026/music.png&#34;&gt;&lt;img src=&#34;uploads/2026/screenshot-2026-01-11-at-5.15.30pm.png&#34;&gt;&lt;/p&gt;
</description>
      <source:markdown>I spent a bunch of time importing music from the Solomon Islands, Vanuatu New Caledonia, and Papua New Guinea. I got far enough into it that I wanted to start listening to the newly ripped music both at home and when I was out and about. I have VLC on my phone that I use to play some music, but that meant I have to import each song to each device. I also want to remove myself from the algorithm-based services. 

It felt like I was going backward, looking at local music storage and manually syncing. The internet I want isn&#39;t centralized with a few services controlling what I see and hear. A decentralized internet would give me autonomy and control. So instead of loading up my music on an old MP3 player and yelling at the clouds, I did something better. I installed an open source web streaming service at home with an overlay VPN that gives me access to it on all my devices. No Spotify. No Apple Music. No algorithm deciding what I hear next. 

Here is how it works: 

I installed [Jellyfin media server](https://jellyfin.org) on my home debian linux desktop and imported all the music that I have. I installed the iOS app on my phone and pointed it to the media server. All my music was instantly available. It even has an offline mode. But since I have installed [Nebula](https://github.com/slackhq/nebula), I am able to get to any of my devices regardless of what network I am on. Nebula is very sweet. It isn&#39;t a VPN that connects networks, but is an overlay network that connects any host you install it on to the same virtual network. There are clients for most platforms (including iOS and Linux) and is open source.  

I am now living in a future where I have a network that has all my devices on it, controllable and accessible by me, without a cloud service pushing their crap to my devices. I am now looking at replacing my home automation, smart speakers, and even my phone so that I actually own my devices and the service they connect to. I am NOT going off the grid, but setting up my own grid in a decentralized way. You know, like the internet we helped build. 

Imagine that.

&lt;img src=&#34;uploads/2026/fin.png&#34;&gt;&lt;img src=&#34;uploads/2026/music.png&#34;&gt;&lt;img src=&#34;uploads/2026/screenshot-2026-01-11-at-5.15.30pm.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Pass Tap App and Stand</title>
      <link>https://tperfitt.twocanoes.com/2026/01/09/pass-tap-app-and-stand.html</link>
      <pubDate>Fri, 09 Jan 2026 17:00:30 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/09/pass-tap-app-and-stand.html</guid>
      <description>&lt;p&gt;Over the holidays each year, I try and work on a project that is interesting and requires a bunch of uninterrupted time. This year, I decided to investigate a way to solve NFC on iPad. The idea was to simply hand someone an iPad and have them authenticate quickly. I had already written proof of concept app for using AutoFill on iPad, CryptoTokenKit driver for CCID readers for RFID tags, and an app that could send the correct APDU commands. However, I still wasn&amp;rsquo;t happy. The reader is connected via a USB cable with an adapter. I wanted something that showed that you could do a quick handoff of to an NFC enabled iPad.&lt;/p&gt;
&lt;p&gt;I found a CCID (smart card USB) NFC board from ACS and it worked great with my CryptoTokenKit extension. It was small and had a board connector to USB-A. The Apple multimedia connector has USB-C, USB-A and a place to pass power through. I hooked it all up and it worked fine, but it&amp;rsquo;s a mess of cables and connectors. I then designed a case and did a bunch of 3d prints. I ended up with an enclosure that attached to the back of the iPad, was completely self contained, could power the iPad, and you could just tap an RFID card or tag.&lt;/p&gt;
&lt;p&gt;When trying it out, there was something magical about having it all together and to log in to a website or app with a tap. I found myself going back and authenticating again since the process was so smooth.&lt;/p&gt;
&lt;p&gt;I made a video and an article on our site showing the whole process:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twocanoes.com/knowledge-base/pass-tap-for-ipad/&#34;&gt;twocanoes.com/knowledge&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That article has a link to the app and to readers that work. We have a few customers that are excited about it and I just love the feeling of passing them an iPad, having them tap it, and allowing them to get right to work. Works like it should.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/nfc-media-holder-body-complete-2.png&#34;&gt;
</description>
      <source:markdown>Over the holidays each year, I try and work on a project that is interesting and requires a bunch of uninterrupted time. This year, I decided to investigate a way to solve NFC on iPad. The idea was to simply hand someone an iPad and have them authenticate quickly. I had already written proof of concept app for using AutoFill on iPad, CryptoTokenKit driver for CCID readers for RFID tags, and an app that could send the correct APDU commands. However, I still wasn&#39;t happy. The reader is connected via a USB cable with an adapter. I wanted something that showed that you could do a quick handoff of to an NFC enabled iPad.

I found a CCID (smart card USB) NFC board from ACS and it worked great with my CryptoTokenKit extension. It was small and had a board connector to USB-A. The Apple multimedia connector has USB-C, USB-A and a place to pass power through. I hooked it all up and it worked fine, but it&#39;s a mess of cables and connectors. I then designed a case and did a bunch of 3d prints. I ended up with an enclosure that attached to the back of the iPad, was completely self contained, could power the iPad, and you could just tap an RFID card or tag. 

When trying it out, there was something magical about having it all together and to log in to a website or app with a tap. I found myself going back and authenticating again since the process was so smooth.

I made a video and an article on our site showing the whole process: 

[twocanoes.com/knowledge...](https://twocanoes.com/knowledge-base/pass-tap-for-ipad/)

That article has a link to the app and to readers that work. We have a few customers that are excited about it and I just love the feeling of passing them an iPad, having them tap it, and allowing them to get right to work. Works like it should.

&lt;img src=&#34;uploads/2026/nfc-media-holder-body-complete-2.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>DFU Blaster UI and Keyboard Shortcuts</title>
      <link>https://tperfitt.twocanoes.com/2026/01/08/dfu-blaster-ui-and-keyboard.html</link>
      <pubDate>Thu, 08 Jan 2026 17:28:40 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/08/dfu-blaster-ui-and-keyboard.html</guid>
      <description>&lt;p&gt;I am working on an update to DFU Blaster to reorganize the UI a bit to make it a bit more compact (&lt;a href=&#34;https://twocanoes.com/products/mac/dfu-blaster/&#34;&gt;DFU Blaster Pro&lt;/a&gt; is an app from Twocanoes Software to easily put a Mac into restore mode and automate the restore process). SwiftUI makes putting keyboard shortcuts in the menus difficult so I added in the keyboard shortcuts but didn’t have a good way to add them to associated menu item. SwiftUI seems to lean towards menu-less apps (iOS influenced?) and it wasn’t worth it to me force a mac specific feature.&lt;/p&gt;
&lt;p&gt;I took a look with fresh eyes and using SwiftUI @State, I can detect when the command key is down, set a state, and then show the keyboard shortcuts in next to the UI element it triggers. I neat side effect is that all the keyboard shortcuts require the command key, so you are about 1/2 way to typing the shortcut when hitting command.&lt;/p&gt;
&lt;p&gt;As always, the current beta is &lt;a href=&#34;https://bitbucket.org/twocanoes/dfu-blaster-public/downloads/&#34;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;uploads/2026/43ae1f50ce.gif&#34;&gt;
</description>
      <source:markdown>I am working on an update to DFU Blaster to reorganize the UI a bit to make it a bit more compact ([DFU Blaster Pro](https://twocanoes.com/products/mac/dfu-blaster/) is an app from Twocanoes Software to easily put a Mac into restore mode and automate the restore process). SwiftUI makes putting keyboard shortcuts in the menus difficult so I added in the keyboard shortcuts but didn’t have a good way to add them to associated menu item. SwiftUI seems to lean towards menu-less apps (iOS influenced?) and it wasn’t worth it to me force a mac specific feature.

I took a look with fresh eyes and using SwiftUI @State, I can detect when the command key is down, set a state, and then show the keyboard shortcuts in next to the UI element it triggers. I neat side effect is that all the keyboard shortcuts require the command key, so you are about 1/2 way to typing the shortcut when hitting command.

As always, the current beta is [here](https://bitbucket.org/twocanoes/dfu-blaster-public/downloads/)

&lt;img src=&#34;uploads/2026/43ae1f50ce.gif&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Sony Walkman</title>
      <link>https://tperfitt.twocanoes.com/2026/01/03/sony-walkman.html</link>
      <pubDate>Sat, 03 Jan 2026 18:39:59 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/03/sony-walkman.html</guid>
      <description>&lt;p&gt;listening to some sweet 90s music from the solomon islands on my sony walkman.  totally normal thing to do in 2026.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/045fe203c6.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>listening to some sweet 90s music from the solomon islands on my sony walkman.  totally normal thing to do in 2026. 

&lt;img src=&#34;uploads/2026/045fe203c6.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2026/01/02/password-utility-is-one-of.html</link>
      <pubDate>Fri, 02 Jan 2026 16:03:00 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/02/password-utility-is-one-of.html</guid>
      <description>&lt;p&gt;Password Utility is one of those apps that I wrote for myself, but thought it would be useful for others&amp;hellip; A simple keystroke and your login password is copied to the pasteboard. Makes viewing keychain items and approving password prompts SO much easier.&lt;/p&gt;
&lt;img src=&#34;uploads/2026/passutil-hero-7-scaled.png&#34;&gt;
</description>
      <source:markdown>Password Utility is one of those apps that I wrote for myself, but thought it would be useful for others... A simple keystroke and your login password is copied to the pasteboard. Makes viewing keychain items and approving password prompts SO much easier.

&lt;img src=&#34;uploads/2026/passutil-hero-7-scaled.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2026/01/02/new-video-on-the-new.html</link>
      <pubDate>Fri, 02 Jan 2026 15:10:25 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2026/01/02/new-video-on-the-new.html</guid>
      <description>&lt;p&gt;New video on the new RFID reader and app is finished. Getting ready to post!&lt;/p&gt;
&lt;img src=&#34;uploads/2026/tappa.png&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>New video on the new RFID reader and app is finished. Getting ready to post!

&lt;img src=&#34;uploads/2026/tappa.png&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Accelerate Climate Solutions 2025</title>
      <link>https://tperfitt.twocanoes.com/2025/12/31/accelerate-climate-solutions.html</link>
      <pubDate>Wed, 31 Dec 2025 13:51:07 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/12/31/accelerate-climate-solutions.html</guid>
      <description>&lt;p&gt;Amazing work in 2025 by Accelerate Climate Solutions. We share an office with this non-profit organization. (The founder is my wife Cathy Clarkin).&lt;/p&gt;
&lt;p&gt;I was involved in the Solomon Islander intern project where Accelerate Climate Solutions had interns in the US and the Solomon Islands document stories of climate change from elders in the community.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&#34;https://www.accelerateclimatesolutions.org/2025-impact-report&#34;&gt;full report&lt;/a&gt;.&lt;/p&gt;
</description>
      <source:markdown>Amazing work in 2025 by Accelerate Climate Solutions. We share an office with this non-profit organization. (The founder is my wife Cathy Clarkin).

I was involved in the Solomon Islander intern project where Accelerate Climate Solutions had interns in the US and the Solomon Islands document stories of climate change from elders in the community.

Check out the [full report](https://www.accelerateclimatesolutions.org/2025-impact-report).


</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/12/26/d-printing-an-nfc-enabled.html</link>
      <pubDate>Fri, 26 Dec 2025 18:15:17 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/12/26/d-printing-an-nfc-enabled.html</guid>
      <description>&lt;p&gt;3d printing an NFC enabled case for an ipad. because i can.&lt;/p&gt;
&lt;img src=&#34;uploads/2025/60e176a6c9.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>3d printing an NFC enabled case for an ipad. because i can. 

&lt;img src=&#34;uploads/2025/60e176a6c9.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/12/21/hard-to-believe-i-am.html</link>
      <pubDate>Sun, 21 Dec 2025 12:51:32 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/12/21/hard-to-believe-i-am.html</guid>
      <description>&lt;p&gt;Hard to believe I am still riding my bicycle to work on December 19th. The new office is only 1 mile from the house, and most of it is a path through a park, which helps. As long as it is dry and there isn&amp;rsquo;t much ice, I probably will avoid a bad spill.&lt;/p&gt;
&lt;img src=&#34;uploads/2025/94784eb3-5ffa-46ce-9b0d-3e2de4e21d05.jpg&#34; width=&#34;337&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Hard to believe I am still riding my bicycle to work on December 19th. The new office is only 1 mile from the house, and most of it is a path through a park, which helps. As long as it is dry and there isn&#39;t much ice, I probably will avoid a bad spill.

&lt;img src=&#34;uploads/2025/94784eb3-5ffa-46ce-9b0d-3e2de4e21d05.jpg&#34; width=&#34;337&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/12/21/setting-up-the-video-studio.html</link>
      <pubDate>Sun, 21 Dec 2025 12:21:44 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/12/21/setting-up-the-video-studio.html</guid>
      <description>&lt;p&gt;Setting up the video studio in our new office. Lots of ideas for the new year, most of them incredibly nerdy.&lt;/p&gt;
&lt;img src=&#34;uploads/2025/screenflow.gif&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Setting up the video studio in our new office. Lots of ideas for the new year, most of them incredibly nerdy.

&lt;img src=&#34;uploads/2025/screenflow.gif&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/12/08/still-riding-my-bike-to.html</link>
      <pubDate>Mon, 08 Dec 2025 11:23:00 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/12/08/still-riding-my-bike-to.html</guid>
      <description>&lt;p&gt;still riding my bike to work.&lt;/p&gt;
&lt;img src=&#34;uploads/2025/fd15fd990c.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>still riding my bike to work. 

&lt;img src=&#34;uploads/2025/fd15fd990c.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/11/16/a-big-week-coming-up.html</link>
      <pubDate>Sun, 16 Nov 2025 20:09:27 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/11/16/a-big-week-coming-up.html</guid>
      <description>&lt;p&gt;A big week coming up.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We are releasing Password Utility for macOS&lt;/li&gt;
&lt;li&gt;iOS Beta on RFID Authentication for iOS with Autofill&lt;/li&gt;
&lt;li&gt;XCreds 5.7 is feature complete and goes into final QA testing. Added in Authenticated FileVault which will be EPIC.&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;uploads/2025/password-utility-history.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>A big week coming up.

1.  We are releasing Password Utility for macOS
2. iOS Beta on RFID Authentication for iOS with Autofill
3. XCreds 5.7 is feature complete and goes into final QA testing. Added in Authenticated FileVault which will be EPIC.

&lt;img src=&#34;uploads/2025/password-utility-history.jpg&#34; width=&#34;600&#34; height=&#34;337&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tperfitt.twocanoes.com/2025/11/13/083609.html</link>
      <pubDate>Thu, 13 Nov 2025 09:36:09 -0500</pubDate>
      
      <guid>http://tperfitt.micro.blog/2025/11/13/083609.html</guid>
      <description>&lt;p&gt;this cracked me up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://store.steampowered.com/sale/steammachine&#34;&gt;store.steampowered.com/sale/stea&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;uploads/2025/image.png&#34;&gt;
</description>
      <source:markdown>this cracked me up. 

[store.steampowered.com/sale/stea...](https://store.steampowered.com/sale/steammachine)

&lt;img src=&#34;uploads/2025/image.png&#34;&gt;
</source:markdown>
    </item>
    
  </channel>
</rss>
