<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[brentonbaker]]></title><description><![CDATA[brentonbaker]]></description><link>https://brentonbaker.com/</link><image><url>https://brentonbaker.com/favicon.png</url><title>brentonbaker</title><link>https://brentonbaker.com/</link></image><generator>Ghost 5.73</generator><lastBuildDate>Tue, 07 Apr 2026 20:47:31 GMT</lastBuildDate><atom:link href="https://brentonbaker.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Post-Quantum Cryptography]]></title><description><![CDATA[A peek into the future of digital security]]></description><link>https://brentonbaker.com/pqc/</link><guid isPermaLink="false">678ec9b69bab4404ac21ae80</guid><category><![CDATA[Security]]></category><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 22 Jan 2025 21:32:01 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1503024572063-b3c621a2d424?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHBhZGxvY2t8ZW58MHx8fHwxNzM3NDIxNjI2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1503024572063-b3c621a2d424?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHBhZGxvY2t8ZW58MHx8fHwxNzM3NDIxNjI2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Post-Quantum Cryptography"><p></p><p>Developments in quantum computing is driving innovation across a range of industries. However, this advancement also has the<em> </em>potential to break the digital security that currently protects us. Post-quantum cryptography (PQC) is an evolving topic that aims to protect against the quantum threat that lies ahead. </p><h3 id="the-quantum-threat">The quantum threat</h3><p>Let&apos;s back it up. Most of the security on the internet relies on public key cryptography, most notably, RSA and elliptic curve cryptography (ECC). The magic behind their security is based on the difficulty of solving mathematical problems like factoring large numbers or solving discrete logarithms - problems that are computationally infeasible for classical computers.</p><p>Quantum computers leverage quantum bits (qubits) that are more powerful than classical computers at performing certain tasks. It turns out one of their super powers is factorising large numbers and computing discrete logarithms - the very thing keeping us secure today! If you want to read more about this, checkout <a href="https://en.wikipedia.org/wiki/Shor%27s_algorithm?ref=brentonbaker.com" rel="noreferrer">Shor&apos;s algorithm</a>, this algorithm can solve these mathematical problems in moments, whereas classical computers require thousands, if not millions of years to solve.</p><p>While quantum computers are still in their infancy and currently lack the power to break asymmetric encryption, researchers predict that within the next 10-20 years, they may reach the capability to do so. This is known as the <em>quantum threat horizon.</em></p><h3 id="why-should-we-care">Why should we care?</h3><p>Even though quantum computers are not readily available yet, adversaries are already harvesting encrypted data with the intent to decrypt it in the future. This threat is known as HNDL, &quot;Harvest Now, Decrypt Later&quot;. By transitioning to post-quantum cryptography as soon as possible, we can protect sensitive information from being decrypted and exploited in the future.</p><h3 id="how-to-address-the-threat">How to address the threat</h3><p>In August last year, the&#xA0;NIST (National Institute of Standards and Technology)  <a href="https://csrc.nist.gov/news/2024/postquantum-cryptography-fips-approved?ref=brentonbaker.com" rel="noreferrer">announced</a> three new post-quantum cryptographic algorithms as Federal Information Processing Standards (FIPS). These algorithms are designed to resist attacks from quantum computers.</p><ul><li><a href="https://doi.org/10.6028/NIST.FIPS.203?ref=brentonbaker.com" rel="noopener">FIPS 203, Module-Lattice-Based Key-Encapsulation Mechanism Standard (ML-KEM)</a>, a module lattice-based KEM originally submitted under the name CRYSTALS-Kyber</li><li><a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf?ref=brentonbaker.com" rel="noopener">FIPS 204, Module-Lattice-Based Digital Signature Standard (ML-DSA)</a>, a module lattice-based digital signature algorithm initially submitted as CRYSTALS-Dilithium</li><li><a href="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.pdf?ref=brentonbaker.com" rel="noopener">FIPS 205, Stateless Hash-Based Digital Signature Standard (SLH-DSA)</a>, a stateless hash-based signature scheme that began as SPHINCS+</li></ul><h3 id="hands-on-with-post-quantum-cryptography">Hands on with post-quantum cryptography</h3><p>Cloud provider, AWS recently published an article outlining their <a href="https://aws.amazon.com/blogs/security/aws-post-quantum-cryptography-migration-plan/?ref=brentonbaker.com" rel="noreferrer">post-quantum cryptography migration plan</a> which aims to provide a smooth transition for these protections.</p><p>If you&apos;re looking to test drive PQC now, the <a href="https://openquantumsafe.org/?ref=brentonbaker.com" rel="noreferrer">Open Quantum Safe project</a> have a <a href="https://github.com/open-quantum-safe/oqs-demos?ref=brentonbaker.com" rel="noreferrer">GitHub repo</a> for prototyping&#xA0;quantum-resistant cryptography in a range of different applications. </p><p>Let&apos;s build an nginx web server that negotiates quantum-safe keys so we can checkout PQC in action. </p><pre><code class="language-shell">git clone https://github.com/open-quantum-safe/oqs-demos/ .
cd oqs-demos/nginx
docker build -t oqs-nginx .
docker run -p 4433:4433 oqs-nginx</code></pre><p>Browsing to the newly created web server, we can see that Chrome throws an error. That&apos;s because the quantum-safe cipher suites are not yet included in Chrome&apos;s built-in cryptographic library. </p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2025/01/chrome_ssl_error.jpg" class="kg-image" alt="Post-Quantum Cryptography" loading="lazy" width="2000" height="1300" srcset="https://brentonbaker.com/content/images/size/w600/2025/01/chrome_ssl_error.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2025/01/chrome_ssl_error.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2025/01/chrome_ssl_error.jpg 1600w, https://brentonbaker.com/content/images/2025/01/chrome_ssl_error.jpg 2134w" sizes="(min-width: 720px) 720px"></figure><p>Let&apos;s build and run curl using OpenSSL v3 and the OQS provider to ensure we can establish a secure connection to the web server using quantum-safe algorithms. </p><pre><code class="language-bash">docker build -t oqs-curl .</code></pre><p>The docker build should add the OQS provider in the openssl config. Verify the OQS provider is listed by issuing <code>docker run -it openquantumsafe/curl openssl list -providers</code>. The output should resemble the below. </p><pre><code class="language-bash">Providers:
  default
    name: OpenSSL Default Provider
    version: 3.4.0
    status: active
  oqsprovider
    name: OpenSSL OQS Provider
    version: 0.8.0
    status: active
</code></pre><p>Let&apos;s test it out by specifying <em><code>--curves mlkem512</code></em></p><pre><code class="language-bash">docker run -it openquantumsafe/curl curl -k -vv https://192.168.201.79:4433 --curves mlkem512</code></pre><p>Success - albeit a little underwhelming, the output below indicates that the connection between client and server is using quantum-safe algorithms, specifically, <code>mlkem512</code> as the key exchange mechanism and <code>mldsa65</code> for the digital signature.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2025/01/curl_connection.jpg" class="kg-image" alt="Post-Quantum Cryptography" loading="lazy" width="2000" height="1554" srcset="https://brentonbaker.com/content/images/size/w600/2025/01/curl_connection.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2025/01/curl_connection.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2025/01/curl_connection.jpg 1600w, https://brentonbaker.com/content/images/2025/01/curl_connection.jpg 2274w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[The Grinch's Candy Cane Blaster]]></title><description><![CDATA[Unleash the magic of Christmas with a little help from the Grinch]]></description><link>https://brentonbaker.com/grinch-christmas/</link><guid isPermaLink="false">671996cb6ede2403f53874d9</guid><category><![CDATA[Technology]]></category><category><![CDATA[Featured]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 04 Dec 2024 23:24:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/12/GrinchChristmas.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2024/12/GrinchChristmas.jpg" alt="The Grinch&apos;s Candy Cane Blaster"><p>In what&apos;s fast becoming a tradition in my household, I&apos;m excited to reveal the latest creation in our custom Christmas display series. </p><p>Inspired by the mischievous charm of Dr. Seuss&#x2019;s Grinch, this year&apos;s instalment combines the sweetness of a candy cane with the frosty excitement of a snow blizzard - controlled by the <em>green man</em> himself. </p><p>Throw on your Christmas sweater and catch the launch of<em> </em>The Grinch&apos;s Candy Cane Blaster below.</p><figure class="kg-card kg-video-card kg-width-regular" data-kg-thumbnail="https://brentonbaker.com/content/media/2025/02/Grinch_2024_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://brentonbaker.com/content/media/2025/02/Grinch_2024.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" playsinline preload="metadata" style="background: transparent url(&apos;https://brentonbaker.com/content/media/2025/02/Grinch_2024_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">1:17</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            
        </figure><h2 id="the-build">The build </h2><p>I started this project with a few core principles</p><ol><li>all aspects of the display must be fully autonomous</li><li>the display must run entirely from mains power</li><li>the display must have no reliance on network connectivity</li></ol><p>We&apos;ll achieve these objectives by</p><ol><li>providing power supplies for the control boards and components</li><li>inclusion of a meter box to house the electronics</li><li>using a serial interface instead of wireless to communicate with the control boards</li><li>incorporating a large bucket to store the snow juice - enough for a week at a time<br></li></ol><p>The cannon pump and jet fans are horizontally stacked in PVC piping spanning the length of the candy cane. The snow liquid is pumped from the large bucket into a smaller canister closer to the internal pump. Once activated, the pump propels the liquid, mixes it with air, and delivers it to the front of the cannon, where the jet fans thrust it out.</p><p>The cannon moves on a horizontal axis, driven by a high-torque stepper motor connected to a lead screw and mounting assembly. </p><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/pump_mount_assembly.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1842" height="1405" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/pump_mount_assembly.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/pump_mount_assembly.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/pump_mount_assembly.jpg 1600w, https://brentonbaker.com/content/images/2024/11/pump_mount_assembly.jpg 1842w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">cannon pump assembly</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/motor_mounting.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2302" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/motor_mounting.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/motor_mounting.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/motor_mounting.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/motor_mounting.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">2x 120,000 RPM jet fans in the prototype assembly</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/cane_finished.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2667" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/cane_finished.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/cane_finished.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/cane_finished.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/cane_finished.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">cannon prototype</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/press_when_lit.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="928" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/press_when_lit.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/press_when_lit.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/press_when_lit.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/press_when_lit.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">the &apos;go&apos; button with LED lights</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/floor_pump.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2576" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/floor_pump.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/floor_pump.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/floor_pump.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/floor_pump.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">snow liquid floor pump</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/motor_ends.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="1924" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/motor_ends.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/motor_ends.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/motor_ends.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/motor_ends.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">motor housing</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/meterbox.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2114" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/meterbox.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/meterbox.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/meterbox.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/11/meterbox.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">meter box housing the brains</span></figcaption></figure><h2 id="3d-printed-parts">3D printed parts</h2><p>A collection of drawings designed and 3D printed for this project.</p><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/pole_holder.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="1570" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/pole_holder.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/pole_holder.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/pole_holder.jpg 1600w, https://brentonbaker.com/content/images/2024/11/pole_holder.jpg 2310w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">bracket connecting the cannon to the lead screw actuator</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/motor_mount_3D.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1765" height="1498" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/motor_mount_3D.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/motor_mount_3D.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/motor_mount_3D.jpg 1600w, https://brentonbaker.com/content/images/2024/11/motor_mount_3D.jpg 1765w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">half of the motor housing assembly</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/button_surround.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1518" height="1428" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/button_surround.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/button_surround.jpg 1000w, https://brentonbaker.com/content/images/2024/11/button_surround.jpg 1518w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">button casing</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/pump_mount.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1842" height="1405" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/pump_mount.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/pump_mount.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/pump_mount.jpg 1600w, https://brentonbaker.com/content/images/2024/11/pump_mount.jpg 1842w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pump mount</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/cane_end.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1536" height="1243" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/cane_end.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/cane_end.jpg 1000w, https://brentonbaker.com/content/images/2024/11/cane_end.jpg 1536w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">cannon air pipe</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/11/motor_housing.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="1615" height="1309" srcset="https://brentonbaker.com/content/images/size/w600/2024/11/motor_housing.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/11/motor_housing.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/11/motor_housing.jpg 1600w, https://brentonbaker.com/content/images/2024/11/motor_housing.jpg 1615w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">motor housing</span></figcaption></figure><h2 id="snaps">Snaps</h2><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/12/front_house_view.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2667" srcset="https://brentonbaker.com/content/images/size/w600/2024/12/front_house_view.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/12/front_house_view.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/12/front_house_view.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/12/front_house_view.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/12/front_house_night.jpg" class="kg-image" alt="The Grinch&apos;s Candy Cane Blaster" loading="lazy" width="2000" height="2321" srcset="https://brentonbaker.com/content/images/size/w600/2024/12/front_house_night.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/12/front_house_night.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/12/front_house_night.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/12/front_house_night.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://brentonbaker.com/content/media/2024/12/grinch_snow_testing_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://brentonbaker.com/content/media/2024/12/grinch_snow_testing.mp4" poster="https://img.spacergif.org/v1/1080x1920/0a/spacer.png" width="1080" height="1920" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://brentonbaker.com/content/media/2024/12/grinch_snow_testing_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:07</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">snow testing</span></p></figcaption>
        </figure><p></p>]]></content:encoded></item><item><title><![CDATA[The Groomsman Box]]></title><description><![CDATA[A distinguished gift suitable for a secret agent]]></description><link>https://brentonbaker.com/groomsman-box/</link><guid isPermaLink="false">668b616f1b590762a0062f9d</guid><category><![CDATA[Technology]]></category><category><![CDATA[Featured]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Thu, 25 Jul 2024 21:20:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/07/GroomsmanBox_Feature.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2024/07/GroomsmanBox_Feature.jpg" alt="The Groomsman Box"><p>I&apos;m getting married next year, but before I say <em>I do</em>, I need to assemble my groomsmen - <em>cue Anchor Man quotes.</em></p><p>With all the talk of tuxedos, boats and booze, it&apos;s starting to feel like a Bond movie. In keeping with this theme, I want to give my groomsmen a one-of-a-kind gift that delivers maximum impact.</p><p>While making your own whisky and cufflinks is better left to the experts, I focused my efforts on building the main feature: an interactive touchscreen device that presents the groomsmen with their <em>mission</em>. If this doesn&apos;t provide those secret agent feels, nothing else will!</p><h3 id="the-build">The build</h3><p>Housing the brains of the touchscreen is a custom 3D-printed plastic enclosure featuring curved edges, a beveled cutaway for the power cable, a small air vent, and recessed screw holes for seamless assembly.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/07/groomsmanbox-cad.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="1665" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/groomsmanbox-cad.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/groomsmanbox-cad.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/groomsmanbox-cad.jpg 1600w, https://brentonbaker.com/content/images/2024/07/groomsmanbox-cad.jpg 2043w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">3D model of the chassis</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/07/GMB_n1.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="1559" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/GMB_n1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/GMB_n1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/GMB_n1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/07/GMB_n1.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">back view</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/07/GMB_n2.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="1213" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/GMB_n2.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/GMB_n2.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/GMB_n2.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/07/GMB_n2.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">side view</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/07/main_screen_IRL.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="1538" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/main_screen_IRL.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/main_screen_IRL.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/main_screen_IRL.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/07/main_screen_IRL.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">front view</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/07/hand_terminal.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="2667" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/hand_terminal.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/hand_terminal.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/hand_terminal.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/07/hand_terminal.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">user experience</span></figcaption></figure><h3 id="firmware">Firmware</h3><p>The firmware was developed in C for the onboard ESP32 microcontroller, leveraging the <a href="https://github.com/lvgl/lvgl?ref=brentonbaker.com" rel="noreferrer">Light and Versatile Graphics Library</a> for the user interface.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://brentonbaker.com/content/media/2024/07/GroomsmanBox_walkthrough_thumb.jpg" data-kg-custom-thumbnail="https://brentonbaker.com/content/images/2024/07/box_home_screen-2.jpg">
            <div class="kg-video-container">
                <video src="https://brentonbaker.com/content/media/2024/07/GroomsmanBox_walkthrough.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://brentonbaker.com/content/images/2024/07/box_home_screen-2.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:16</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">a simulation with </span><a href="https://en.wikipedia.org/wiki/Easter_egg_(media)?ref=brentonbaker.com" rel="noreferrer"><span style="white-space: pre-wrap;">Easter eggs</span></a><span style="white-space: pre-wrap;"> redacted</span></p></figcaption>
        </figure><h3 id="mission-accomplished">Mission accomplished</h3><p>My take on a groomsman gift, fit for a secret agent, complete with the finest whisky, gold cufflinks, touchscreen (with power adapter), encased in a spot UV branded box.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/07/box_front_view.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="2428" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/box_front_view.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/box_front_view.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/box_front_view.jpg 1600w, https://brentonbaker.com/content/images/2024/07/box_front_view.jpg 2147w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/07/GroomsmanBox-Feature-Image-Final-3.jpg" class="kg-image" alt="The Groomsman Box" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/07/GroomsmanBox-Feature-Image-Final-3.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/07/GroomsmanBox-Feature-Image-Final-3.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/07/GroomsmanBox-Feature-Image-Final-3.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/07/GroomsmanBox-Feature-Image-Final-3.jpg 2400w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Marble Bar Smokehouse]]></title><description><![CDATA[A logo concept for a passion project]]></description><link>https://brentonbaker.com/marblebar/</link><guid isPermaLink="false">662870aa55927d0367bd3556</guid><category><![CDATA[Marketing & Branding]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 24 Apr 2024 02:43:41 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/07/Marble-Bar-Feature-Image.jpg" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/08/MBS_fullsize.png" class="kg-image" alt="Marble Bar Smokehouse" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/08/MBS_fullsize.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/08/MBS_fullsize.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/08/MBS_fullsize.png 1600w, https://brentonbaker.com/content/images/size/w2400/2024/08/MBS_fullsize.png 2400w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Memory Forensics]]></title><description><![CDATA[Uncover insights from a digital crime scene]]></description><link>https://brentonbaker.com/memory-forensics/</link><guid isPermaLink="false">659f9e551bb06a0353229313</guid><category><![CDATA[Technology]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Thu, 18 Apr 2024 01:14:40 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/08/Memory-Forensics-Feature-Image_new.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2024/08/Memory-Forensics-Feature-Image_new.jpg" alt="Memory Forensics"><p>In this blog, we&apos;ll capture and analyse the running state of Windows and Linux servers and demonstrate how to extract artefacts from memory to assist with Incident Response investigations.</p><h3 id="windows-memory-capture">Windows memory capture</h3><p><a href="https://www.exterro.com/ftk-imager?ref=brentonbaker.com" rel="noreferrer">FTK Imager</a> is my go-to tool for capturing memory on Windows hosts. It&apos;s lightweight and can run directly from removable media.</p><p>The process on Windows is straight forward, go to the <em>File</em> menu, select <em>Capture Memory</em>, review the options and click <em>Capture Memory </em>to begin imaging. </p><p>After the capture, generate a hash of the dump to ensure integrity throughout the investigation. If you&apos;re new to DFIR, be sure to understand the <a href="https://en.wikipedia.org/wiki/Chain_of_custody?ref=brentonbaker.com" rel="noreferrer">chain of custody</a>.</p><pre><code class="language-bash">certutil -hashfile bb_mem_win.mem SHA256
</code></pre><p></p><h3 id="linux-memory-capture">Linux memory capture</h3><p>We&apos;ll focus on an EC2 instance running Ubuntu. To do this, we&apos;ll use LiME, (Linux Memory Extractor), an open-source tool for acquiring volatile memory.</p><p>Download the required packages on the target.</p><pre><code class="language-bash">sudo apt install make gcc build-essential python3-pip golang git -y</code></pre><p></p><p>Download and compile LiME.</p><pre><code class="language-bash">git clone https://github.com/504ensicsLabs/LiME
cd LiME/src
make</code></pre><p></p><p>This will produce a file, <em>&apos;lime-&lt;kernel-version&gt;.ko&apos;</em> in the src directory.</p><p>Load the kernel module and specify a path to store the memory dump, for brevity, we&apos;ll save it to disk, but you can send this file directly to your destination host.</p><pre><code class="language-bash">sudo insmod lime-6.5.0-1017-aws.ko &quot;path=/home/ubuntu/bb_mem.dump format=lime&quot;</code></pre><p></p><p>To check the module has been loaded, run &apos;lsmod&apos;.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/04/image.png" class="kg-image" alt="Memory Forensics" loading="lazy" width="954" height="400" srcset="https://brentonbaker.com/content/images/size/w600/2024/04/image.png 600w, https://brentonbaker.com/content/images/2024/04/image.png 954w" sizes="(min-width: 720px) 720px"></figure><p>Generate a hash of the memory dump.</p><pre><code class="language-bash">sha256sum /home/ubuntu/bb_mem.dump</code></pre><p></p><p>Copy the memory dump to your destination host.</p><pre><code class="language-bash">scp -i &lt;your-pem&gt; ubuntu@&lt;host&gt;:/home/ubuntu/bb_mem.dump .</code></pre><p></p><p>Verify the hash on the destination to validate file integrity.</p><pre><code class="language-bash">shasum -a 256 bb_mem.dump</code></pre><p></p><p>Remove the kernel module from the target.</p><pre><code class="language-bash">sudo rmmod lime </code></pre><p></p><h3 id="linux-memory-analysis">Linux memory analysis</h3><p>After obtaining the capture, we&apos;ll use <a href="https://github.com/volatilityfoundation/volatility3?ref=brentonbaker.com" rel="noreferrer">Volatility3</a> to analyse it on another Ubuntu host. Before diving in, let&apos;s review what we need to do: </p><ol><li><strong>Install debug kernel:</strong> This version includes debugging symbols, crucial for memory analysis.</li><li><strong>Run dwarf2json:</strong> This tool converts debugging information from the kernel into a JSON format compatible with Volatility3.</li><li><strong>Load symbol tables into Volatility3:</strong> Provide the JSON symbol tables to enable Volatility3 to interpret kernel structures accurately.</li></ol><p></p><p>Get started by cloning the Volatility3 repo and installing the dependencies.</p><pre><code class="language-bash">git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
pip3 install -r requirements.txt</code></pre><p></p><p>Clone and build dwarf2json.</p><pre><code class="language-bash">git clone https://github.com/volatilityfoundation/dwarf2json.git
cd dwarf2json
go build</code></pre><p></p><p>Add the debug repos and update package lists.</p><pre><code class="language-bash">echo &quot;deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse&quot; | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list

sudo apt install ubuntu-dbgsym-keyring
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622

sudo apt update</code></pre><p></p><p>Install the debug symbols package for our kernel. You can find the kernel version by running <em>&apos;uname -r&apos; </em>or by using the banners plugin, <em>&apos;python3 vol.py -f ../bb_mem.dump banners&apos;.</em> In our case, it&apos;s 6.5.0-1017-aws.</p><pre><code class="language-bash">sudo apt install linux-image-6.5.0-1017-aws-dbgsym -y</code></pre><p></p><p>Extract debugging information from the kernel image and convert it into a Volatilty3 Intermediate Symbol File (ISF) JSON file.</p><pre><code class="language-bash">cd /home/ubuntu/dwarf2json
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-6.5.0-1017-aws &gt; linux-image-6.5.0-1017-aws.json</code></pre><p></p><p>Copy the JSON file to the Volatility3 symbols folder.</p><pre><code class="language-bash">cp /home/ubuntu/dwarf2json/linux-image-6.5.0-1017-aws.json /home/ubuntu/volatility3/volatility3/symbols</code></pre><p></p><p>List the available plugins for Linux.</p><pre><code class="language-bash">python3 vol.py --help | grep -i linux. | head -n 5


banners.Banners     Attempts to identify potential linux banners in an
linux.bash.Bash     Recovers bash command history from memory.
linux.capabilities.Capabilities
linux.check_afinfo.Check_afinfo
linux.check_creds.Check_creds
linux.check_idt.Check_idt
linux.check_modules.Check_modules
linux.check_syscall.Check_syscall
linux.elfs.Elfs     Lists all memory mapped ELF files for all processes.
linux.envars.Envars
linux.iomem.IOMem   Generates an output similar to /proc/iomem on a
linux.keyboard_notifiers.Keyboard_notifiers
linux.kmsg.Kmsg     Kernel log buffer reader
linux.library_list.LibraryList
linux.lsmod.Lsmod   Lists loaded kernel modules.
linux.lsof.Lsof     Lists all memory maps for all processes.
linux.malfind.Malfind
linux.mountinfo.MountInfo
linux.proc.Maps     Lists all memory maps for all processes.
linux.psaux.PsAux   Lists processes with their command line arguments
linux.pslist.PsList
linux.psscan.PsScan
linux.pstree.PsTree
linux.sockstat.Sockstat
linux.tty_check.tty_check
linux.vmayarascan.VmaYaraScan
</code></pre><p></p><p>Let&apos;s review the capture and find some interesting artefacts.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/04/image-7.png" class="kg-image" alt="Memory Forensics" loading="lazy" width="1622" height="1250" srcset="https://brentonbaker.com/content/images/size/w600/2024/04/image-7.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/04/image-7.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/04/image-7.png 1600w, https://brentonbaker.com/content/images/2024/04/image-7.png 1622w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">ELF binaries in the memory dump</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/04/image-8.png" class="kg-image" alt="Memory Forensics" loading="lazy" width="1920" height="1110" srcset="https://brentonbaker.com/content/images/size/w600/2024/04/image-8.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/04/image-8.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/04/image-8.png 1600w, https://brentonbaker.com/content/images/2024/04/image-8.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Bash plugin showing a sample &apos;malicious&apos; binary downloaded and executed on the host</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2024/04/image-9.png" class="kg-image" alt="Memory Forensics" loading="lazy" width="2000" height="602" srcset="https://brentonbaker.com/content/images/size/w600/2024/04/image-9.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/04/image-9.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/04/image-9.png 1600w, https://brentonbaker.com/content/images/2024/04/image-9.png 2325w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Network sockets and processes</span></figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Broome Real Estate]]></title><description><![CDATA[Launching the rebrand of 'First National Broome' to 'Broome Real Estate' with a refreshed corporate identity and website]]></description><link>https://brentonbaker.com/broome-real-estate/</link><guid isPermaLink="false">65e6983655927d0367bd3183</guid><category><![CDATA[Marketing & Branding]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Sat, 09 Mar 2024 04:06:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/03/BRE_icon-1.jpg" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/BRE_website.png" class="kg-image" alt="Broome Real Estate" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/BRE_website.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/BRE_website.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/BRE_website.png 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/BRE_website.png 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/BRE_logo.jpg" class="kg-image" alt="Broome Real Estate" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/BRE_logo.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/BRE_logo.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/BRE_logo.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/BRE_logo.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/BRE_demo_listing-1.png" class="kg-image" alt="Broome Real Estate" loading="lazy" width="2000" height="1636" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/BRE_demo_listing-1.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/BRE_demo_listing-1.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/BRE_demo_listing-1.png 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/BRE_demo_listing-1.png 2400w" sizes="(min-width: 720px) 720px"></figure><div class="kg-card kg-button-card kg-align-center"><a href="https://broomere.au/?ref=brentonbaker.com" class="kg-btn kg-btn-accent">Visit site</a></div>]]></content:encoded></item><item><title><![CDATA[Casa Coasters]]></title><description><![CDATA[Levelled up the home restaurant game with these boujee drink coasters]]></description><link>https://brentonbaker.com/casa-coasters/</link><guid isPermaLink="false">65e518f11bb06a03532295ad</guid><category><![CDATA[Marketing & Branding]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Sun, 03 Mar 2024 23:00:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/03/coaster_2.jpg" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/casa_coasters_front.jpg" class="kg-image" alt="Casa Coasters" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/casa_coasters_front.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/casa_coasters_front.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/casa_coasters_front.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/casa_coasters_front.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/casa_coasters_back.jpg" class="kg-image" alt="Casa Coasters" loading="lazy" width="2000" height="1446" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/casa_coasters_back.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/casa_coasters_back.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/casa_coasters_back.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/casa_coasters_back.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/03/coaster_1-1.jpg" class="kg-image" alt="Casa Coasters" loading="lazy" width="2000" height="1426" srcset="https://brentonbaker.com/content/images/size/w600/2024/03/coaster_1-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2024/03/coaster_1-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2024/03/coaster_1-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2024/03/coaster_1-1.jpg 2400w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Reverse Engineering the Dyson Air Purifier]]></title><description><![CDATA[Extract real-time AQ data from your Dyson air purifier]]></description><link>https://brentonbaker.com/dyson/</link><guid isPermaLink="false">65a5e4b01bb06a03532293df</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 17 Jan 2024 01:50:56 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/08/BB-Dyson-Feature_new.png" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2024/08/BB-Dyson-Feature_new.png" alt="Reverse Engineering the Dyson Air Purifier"><p>In this blog, we&apos;ll walk through how to reverse engineer and extract sensor data from the Dyson air purifier and send it to my <a href="https://brentonbaker.com/monitoring-alerting/" rel="noreferrer">monitoring stack</a> to visualise real-time temperature and air quality.</p><h2 id="getting-started">Getting started</h2><p>If you&apos;ve read some of my other blogs, you&apos;ll know that MQTT is a commonly used protocol for IoT communications. This device has WiFi connectivity and a mobile-app for controlling its functions, so I expect we&apos;ll see MQTT in play here.</p><p>To confirm, we&apos;ll need to inspect the network traffic from a smart-phone running the Dyson app. Let&apos;s start a packet capture on the iPhone.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/01/packet_capture.png" class="kg-image" alt="Reverse Engineering the Dyson Air Purifier" loading="lazy" width="978" height="136" srcset="https://brentonbaker.com/content/images/size/w600/2024/01/packet_capture.png 600w, https://brentonbaker.com/content/images/2024/01/packet_capture.png 978w" sizes="(min-width: 720px) 720px"></figure><p>When opening the Dyson app, we see an MQTT packet with a &apos;connect command&apos;. That&apos;s a good sign, and it&apos;s a packet containing the username and password required to subscribe and publish to MQTT topics. Let&apos;s make a secure copy of these credentials for use in later steps.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/01/mqtt_credential_capture.png" class="kg-image" alt="Reverse Engineering the Dyson Air Purifier" loading="lazy" width="2000" height="334" srcset="https://brentonbaker.com/content/images/size/w600/2024/01/mqtt_credential_capture.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/01/mqtt_credential_capture.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/01/mqtt_credential_capture.png 1600w, https://brentonbaker.com/content/images/2024/01/mqtt_credential_capture.png 2148w" sizes="(min-width: 720px) 720px"></figure><p>After turning the device on/off and adjusting the fan speed, we start to see the MQTT packets and structure. The topic for issuing commands appears to be &apos;438/YN2-AU-KJA1987A/command&apos;, where &apos;YN2-AU-KJA1987A&apos; is the serial number. Looking at some other packets, we can also determine that real-time data is published to the topic &apos;438/YN2-AU-KJA1987A/status/current&apos; every few seconds when the app is open.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/01/mqtt_request_data.png" class="kg-image" alt="Reverse Engineering the Dyson Air Purifier" loading="lazy" width="2000" height="654" srcset="https://brentonbaker.com/content/images/size/w600/2024/01/mqtt_request_data.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/01/mqtt_request_data.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/01/mqtt_request_data.png 1600w, https://brentonbaker.com/content/images/size/w2400/2024/01/mqtt_request_data.png 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="proof-of-concept">Proof of concept</h2><p>Now we have the credentials, the topic and the syntax for a few message payloads, let&apos;s create a script to request the current metrics from the device.</p><pre><code class="language-python">import paho.mqtt.client as mqtt
from datetime import datetime
import time
import configparser

config = configparser.ConfigParser()
config.read(&apos;config.ini&apos;)

USERNAME = config[&apos;MQTT&apos;][&apos;USERNAME&apos;]
PASSWORD = config[&apos;MQTT&apos;][&apos;PASSWORD&apos;]

HOST = &apos;&lt;device-IP&gt;&apos;
PORT = 1883
TOPIC = &apos;438/&apos; + USERNAME + &apos;/command&apos;


PAYLOAD_TEMPLATE = &apos;{&quot;mode-reason&quot;: &quot;LAPP&quot;,&quot;time&quot;: &quot;%s&quot;,&quot;msg&quot;: &quot;REQUEST-PRODUCT-ENVIRONMENT-CURRENT-SENSOR-DATA&quot;}&apos;

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print(&quot;Connected to MQTT broker&quot;)
    else:
        print(&quot;Connection failed. Return code =&quot;, rc)

def on_publish(client, userdata, mid):
    print(&quot;Message Published&quot;)

if __name__ == &apos;__main__&apos;:
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_publish = on_publish

    client.username_pw_set(USERNAME, PASSWORD)
    client.connect(HOST, port=PORT, keepalive=60)

    client.loop_start()  

    while not client.is_connected():
        time.sleep(1)


    current_time = datetime.utcnow().strftime(&apos;%Y-%m-%dT%H:%M:%SZ&apos;)
    PAYLOAD = PAYLOAD_TEMPLATE % current_time

    print(&quot;Publishing message to topic:&quot;, TOPIC)
    result = client.publish(TOPIC, PAYLOAD)

    if result.rc == mqtt.MQTT_ERR_SUCCESS:
        print(&quot;Message sent successfully&quot;)
    else:
        print(&quot;Failed to send message. Return code =&quot;, result.rc)

    client.loop_stop() 
    client.disconnect()
</code></pre><p>By creating another small script that subscribes to the topic &apos;<strong>438/YN2-AU-KJA1987A/status/current</strong>&apos;, we can see the request has been successful and we&apos;re presented with a JSON array of the current AQ data.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/01/subscriber.png" class="kg-image" alt="Reverse Engineering the Dyson Air Purifier" loading="lazy" width="1755" height="129" srcset="https://brentonbaker.com/content/images/size/w600/2024/01/subscriber.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/01/subscriber.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/01/subscriber.png 1600w, https://brentonbaker.com/content/images/2024/01/subscriber.png 1755w" sizes="(min-width: 720px) 720px"></figure><h2 id="making-the-data-useful">Making the data useful </h2><p>To use this data, we need to get it into Prometheus. Let&apos;s break down what needs to happen:</p><ol><li><strong>connect</strong> to the MQTT broker</li><li><strong>subscribe</strong> to the &apos;438/YN2-AU-KJA1987A/status/current&apos; topic</li><li><strong>send</strong> a request to obtain the current sensor metrics</li><li><strong>parse</strong> the MQTT JSON response and transmit the values to my Prometheus push gateway</li><li><strong>rinse and repeat </strong>every 30 seconds</li></ol><p>Here&apos;s what that looks like in code... </p><pre><code class="language-python">#!/usr/bin/env python3

import paho.mqtt.client as mqtt
import json
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
from datetime import datetime
import time
import configparser
import ssl
import socket
import schedule
import syslog

config = configparser.ConfigParser()
config.read(&apos;config.ini&apos;)

USERNAME = config[&apos;MQTT&apos;][&apos;USERNAME&apos;]
PASSWORD = config[&apos;MQTT&apos;][&apos;PASSWORD&apos;]
MQTT_HOST = &apos;192.168.201.52&apos;
MQTT_PORT = 1883
PUSH_GATEWAY_ADDRESS = &apos;https://monitoring.brentonbaker.com:9091&apos;
PUSH_GATEWAY_JOB = &apos;dyson_aq_living_room&apos;

TOPIC_REQUEST = &apos;438/&apos; + USERNAME + &apos;/command&apos;
TOPIC_RESPONSE = &apos;438/&apos; + USERNAME + &apos;/status/current&apos;

PAYLOAD_TEMPLATE = &apos;{&quot;mode-reason&quot;: &quot;LAPP&quot;,&quot;time&quot;: &quot;%s&quot;,&quot;msg&quot;: &quot;REQUEST-PRODUCT-ENVIRONMENT-CURRENT-SENSOR-DATA&quot;}&apos;


registry = CollectorRegistry()
temperature_metric = Gauge(&apos;dyson_livingroom_environment_temperature&apos;, &apos;Environment Temperature (Celsius)&apos;,
                           registry=registry)
humidity_metric = Gauge(&apos;dyson_livingroom_environment_humidity&apos;, &apos;Environment Humidity (%)&apos;, registry=registry)
pm25_metric = Gauge(&apos;dyson_livingroom_environment_pm25&apos;, &apos;Particulate Matter PM2.5&apos;, registry=registry)
pm10_metric = Gauge(&apos;dyson_livingroom_environment_pm10&apos;, &apos;Particulate Matter PM10&apos;, registry=registry)

client = mqtt.Client(protocol=mqtt.MQTTv311)


syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0)

def log_message(message, level=syslog.LOG_INFO):
    syslog.syslog(level, message)

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        log_message(&quot;Connected to MQTT broker&quot;)
        client.subscribe(TOPIC_RESPONSE)

def on_message(client, userdata, msg):
    try:
        payload = msg.payload.decode(&apos;utf-8&apos;)
        process_mqtt_response(payload)
    except Exception as e:
        log_message(f&quot;Error processing MQTT message: {e}&quot;, level=syslog.LOG_ERR)

def process_mqtt_response(payload):
    try:
        response_data = json.loads(payload)
        if &apos;data&apos; in response_data and &apos;tact&apos; in response_data[&apos;data&apos;] and &apos;hact&apos; in response_data[&apos;data&apos;] \
                and &apos;pm25&apos; in response_data[&apos;data&apos;] and &apos;pm10&apos; in response_data[&apos;data&apos;]:
            temperature = int(response_data[&apos;data&apos;][&apos;tact&apos;]) / 10.0 - 273  # Formula to convert to Celsius
            humidity = int(response_data[&apos;data&apos;][&apos;hact&apos;])
            pm25 = int(response_data[&apos;data&apos;][&apos;pm25&apos;])
            pm10 = int(response_data[&apos;data&apos;][&apos;pm10&apos;])


            temperature_metric.set(temperature)
            humidity_metric.set(humidity)
            pm25_metric.set(pm25)
            pm10_metric.set(pm10)

 
            log_message(f&quot;Metrics: Temperature={temperature}, Humidity={humidity}, PM2.5={pm25}, PM10={pm10}&quot;)

   
            push_to_gateway(PUSH_GATEWAY_ADDRESS, job=PUSH_GATEWAY_JOB, registry=registry)
        else:
            log_message(&quot;Received unexpected MQTT message format. Ignoring.&quot;, level=syslog.LOG_WARNING)
    except Exception as e:
        log_message(f&quot;Error processing MQTT response: {e}&quot;, level=syslog.LOG_ERR)

def job():
    current_time = datetime.utcnow().strftime(&apos;%Y-%m-%dT%H:%M:%SZ&apos;)
    PAYLOAD = PAYLOAD_TEMPLATE % current_time

    log_message(f&quot;Publishing message to topic: {TOPIC_REQUEST}&quot;)
    result = client.publish(TOPIC_REQUEST, PAYLOAD)

    if result.rc == mqtt.MQTT_ERR_SUCCESS:
        log_message(&quot;Message sent successfully&quot;)
    else:
        log_message(f&quot;Failed to send message. Return code = {result.rc}&quot;, level=syslog.LOG_ERR)

if __name__ == &apos;__main__&apos;:
    client.on_connect = on_connect
    client.on_message = on_message

    client.username_pw_set(USERNAME, PASSWORD)

    socket.setdefaulttimeout(30)

    try:
        client.connect(MQTT_HOST, port=MQTT_PORT, keepalive=60)
    except socket.timeout:
        log_message(&quot;Connection timed out.&quot;, level=syslog.LOG_ERR)
        exit(1)

    client.loop_start()

    while not client.is_connected():
        time.sleep(1)

    schedule.every(5).seconds.do(job)

    try:
        while True:
            schedule.run_pending()
            time.sleep(1)
    except KeyboardInterrupt:
        pass
    except Exception as e:
        log_message(f&quot;Unexpected error: {e}&quot;, level=syslog.LOG_ERR)
        exit(1)

    client.loop_stop()
    client.disconnect()
</code></pre><p></p><h2 id="visualising-the-data">Visualising the data</h2><p>Adding to our existing AQ dashboard, we are now tracking the temperature and humidity from the Dyson.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2024/01/new_AQ_dashboard.png" class="kg-image" alt="Reverse Engineering the Dyson Air Purifier" loading="lazy" width="2000" height="1102" srcset="https://brentonbaker.com/content/images/size/w600/2024/01/new_AQ_dashboard.png 600w, https://brentonbaker.com/content/images/size/w1000/2024/01/new_AQ_dashboard.png 1000w, https://brentonbaker.com/content/images/size/w1600/2024/01/new_AQ_dashboard.png 1600w, https://brentonbaker.com/content/images/size/w2400/2024/01/new_AQ_dashboard.png 2400w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[A Tribute to Clark Griswold]]></title><description><![CDATA[Strap in for the most elaborate Christmas display, perhaps ever]]></description><link>https://brentonbaker.com/clarkgriswold/</link><guid isPermaLink="false">6545d442eb41b7032a23c98f</guid><category><![CDATA[Technology]]></category><category><![CDATA[Featured]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 06 Dec 2023 00:16:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/12/BB-Christmas-2023-Feature-Image.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2023/12/BB-Christmas-2023-Feature-Image.jpg" alt="A Tribute to Clark Griswold"><p>At this time of year, I hit replay on The National Lampoon&apos;s Christmas Vacation and I&apos;m fascinated by the sheer effort one man will invest to ensure Christmas is unforgettable. Well, here&apos;s my tribute to you, Clark Griswold. Strap in for the most elaborate Christmas display, perhaps ever!</p><p>This is by far the biggest robotic challenge I&apos;ve undertaken. Last year I made my  debut with a rudimentary lolly rocket. It was a hit, but it was missing a storyline and a reason for a lolly rocket to be hanging out in my front garden. This year, I gave myself a little more time to craft a story and build a bunch of high-octane IoT toys and let them rip at Christmas.</p><h3 id="lets-set-the-scene">Let&apos;s set the scene</h3><p>At the front of the house is an illuminated red button. When pushed, Santa calls out to have a toy car moved from the garage to the sleigh. </p><p>A stogie-smoking elf drives out and crashes into a stocking. On impact, lollies are shot from a cannon above and into the hands of some lucky visitors.</p><p>Simple right?... well, kinda. Checkout the video below for the end result. If you have an appetite for more, read on...</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/IEdZ3oj07Lg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="A tribute to Clark Griswold"></iframe></figure><h3 id="self-driving-car">Self driving car</h3><p>The hero of the show will be the toy car. I settled on a bright red Audi R8 Spyder. </p><p>Off the shelf, these cars are pretty simple, there&apos;s a motor connected to a physical switch that changes the polarity, and a switch for the accelerator pedal.</p><p>For our display to work, we need complete autonomous driving. To achieve this, all existing electronic parts were stripped and custom components were programmed and fitted. In the true spirit of automation, we also need the car to reset its position and reverse back into the garage. To achieve this, we&apos;ll use a <a href="https://www.cytron.io/c-motor-driver/p-3amp-4v-16v-dc-motor-driver-2-channels?ref=brentonbaker.com" rel="noreferrer">3A DC motor driver</a> to control the polarity. </p><p>The software running in the car connects wirelessly to an <a href="https://mqtt.org/?ref=brentonbaker.com" rel="noreferrer">MQTT</a> broker and waits for the signal. When triggered, the car driving functions activate. To make it more realistic, we&apos;ll also add smoke for the car exhaust and turn on the car&apos;s lights when driving. </p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/car_programming-1.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1942" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/car_programming-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/car_programming-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/car_programming-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/car_programming-1.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2023/11/picoW-1.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="2157" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/picoW-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/picoW-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/picoW-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/picoW-1.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">one of many microcontrollers used in this project</span></figcaption></figure><h3 id="the-track">The track</h3><p>Every race car needs a track. To add some festive cheer, I used <a href="https://www.amazon.com.au/BTF-LIGHTING-WS2812B-Individual-Addressable-Waterproof/dp/B01CDTEHRC?th=1&amp;ref=brentonbaker.com" rel="noreferrer">WS2812B</a> addressable LEDs to light up the path the car drives on.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/DSC00104-1.JPG" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1333" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/DSC00104-1.JPG 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/DSC00104-1.JPG 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/DSC00104-1.JPG 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/DSC00104-1.JPG 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="lolly-cannon">Lolly cannon	</h3><p>Learning from last year&apos;s build, I came back bigger and better, with a revised version. This model has a linear design and is equipped with pressure piping to launch the lollies higher and faster. To add character, it was embossed with branding, painted, and mounted in a custom hardwood stand. </p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/rocket_before_paint.jpg" width="2000" height="2667" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/rocket_before_paint.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/rocket_before_paint.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/rocket_before_paint.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/rocket_before_paint.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/rocket_painted.jpg" width="2000" height="2667" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/rocket_painted.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/rocket_painted.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/rocket_painted.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/rocket_painted.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/rocket_stand_BB.jpg" width="2000" height="2667" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/rocket_stand_BB.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/rocket_stand_BB.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/rocket_stand_BB.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/rocket_stand_BB.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/rocket-stand-1.jpg" width="2000" height="3063" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/rocket-stand-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/rocket-stand-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/rocket-stand-1.jpg 1600w, https://brentonbaker.com/content/images/2023/11/rocket-stand-1.jpg 2321w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>I promised an auto-refill system this year; a deceptively simple task that was easier said than done, primarily because the lollies are not identical in size, resulting in inconsistent extractions from the hopper. In most cases the lollies would jam and drop different quantities, or none at all. </p><p>After making several failed prototypes for extraction mechanisms, I found success building a linear hopper with a <a href="https://en.wikipedia.org/wiki/Stepper_motor?ref=brentonbaker.com" rel="noreferrer">stepper motor</a> that moves an internal plate in equal increments to push the lollies vertically into the cannon.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/failed_lollie_mech_1.jpg" width="2000" height="1709" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/failed_lollie_mech_1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/failed_lollie_mech_1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/failed_lollie_mech_1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/failed_lollie_mech_1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/failed_lollie_mech_printing.jpg" width="2000" height="1933" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/failed_lollie_mech_printing.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/failed_lollie_mech_printing.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/failed_lollie_mech_printing.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/failed_lollie_mech_printing.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/11/lolly_mechanism_failed-1.jpg" width="2000" height="2667" loading="lazy" alt="A Tribute to Clark Griswold" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/lolly_mechanism_failed-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/lolly_mechanism_failed-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/lolly_mechanism_failed-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/lolly_mechanism_failed-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption><p><span style="white-space: pre-wrap;">various attempts at lolly extraction mechanisms</span></p></figcaption></figure><p>Each time the stepper motor moves, the position is stored on the micro-controller, meaning the device can accomodate nightly shutdowns and remember it&apos;s position on initialisation. When the hopper is empty, the software sends the internal plate to the bottom of the hopper and triggers a push notification via the <a href="https://core.telegram.org/bots?ref=brentonbaker.com" rel="noreferrer">Telegram API</a> to request a refill.</p><figure class="kg-card kg-video-card kg-width-regular" data-kg-thumbnail="https://brentonbaker.com/content/media/2023/11/BB_lolly_autoloader_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://brentonbaker.com/content/media/2023/11/BB_lolly_autoloader.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" playsinline preload="metadata" style="background: transparent url(&apos;https://brentonbaker.com/content/media/2023/11/BB_lolly_autoloader_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:04</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            
        </figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/BB_telegram_message.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1492" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/BB_telegram_message.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/BB_telegram_message.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/BB_telegram_message.jpg 1600w, https://brentonbaker.com/content/images/2023/11/BB_telegram_message.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2023/11/lolly_rocket_v2-1.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="2667" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/lolly_rocket_v2-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/lolly_rocket_v2-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/lolly_rocket_v2-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/lolly_rocket_v2-1.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">the cannon and auto-refill assembly</span></figcaption></figure><h3 id="giant-red-button">Giant red button</h3><p>At the front of the house sits a giant red sign with a note to &apos;press when lit&apos;. When the button is pressed, the magic unfolds.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/button.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1255" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/button.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/button.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/button.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/button.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="soundtrack">Soundtrack</h3><p>The scene is supported by an audio soundtrack. The dialogue between Santa and the elf is split between the left and right channels, making for a more realistic experience. </p><div class="kg-card kg-audio-card"><img src="https://brentonbaker.com/content/media/2023/12/baker_christmas_1_thumb.jpg" alt="A Tribute to Clark Griswold" class="kg-audio-thumbnail"><div class="kg-audio-thumbnail placeholder kg-audio-hide"><svg width="24" height="24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://brentonbaker.com/content/media/2023/12/baker_christmas_1.wav" preload="metadata"></audio><div class="kg-audio-title">soundtrack</div><div class="kg-audio-player"><button class="kg-audio-play-icon" aria-label="Play audio"><svg viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide" aria-label="Pause audio"><svg viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">40.803039</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button><button class="kg-audio-unmute-icon" aria-label="Unmute"><svg viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide" aria-label="Mute"><svg viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><h3 id="neon-sign">Neon sign</h3><p>To drive home the point of being inside Santa&apos;s workshop, I had a <em>workshop</em> neon sign manufactured from <a href="https://sculptneonsigns.com.au/?ref=brentonbaker.com" rel="noreferrer">Sculpt Neon Signs</a>. </p><h3 id="mobile-app">Mobile app</h3><p>Are IoT toys truely complete without a mobile app? Adding to the laundry list of things to build was a web-based mobile app that can control each element in the display. This came in useful when testing individual components. </p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/BB_iphoneApp_23.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1492" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/BB_iphoneApp_23.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/BB_iphoneApp_23.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/BB_iphoneApp_23.jpg 1600w, https://brentonbaker.com/content/images/2023/11/BB_iphoneApp_23.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><h3 id="garage">Garage</h3><p>The garage was constructed from pallet wood to house the car and smoke machine.  </p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/car_and_garage_begin-1.jpg" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="2667" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/car_and_garage_begin-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/car_and_garage_begin-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/car_and_garage_begin-1.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/car_and_garage_begin-1.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/garage_1.JPG" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1333" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/garage_1.JPG 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/garage_1.JPG 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/garage_1.JPG 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/garage_1.JPG 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="3d-printing">3D printing</h3><p>A collection of CAD drawings designed and printed for this project.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/lollymount_2023.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1225" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/lollymount_2023.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/lollymount_2023.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/lollymount_2023.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/lollymount_2023.png 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/motor_mount_2023.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1238" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/motor_mount_2023.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/motor_mount_2023.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/motor_mount_2023.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/motor_mount_2023.png 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/actuator_plate_2023.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1254" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/actuator_plate_2023.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/actuator_plate_2023.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/actuator_plate_2023.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/actuator_plate_2023.png 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/post_ends_2023.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1207" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/post_ends_2023.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/post_ends_2023.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/post_ends_2023.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/post_ends_2023.png 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/endcap_2023.png" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1243" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/endcap_2023.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/endcap_2023.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/endcap_2023.png 1600w, https://brentonbaker.com/content/images/size/w2400/2023/11/endcap_2023.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="snaps">Snaps</h3><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/House.JPG" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1333" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/House.JPG 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/House.JPG 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/House.JPG 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/House.JPG 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/cannon_1.JPG" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1333" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/cannon_1.JPG 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/cannon_1.JPG 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/cannon_1.JPG 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/cannon_1.JPG 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/12/car_out.JPG" class="kg-image" alt="A Tribute to Clark Griswold" loading="lazy" width="2000" height="1333" srcset="https://brentonbaker.com/content/images/size/w600/2023/12/car_out.JPG 600w, https://brentonbaker.com/content/images/size/w1000/2023/12/car_out.JPG 1000w, https://brentonbaker.com/content/images/size/w1600/2023/12/car_out.JPG 1600w, https://brentonbaker.com/content/images/size/w2400/2023/12/car_out.JPG 2400w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[callhawk]]></title><description><![CDATA[On-demand access to Microsoft Teams call records]]></description><link>https://brentonbaker.com/callhawk/</link><guid isPermaLink="false">655ea484eded4db1e525e673</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Wed, 08 Nov 2023 01:06:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2024/08/callHawkFeature.png" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2024/08/callHawkFeature.png" alt="callhawk"><p>In response to a need, I developed a light-weight web app that provides on-demand access to call records for users of Microsoft Teams with direct routing. The tool, now affectionally named, callhawk, serves as a suitable alternative to granting people-managers direct access to the Teams admin portal, which can introduce privacy and other security concerns. </p><p>callhawk has been packaged for easy deployment with Docker and is available for download on <a href="https://github.com/brentonbaker/callHawk?ref=brentonbaker.com" rel="noreferrer">GitHub</a>. </p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/11/callHawk-1.jpg" class="kg-image" alt="callhawk" loading="lazy" width="2000" height="1699" srcset="https://brentonbaker.com/content/images/size/w600/2023/11/callHawk-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/11/callHawk-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/11/callHawk-1.jpg 1600w, https://brentonbaker.com/content/images/2023/11/callHawk-1.jpg 2071w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Metrics, Monitoring & Alerting]]></title><description><![CDATA[Peter Drucker summed it up many years ago, 'You can’t manage what you don’t measure'.

Discover how I capture metrics to monitor and alert on everything that's important to me]]></description><link>https://brentonbaker.com/monitoring-alerting/</link><guid isPermaLink="false">6525e84fa11a40241ddede17</guid><category><![CDATA[Technology]]></category><category><![CDATA[Security]]></category><category><![CDATA[Featured]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Sat, 23 Sep 2023 01:29:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/10/dashboard-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2023/10/dashboard-1.jpg" alt="Metrics, Monitoring &amp; Alerting"><p>Like most things I work on, I find it useful to know the <em>current state</em><strong> </strong>and<strong> </strong>the<strong> </strong><em>expected state</em>. Understanding these states allows you to determine if you&apos;re on track, or perhaps, how far <em>off-track</em> you are.</p><p>As it relates to technology and especially for IoT devices, the ability to monitor, analyse, and react to changes in a system&apos;s state is critical to effective operations.</p><p>In this blog I&apos;ll touch on a few systems I monitor in the context of my home environment and provide some insights to help get you started monitoring the stuff that <em>you</em> care about. </p><h3 id="what-i-monitor">What I monitor</h3><ol><li>home network </li><li>Tesla charging </li><li>air quality </li><li>brentonbaker.com / cloud infrastructure </li><li>a few other services (<a href="https://brentonbaker.com/the-vault/" rel="noreferrer">Vault</a>, security systems etc)</li></ol><h3 id="the-monitoring-stack">The monitoring stack</h3><p>The stack consists of Prometheus and Grafana. Prometheus is an open-source monitoring and alerting toolkit designed to collect, store, query, and alert on <a href="https://en.wikipedia.org/wiki/Time_series?ref=brentonbaker.com" rel="noreferrer">time-series data</a>. Prometheus is part of a broader ecosystem that includes several components that provide comprehensive monitoring and alerting capabilities:</p><ol><li><strong>Prometheus Server</strong>: The heart of the system. The Prometheus server scrapes, stores, and queries time-series data, providing real-time insights.</li><li><strong>Prometheus Alertmanager</strong>: The Alertmanager component handles alerting. It allows you to define and manage alerts based on metric thresholds, predefined conditions, or complex queries. It can group, deduplicate, and route alerts for rapid resolution.</li><li><strong>Prometheus Push Gateway</strong>: Sometimes, systems generate metrics that don&apos;t naturally fit the pull-based model used by Prometheus. The Push Gateway is an optional component that enables pushing metrics from short-lived jobs and batch processes, filling the gap in the Prometheus ecosystem. You&apos;ll see an example of this with my Tesla &amp; AQ monitoring.</li><li><strong>PromQL</strong>: Prometheus Query Language (PromQL) is a specialised query language for time-series data. It allows you to perform complex queries and mathematical operations on your metrics.</li><li><strong>Grafana</strong>: To visualise and explore metrics, you can pair Prometheus with Grafana. Grafana allows you to create visualisations and dashboards that make it easy to understand your data. You&apos;ll see some examples coming up...</li></ol><h3 id="defining-the-metrics-that-matter">Defining the metrics that matter</h3><p>Now we understand the tools, systems/services we want to monitor. Next is to define the <em>metrics that matter</em>. Be intentional about what you&apos;re collecting and how you will use these metrics to inform decisions or trigger actions. </p><p>I want to satisfy the following objectives</p><ol><li>identify when there are sustained periods of high upload and/or download on my home WAN connection</li><li>monitor resource constraints on my cloud infrastructure</li><li>determine if my website is down/unavailable for more than 5 minutes</li><li>track the cost per charge when I charge my Tesla at home</li><li>track the lifetime cost of  Telsa charging at home</li><li>identify when my Tesla has finished charging at home</li><li>identify how many new visitors access my website within a 24 hour period</li><li>be notified when someone accesses <a href="https://brentonbaker.com/the-vault/" rel="noreferrer">the Vault</a></li><li>be notified when <a href="https://brentonbaker.com/the-vault/" rel="noreferrer">the Vault</a> disconnects from power</li><li>monitor the air quality in my home office and graph the last 24 hours</li></ol><p></p><h3 id="get-building">Get building</h3><p>To achieve <strong>objective 1,</strong> we can use the <a href="https://github.com/prometheus/snmp_exporter?ref=brentonbaker.com" rel="noreferrer">Prometheus SNMP Exporter</a> (note: SNMPv3 supports encryption). The SNMP Exporter reads a config file <strong>snmp.yml</strong> that contains the <a href="https://en.wikipedia.org/wiki/Object_identifier?ref=brentonbaker.com" rel="noreferrer">OIDs</a> to walk.</p><p>To achieve <strong>objective 2</strong>, we can use the <a href="https://github.com/prometheus/node_exporter?ref=brentonbaker.com" rel="noreferrer">Prometheus Node Exporter</a>. </p><p>To achieve <strong>objective 3 &amp; 9</strong>, we can use the <a href="https://github.com/prometheus/blackbox_exporter?ref=brentonbaker.com" rel="noreferrer">Prometheus Blackbox Exporter</a>.</p><p>For <strong>most other objectives</strong>, we need to build our own tooling to extract the metrics and expose them via a HTTP endpoint for Prometheus to scrape. I&apos;ve provided two different examples below of how to achieve this.</p><h3 id></h3><h3 id="tesla-charging-metrics">Tesla charging metrics</h3><p>The Tesla home charger exposes metrics via an API at <strong><code>http://charger-IP/api/1/vitals</code></strong> &amp; <strong><code>http://charger-IP/api/1/lifetime</code> </strong>however, Prometheus can&apos;t scrape from these endpoints directly. Below is my Python script that queries the Tesla API and pushes the metrics to Prometheus PushGateway every 10 seconds. </p><pre><code class="language-python">#!/usr/bin/env python3

import requests
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


endpoint_url = &apos;http://&lt;brenton-home-charger-IP&gt;:8018/api/1/vitals&apos;

pushgateway_url = &apos;https://monitoring.brentonbaker.com:9091&apos;


registry = CollectorRegistry()


response = requests.get(endpoint_url)

if response.status_code == 200:
    # Extract metrics from the JSON response
    data = response.json()
    for key, value in data.items():
        metric_name = key.replace(&apos;-&apos;, &apos;_&apos;) + &apos;_metric&apos;
        metric_description = key.replace(&apos;_&apos;, &apos; &apos;).title()

        # Check if the value is numeric
        if isinstance(value, (int, float)):
            metric = Gauge(metric_name, metric_description, registry=registry)
            metric.set(float(value))

   
    push_to_gateway(pushgateway_url, job=&apos;brenton_tesla_model3&apos;, registry=registry)
    print(&apos;Metrics pushed to Prometheus Pushgateway successfully.&apos;)
else:
    print(&apos;Error:&apos;, response.text)</code></pre><p></p><h3 id="air-quality-metrics">Air Quality metrics</h3><p>Since my AQ sensor has a PHP library for extracting data from the serial interface, I decided to continue using PHP. The PHP script below updates values of the AQ metrics through POST requests made by another service (extract shown in the second script below) and provides the metrics in a format that Prometheus can scrape.</p><pre><code class="language-python">&lt;?php

// File path to store the values
$dataFile = __DIR__ . &apos;/data.json&apos;;

// Load existing values from file if available
if (file_exists($dataFile)) {
    $data = json_decode(file_get_contents($dataFile), true);
    $v1 = $data[&apos;v1&apos;];
    $v2 = $data[&apos;v2&apos;];
} else {
    $v1 = 0;
    $v2 = 0;
}

if ($_SERVER[&apos;REQUEST_METHOD&apos;] === &apos;POST&apos;) {
    // Handle POST request to update v1 and v2 values
    if (isset($_POST[&apos;v1&apos;]) &amp;&amp; isset($_POST[&apos;v2&apos;])) {
        $v1 = $_POST[&apos;v1&apos;];
        $v2 = $_POST[&apos;v2&apos;];

        // Save the updated values to file
        $data = [&apos;v1&apos; =&gt; $v1, &apos;v2&apos; =&gt; $v2];
        file_put_contents($dataFile, json_encode($data));
    }
}

// Generate the metrics
$metrics = &quot;# HELP v1_description small air particles\n&quot;;
$metrics .= &quot;# TYPE v1_small_particles gauge\n&quot;;
$metrics .= &quot;v1_small_particles $v1\n&quot;;
$metrics .= &quot;# HELP v2_description large air particles\n&quot;;
$metrics .= &quot;# TYPE v2_large_particles gauge\n&quot;;
$metrics .= &quot;v2_large_particles $v2\n&quot;;


echo $metrics;</code></pre><p></p><pre><code class="language-python">function upload($v1, $v2)
	{
		$this-&gt;log(&quot;sending $v1 and $v2 data&quot;);

		$url = &apos;http://&lt;ip&gt;:8016/metrics&apos;; 
		$data = [
			&apos;v1&apos; =&gt; $v1,
			&apos;v2&apos; =&gt; $v2
		];
	

		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
		curl_exec($ch);
		curl_close($ch);


		$this-&gt;listen();
	

	}</code></pre><p></p><p></p><h3 id="alerting">Alerting</h3><p><strong>Prometheus AlertManager </strong>can be configured to accomodate alerting based on defined conditions. Below is a rule that sends an email when my Tesla has finished charging.</p><pre><code class="language-json">- name: brenton_tesla_charging
  rules:
  - alert: EVSEStateChanged
    expr: evse_state_metric{job=&quot;brenton_tesla_model3&quot;} == 4
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: &quot;Charging for Brenton&apos;s Tesla is complete&quot;
      description: &quot;Charging for Brenton&apos;s Tesla is complete&quot;
</code></pre><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/alert_BB_tesla.jpg" class="kg-image" alt="Metrics, Monitoring &amp; Alerting" loading="lazy" width="2000" height="1492" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/alert_BB_tesla.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/alert_BB_tesla.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/alert_BB_tesla.jpg 1600w, https://brentonbaker.com/content/images/2023/10/alert_BB_tesla.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x2757;</div><div class="kg-callout-text">To receive emails, you&apos;ll need to add SMTP configuration in alertmanager.yml - sample below for SendGrid</div></div><pre><code class="language-`">receivers:
- name: email
  email_configs:
  - send_resolved: false
    to: &lt;your-email-address&gt;
    from: &lt;your-service-email-address&gt;
    hello: localhost
    smarthost: smtp.sendgrid.net:587
    auth_username: apikey
    auth_password: &lt;secret&gt;
    headers:
      From: &lt;your-service-email-address&gt;
      Subject: &apos;{{ template &quot;email.default.subject&quot; . }}&apos;
      To: &lt;your-email-address&gt;
    html: &apos;{{ template &quot;email.default.html&quot; . }}&apos;
    require_tls: true
templates: []</code></pre><p></p><h3 id="display-the-data">Display the data</h3><p>Now the monitoring stack is configured, the data can be queried to build and display real-time dashboards using PromQL in Grafana.<br></p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/BB_network_1-2.jpg" class="kg-image" alt="Metrics, Monitoring &amp; Alerting" loading="lazy" width="2000" height="1063" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/BB_network_1-2.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/BB_network_1-2.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/BB_network_1-2.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/10/BB_network_1-2.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/BB_aq_tesla_1-2.jpg" class="kg-image" alt="Metrics, Monitoring &amp; Alerting" loading="lazy" width="2000" height="1064" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/BB_aq_tesla_1-2.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/BB_aq_tesla_1-2.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/BB_aq_tesla_1-2.jpg 1600w, https://brentonbaker.com/content/images/size/w2400/2023/10/BB_aq_tesla_1-2.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><p></p>]]></content:encoded></item><item><title><![CDATA[The Vault]]></title><description><![CDATA[People stash a menagerie of valuable stuff in vaults with an expectation of protection, but have you considered how secure your vault actually is?]]></description><link>https://brentonbaker.com/the-vault/</link><guid isPermaLink="false">652329b4dd04ba93a07f71ce</guid><category><![CDATA[Technology]]></category><category><![CDATA[Security]]></category><category><![CDATA[Featured]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Mon, 03 Jul 2023 23:17:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/10/BB_vault_orange_back.jpg" medium="image"/><content:encoded><![CDATA[<h3 id="the-problem">The problem</h3><img src="https://brentonbaker.com/content/images/2023/10/BB_vault_orange_back.jpg" alt="The Vault"><p>Most vaults require a PIN or a physical key to unlock. Both options are considerably weak for securing anything of value. If you&#x2019;ve watched the <em>Ocean&#x2019;s trilogy</em> or <em>Mission Impossible</em>, you&#x2019;ll know that physical keys can be duplicated, locks can be picked and PINs can be brute-forced.</p><p>Let&#x2019;s build a vault with Multi-Factor Authentication (MFA) and access mechanisms that can&#x2019;t be forged or cloned.</p><h3 id="unlocking-the-solution">Unlocking the solution</h3><p>Having worked in tech most of my life, the solution was abundantly clear. This was a problem well suited for <a href="https://en.wikipedia.org/wiki/Cryptography?ref=brentonbaker.com">cryptography</a> to solve, and more specifically, digital certificates.&#xA0;Cryptography is one of those things in life that takes a while to master, but once you uncover&#xA0;its power, you want to use it everywhere. This is one of those places.</p><p>Over the years, I&#x2019;ve made a bunch of stuff work with digital certificates, but never anything that controlled things in the physical world. I just had to switch the <em>digital</em>&#xA0;output to a <em>physical</em> output, connect a solenoid to control a locking mechanism and we should have a fairly robust prototype vault. </p><h5 id="wait-what-are-digital-certificates-and-solenoids"><strong>Wait... what are digital certificates and solenoids?</strong></h5><p>A digital certificate is an electronic document that contains information about the identity of a person, organisation, or device. It acts as a form of digital identification, just like a passport or driver&#x2019;s license. Certificates are used to verify the authenticity of digital transactions and to protect sensitive information such as passwords and credit card numbers.</p><p>Although certificates (and <a href="https://en.wikipedia.org/wiki/Public-key_cryptography?ref=brentonbaker.com">Public Key Cryptography</a>) provide a secure and centrally managed means of authentication, they are susceptible to attacks on the private keys. If a private key is compromised, an attacker can impersonate the owner of the key, which can result in a security breach, or in our case, unauthorised access to the Vault, and we don&#x2019;t want that! To mitigate this risk, we&#x2019;ll use smartcards (I&#x2019;m a big fan of <a href="https://www.yubico.com/?ref=brentonbaker.com">Yubikeys</a>) in conjunction with certificate authentication.</p><p>By combining certificate authentication with smartcards, the private key is protected against theft or duplication. <em>Note: keys must be generated directly on the smartcard to take advantage of this.&#xA0;</em></p><p>Lastly, a solenoid is an electromechanical device that converts electrical energy into mechanical energy. It consists of a coil of wire that is wound around a ferromagnetic core. When an electric current is passed through the coil, it creates a magnetic field that pulls a plunger inside the solenoid. This will be used as part of our locking mechanism.</p><h3 id="lets-get-building">Let&apos;s get building</h3><p>For the prototype, I settled on an <a href="https://www.officeworks.com.au/shop/officeworks/p/suresafe-emporia-laptop-anti-theft-digital-safe-sanntbsf?ref=brentonbaker.com">in-expensive vault from Officeworks</a>. After dismantling the original PIN pad and faceplate, I was left with an empty shell I could use to retrofit my own parts.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/original_vault.png" width="1437" height="867" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/original_vault.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/original_vault.png 1000w, https://brentonbaker.com/content/images/2023/10/original_vault.png 1437w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/old_pin_pad-1536x967.jpg" width="1536" height="967" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/old_pin_pad-1536x967.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/old_pin_pad-1536x967.jpg 1000w, https://brentonbaker.com/content/images/2023/10/old_pin_pad-1536x967.jpg 1536w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h3 id="the-software">The software</h3><p>The Vault was written in Python and runs as a systemd service. At a high-level, the Vault performs the following functions to make an access determination.</p><ul><li><strong>accept</strong>&#xA0;a 6-digit PIN from the keypad (we&#x2019;ll need this later for cryptographic operations)</li><li><strong>generate</strong>&#xA0;a temporary challenge file with 32 bytes of random data</li><li><strong>calculate</strong> the hash of the challenge file and temporarily store the result</li><li><strong>extract</strong>&#xA0;and temporarily&#xA0;<strong>store</strong>&#xA0;the certificate from slot 9a (PIV Authentication) on the smartcard</li><li><strong>sign</strong>&#xA0;the challenge hash from step 3 using the private key on the smartcard. This is where the PIN from step 1 is passed in to complete the&#xA0;PKCS#15 operation. The resulting&#xA0;<strong>signature</strong>&#xA0;is temporarily&#xA0;<strong>stored</strong></li></ul><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">&#x2757;</div><div class="kg-callout-text">If the smartcard cannot sign the file due to an incorrect PIN, the Vault will deny access and decrement the PIN retry counter on the smartcard to prevent brute-force attacks. By default, you can enter a PIN incorrectly three times before the smartcard is locked</div></div><ul><li><strong>verify</strong> the extracted certificate from step 4 against the root certificate stored on the microprocessor</li><li><strong>extract</strong> the public key from the certificate and temporarily store</li><li><strong>Re-calculate</strong> the hash of the original challenge file from step 2. Verify the digital signature created in step 6 using the public key. </li></ul><pre><code class="language-bash">openssl dgst -sha256 -verify {public_key} -signature {signature} {challenge_file}</code></pre><p></p><ul><li><strong>extract</strong> the subject distinguished name from the certificate so we know who&#x2019;s gaining access.</li><li><strong>verify</strong> the subject distinguished name and card serial number against a whitelist. If both are valid, activate the solenoid to open the Vault door</li><li><strong>release</strong> the solenoid after three seconds to lock the Vault door</li><li><strong>purge</strong> all temporary files</li></ul><p></p><h3 id="what-about-certificate-revocation">What about certificate revocation?</h3><p>First, let&#x2019;s define what revocation is. Revocation is the process of invalidating previously issued digital certificates before their scheduled expiration date.</p><p>This is useful for situations where certificates become compromised, stolen, or used fraudulently. As I mentioned earlier, the risk of private keys being compromised is mitigated as keys are generated directly on the smartcard. However, we need to account for situations where the physical smartcards may be lost or stolen.</p><p>To address these issues, some <a href="https://en.wikipedia.org/wiki/Certificate_authority?ref=brentonbaker.com">Certificate Authorities (CAs)</a> revoke the digital certificate and add the certificate to a publicly accessible Certificate Revocation List (CRL) or use the Online Certificate Status Protocol (OCSP) to inform people that the certificate is no longer valid. This would be suitable for devices with internet access, but our Vault still needs to operate without internet or network connectivity. In addition, my private intermediate CA is configured for passive revocation, whereby there is no CRL per se. Instead, certificates are designed to have a much shorter life (usually no more than 24 hours) and are issued more frequently.&#xA0;</p><p>This is not ideal for our use case; I don&#x2019;t want to be minting new certificates every 24 hours. To solve this problem, I&#x2019;ve issued longer term certificates and added verification logic to check the card serial number and subject name on the certificate against an array of accepted entities, effectively creating a user/card whitelist. If a card is lost or stolen, the serial number and certificate will be removed from the whitelist.</p><h3 id="bringing-it-all-together">Bringing it all together</h3><p>With a donor vault body and working software and hardware, it&#x2019;s now time to create a plastic faceplate that will house our new PIN pad and NFC smartcard reader.</p><p>Using CAD and the power of 3D printing, I created a custom faceplate and mounted it to the Vault.</p><p>We&#x2019;ll also use a handy <a href="https://github.com/sendgrid/sendgrid-python?ref=brentonbaker.com">SendGrid Python library</a> to enable email notifications when the Vault grants or denies access.&#xA0;</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/vault_faceplate.png" width="1648" height="1060" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/vault_faceplate.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/vault_faceplate.png 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/vault_faceplate.png 1600w, https://brentonbaker.com/content/images/2023/10/vault_faceplate.png 1648w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/bb_3dPrinter.png" width="1125" height="1186" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/bb_3dPrinter.png 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/bb_3dPrinter.png 1000w, https://brentonbaker.com/content/images/2023/10/bb_3dPrinter.png 1125w" sizes="(min-width: 720px) 720px"></div></div></div></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/notifications-1-1.jpg" class="kg-image" alt="The Vault" loading="lazy" width="1910" height="857" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/notifications-1-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/notifications-1-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/notifications-1-1.jpg 1600w, https://brentonbaker.com/content/images/2023/10/notifications-1-1.jpg 1910w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/vault_side_left-1536x2048.jpg" width="1536" height="2048" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/vault_side_left-1536x2048.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/vault_side_left-1536x2048.jpg 1000w, https://brentonbaker.com/content/images/2023/10/vault_side_left-1536x2048.jpg 1536w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/vault_side-1536x2048.jpg" width="1536" height="2048" loading="lazy" alt="The Vault" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/vault_side-1536x2048.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/vault_side-1536x2048.jpg 1000w, https://brentonbaker.com/content/images/2023/10/vault_side-1536x2048.jpg 1536w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h3 id="powering-up">Powering up</h3><p>Check out the video below to see the Vault in action.&#xA0;</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/iQTZ4DK6C04?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="The Vault"></iframe></figure>]]></content:encoded></item><item><title><![CDATA[Upgrading FortiClient VPN Without Breaking The Bank]]></title><description><![CDATA[Upgrade your fleet of Fortinet VPN clients without spending a dime]]></description><link>https://brentonbaker.com/upgrading-forticlient-vpn/</link><guid isPermaLink="false">65232ff7dd04ba93a07f7240</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Mon, 08 May 2023 00:42:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/10/VPN-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2023/10/VPN-1.png" alt="Upgrading FortiClient VPN Without Breaking The Bank"><p>Security vulnerabilities are inevitable and as time rolls on, we&#x2019;ve built ways to prioritise and automate remediation. A common approach to resolving security&#xA0;vulnerabilities&#xA0;is to release a new version of an application that addresses the weakness.&#xA0;</p><p>In most cases, software vendors do a reasonable job at making this process as painless as possible. However, I recently stumbled across the need to update the FortiClient VPN and this was far from intuitive.&#xA0;</p><p>It turns out, Fortinet don&#x2019;t natively support automatic updates of FortiClient unless you pay for their premium product<strong> -</strong> that&#x2019;s not great for customers that don&#x2019;t need any of the extra bells and whistles.&#xA0; </p><p>Below is how I automated the deployment of the updated FortiClient using Microsoft Intune.</p><p></p><h3 id="initial-setup">Initial setup</h3><p><br><strong>Grab the latest installer </strong><br>Browse to <a href="https://www.fortinet.com/support/product-downloads?ref=brentonbaker.com#vpn">https://www.fortinet.com/support/product-downloads</a>, and download <em>VPN for Windows</em>.</p><p><strong>Extract the MSI</strong><br>Running <em>FortiClientVPNOnlineInstaller</em><strong> </strong>from the previous step&#xA0;will present you with a popup showing the download progress.&#xA0;Once the download is finished, the installer will launch. Leave this open in the background.</p><p>With the installer open, navigate to: <code>%ProgramData%\Applications\Cache\{look-for-the-latest-UID-here}\&lt;version&gt;</code></p><p>Make a copy of the MSI (FortiClientVPN.msi) as it will be removed when the online installer is closed.</p><p><strong>Export working config</strong><br>On a machine with the VPN already configured, export the configuration to an XML file.</p><pre><code class="language-xml">C:\Program Files\Fortinet\FortiClient\FCConfig -m vpn -f staff-vpn.xml -o export -p &lt;enter-password-here&gt;</code></pre><p></p><p><strong>Create installer </strong><br>Create a batch file called <strong>fortiVPN-install.cmd</strong></p><pre><code class="language-bash">@echo off

set PASSWORD=&lt;enter-password-here&gt;
msiexec.exe /i FortiClientVPN.msi /norestart /qn LicenseAccepted_XP=1 FEATURE_SEL_SECFABRIC=0 FEATURE_SEL_SECACCESS=1 FEATURE_SEL_ADVPROTECT=0 FEATURE_SEL_ADDITIONALS=0 FEATURE_SEL_AV=0 FEATURE_SEL_WF=0 FEATURE_SEL_SSO=0 FEATURE_SEL_FW=0 INSTALLLEVEL=3

&quot;C:\Program Files\Fortinet\FortiClient\FCConfig&quot; -m vpn -f staff-vpn.xml -o import -p %PASSWORD%</code></pre><p></p><p><strong>Bundle the artefacts</strong><br>Create a new directory and place the following items inside:<br>&#x2013; staff-vpn.xml (the VPN config)<br>&#x2013; FortiClientVPN.msi (the new VPN client binary)<br>&#x2013; fortiVPN-install.cmd (the installer script)</p><h3 id="build-and-deploy-the-app">Build and deploy the app</h3><p><strong>Create a custom intunewin file</strong><br>Using the <a href="https://github.com/Microsoft/Microsoft-Win32-Content-Prep-Tool?ref=brentonbaker.com"><em>Microsoft Win32 Content Prep Tool</em></a><strong>,</strong> build the custom intunewin file. Once finished, the tool will output <em>fortiVPN-install.intunewin</em></p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/index.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="902" height="502" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/index.png 600w, https://brentonbaker.com/content/images/2023/10/index.png 902w" sizes="(min-width: 720px) 720px"></figure><p><strong>Create a new intune app</strong><br><em>Browse</em> to https://endpoint.microsoft.com&#xA0;Click <em>Apps</em>&#xA0;&gt; <em>Windows</em>&#xA0;&gt; <em>Add</em>&#xA0;&gt; select the app type as <em>Windows app (Win32).&#xA0;Select</em> the intunewin file created in the previous step and click <em>OK</em></p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/apppack.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="540" height="286"></figure><p>Complete the mandatory fields in the <em>Add App</em>&#xA0;options and click <em>Next.</em></p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/add_app.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="902" height="648" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/add_app.png 600w, https://brentonbaker.com/content/images/2023/10/add_app.png 902w" sizes="(min-width: 720px) 720px"></figure><p>In the <em>Install command,</em>&#xA0;enter&#xA0;fortiVPN-install.cmd&#xA0;</p><p>In the&#xA0;<em>Uninstall command</em>, enter `<em>msiexec /x FortiClientVPN.msi /qn /norestart</em>&#xA0;and click <em>Next</em>.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/commands_1.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="760" height="115" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/commands_1.png 600w, https://brentonbaker.com/content/images/2023/10/commands_1.png 760w" sizes="(min-width: 720px) 720px"></figure><p><strong>Complete</strong> the two mandatory fields in the <strong>Requirements</strong>&#xA0;options and click <strong>Next</strong>.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/commands_2.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="902" height="412" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/commands_2.png 600w, https://brentonbaker.com/content/images/2023/10/commands_2.png 902w" sizes="(min-width: 720px) 720px"></figure><p>Select <em>Manually configure detection rules</em>, complete the fields as per below (note, you&#x2019;ll need to enter the version number you&#x2019;re deploying in the <em>Value</em> field). Click <em>OK</em>&#xA0;and <em>Next</em>.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/addapp_2.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="902" height="288" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/addapp_2.png 600w, https://brentonbaker.com/content/images/2023/10/addapp_2.png 902w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/detection_rule.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="580" height="440"></figure><p><em>Assign</em> the app to a <em>device group</em> and click <em>Next</em>.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/assign.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="902" height="106" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/assign.png 600w, https://brentonbaker.com/content/images/2023/10/assign.png 902w" sizes="(min-width: 720px) 720px"></figure><p>Review the options on the <em>Review + create</em>&#xA0;screen and click <em>Create</em>.</p><figure class="kg-card kg-image-card"><img src="https://brentonbaker.com/content/images/2023/10/create.png" class="kg-image" alt="Upgrading FortiClient VPN Without Breaking The Bank" loading="lazy" width="901" height="1092" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/create.png 600w, https://brentonbaker.com/content/images/2023/10/create.png 901w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Christmas Rocket]]></title><description><![CDATA[Grab your eggnog, slip into something comfy and join me as we build and launch the first ever Baker Christmas Rocket]]></description><link>https://brentonbaker.com/christmas-rocket/</link><guid isPermaLink="false">65232e32dd04ba93a07f7219</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Sun, 11 Dec 2022 13:00:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/10/IMG_4027-scaled.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2023/10/IMG_4027-scaled.jpg" alt="Christmas Rocket"><p>It&#x2019;s the most wonderful time of the year, but it&#x2019;s also the most competitive time of year with neighbours striving for first place in our neighbourhood Christmas lights competition.&#xA0;</p><p>To keep my winning streak, I need to deliver a display that&#x2019;s unique, interactive and guaranteed to please. Combining the nostalgic feelings of free-flowing candy at Christmas and my new found rocket obsession, a Christmas rocket that blasts out candy was sure to be the golden ticket I need to take out the win.</p><p>So grab your eggnog, slip into something comfy and join me as we build and launch the first ever Baker Christmas Rocket.</p><h3 id="the-design">The design </h3><p>With just two weeks until Christmas, we need to design, build, test and deploy the rocket - fast! The rocket is going to form part of my exterior display, so it needs to be durable, water resistant and look the part.</p><p><strong>Features</strong></p><ol><li>illuminated button </li><li>mission-control touchscreen</li><li>mobile app</li><li>automated air refuelling</li><li>boost</li></ol><p>I have zero experience building rockets, but I have built a spud gun or two, and that&#x2019;s perfect for the job. The spud guns crafted in my younger years were manually operated, meaning you need to manually pump air into the chamber and release a manual trigger to fire. That&#x2019;s ok for backyard shenanigans, but we need to level up, after all, Christmas is serious business.&#xA0;</p><p>The key to our technical design will be to take all elements that require manual intervention and replace them with automation. We&apos;ll swap out the manual air pump for an <em>automatic pump</em> and replace the manual release trigger with an <em>electronic solenoid</em> that will release air from the chamber and shoot out the lollies in the barrel.&#xA0; We&#x2019;ll control all these elements with a microprocessor and custom software. We&#x2019;ll also build a mobile app so the rocket can be launched by a smartphone from anywhere.</p><p>Due to time constraints, I can&#x2019;t build an automatic candy refill system, so we&#x2019;ll need to recruit an elf to keep our candy chamber filled this year.</p><h3 id="the-build-and-installation">The build and installation</h3><h3 id></h3><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/IMG_4027-scaled-1.jpg" width="2000" height="2467" loading="lazy" alt="Christmas Rocket" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/IMG_4027-scaled-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/IMG_4027-scaled-1.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/IMG_4027-scaled-1.jpg 1600w, https://brentonbaker.com/content/images/2023/10/IMG_4027-scaled-1.jpg 2075w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/IMG_4080-scaled.jpg" width="1920" height="2560" loading="lazy" alt="Christmas Rocket" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/IMG_4080-scaled.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/IMG_4080-scaled.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/IMG_4080-scaled.jpg 1600w, https://brentonbaker.com/content/images/2023/10/IMG_4080-scaled.jpg 1920w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/iOS_BCR.jpg" width="1125" height="1034" loading="lazy" alt="Christmas Rocket" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/iOS_BCR.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/iOS_BCR.jpg 1000w, https://brentonbaker.com/content/images/2023/10/iOS_BCR.jpg 1125w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/IMG_4105-2-scaled.jpg" width="1920" height="2560" loading="lazy" alt="Christmas Rocket" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/IMG_4105-2-scaled.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/IMG_4105-2-scaled.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/IMG_4105-2-scaled.jpg 1600w, https://brentonbaker.com/content/images/2023/10/IMG_4105-2-scaled.jpg 1920w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h3 id="the-launch">The launch</h3><p>Enjoy the videos below of preflight testing and the main launch event, complete with fireworks!<br></p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/kaB3DcUCWAc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Christmas Rocket Testing"></iframe></figure><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/TIJFQ1mliOA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Christmast Rocket Launch"></iframe></figure>]]></content:encoded></item><item><title><![CDATA[La Marzocco GS3 Remodel]]></title><description><![CDATA[The good folks at Specht Design have done it again]]></description><link>https://brentonbaker.com/gs3/</link><guid isPermaLink="false">6522464ddd04ba93a07f7110</guid><category><![CDATA[Coffee]]></category><dc:creator><![CDATA[Brenton Baker]]></dc:creator><pubDate>Fri, 22 Apr 2022 07:04:00 GMT</pubDate><media:content url="https://brentonbaker.com/content/images/2023/10/bb_gs3-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://brentonbaker.com/content/images/2023/10/bb_gs3-1.jpg" alt="La Marzocco GS3 Remodel"><p>The La Marzocco GS3 MP is a handmade, dual-boiler coffee machine packed with great features. The most notable is the adjustable paddle on top of the brew head. The paddle controls the flow rate through the coffee grounds during extraction, allowing full control over every shot.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://brentonbaker.com/content/images/2023/10/gs3_mp_1-group_angle-scaled-1-2048x1363.jpg" class="kg-image" alt="La Marzocco GS3 Remodel" loading="lazy" width="2000" height="1331" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/gs3_mp_1-group_angle-scaled-1-2048x1363.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/gs3_mp_1-group_angle-scaled-1-2048x1363.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/gs3_mp_1-group_angle-scaled-1-2048x1363.jpg 1600w, https://brentonbaker.com/content/images/2023/10/gs3_mp_1-group_angle-scaled-1-2048x1363.jpg 2048w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">GS3 MP before remodel</span></figcaption></figure><p>Sophistication aside, this baby isn&#x2019;t scoring any points for its looks. Luckily, La Marzocco have made these machines with customisation in mind.</p><p>The good folks at <a href="https://spechtdesign.com.au/?ref=brentonbaker.com">Specht Design</a> completed a custom re-model for me just in time for Easter. With brass fittings and walnut panels that match my kitchen, it produces espresso just as good as it looks.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/CM_3-1.jpg" width="1440" height="1794" loading="lazy" alt="La Marzocco GS3 Remodel" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/CM_3-1.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/CM_3-1.jpg 1000w, https://brentonbaker.com/content/images/2023/10/CM_3-1.jpg 1440w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/CM_1-scaled.jpg" width="1894" height="2560" loading="lazy" alt="La Marzocco GS3 Remodel" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/CM_1-scaled.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/CM_1-scaled.jpg 1000w, https://brentonbaker.com/content/images/size/w1600/2023/10/CM_1-scaled.jpg 1600w, https://brentonbaker.com/content/images/2023/10/CM_1-scaled.jpg 1894w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://brentonbaker.com/content/images/2023/10/bb_gs3.jpg" width="1440" height="1709" loading="lazy" alt="La Marzocco GS3 Remodel" srcset="https://brentonbaker.com/content/images/size/w600/2023/10/bb_gs3.jpg 600w, https://brentonbaker.com/content/images/size/w1000/2023/10/bb_gs3.jpg 1000w, https://brentonbaker.com/content/images/2023/10/bb_gs3.jpg 1440w" sizes="(min-width: 720px) 720px"></div></div></div></figure>]]></content:encoded></item></channel></rss>