<?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"><channel><title><![CDATA[Amrith's Blog]]></title><description><![CDATA[Amrith's Blog]]></description><link>https://dev.vengalath.com</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 19:43:14 GMT</lastBuildDate><atom:link href="https://dev.vengalath.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Keyboard Management in React Native: The Full Developer's Journey]]></title><description><![CDATA[TLDR; use react-native-keyboard-controller - npm by kirillzyusko
Why Keyboard Handling Matters
Every React Native developer, at some point, wrestles with mobile keyboards. Whether your app is a chat, a login form, or a complex survey, you quickly rea...]]></description><link>https://dev.vengalath.com/keyboard-management-in-react-native-the-full-developers-journey</link><guid isPermaLink="true">https://dev.vengalath.com/keyboard-management-in-react-native-the-full-developers-journey</guid><category><![CDATA[React Native]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Thu, 25 Sep 2025 18:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759140603319/2be5ddc0-995c-4e51-9bc1-9bbde99d05c7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TLDR; use <a target="_blank" href="https://www.npmjs.com/package/react-native-keyboard-controller">react-native-keyboard-controller - npm</a> <strong>by</strong> <a target="_blank" href="https://github.com/kirillzyusko"><strong>kirillzyusko</strong></a></p>
<h2 id="heading-why-keyboard-handling-matters">Why Keyboard Handling Matters</h2>
<p>Every React Native developer, at some point, wrestles with mobile keyboards. Whether your app is a chat, a login form, or a complex survey, you quickly realize that the keyboard can disrupt content, animations, and even user flows. This post tracks the journey from the earliest struggles to today’s robust, cross-platform tooling so you can ship seamless, native-like keyboard experiences on both iOS and Android.</p>
<hr />
<h2 id="heading-2015-the-wild-beginnings">2015: The Wild Beginnings</h2>
<p>React Native’s release was exciting native-feel apps powered by JavaScript. Early on, keyboard handling felt like an afterthought. iOS simply handed the problem over to app developers, forcing many to cobble together awkward workarounds. Android, meanwhile, resized views automatically via the windowSoftInputMode but gave developers little control over transitions or custom layouts.</p>
<h2 id="heading-keyboardavoidingview-arrives">KeyboardAvoidingView Arrives</h2>
<p>To help, React Native introduced <code>KeyboardAvoidingView</code>. On iOS, this component wraps your layout and pushes it upward as the keyboard appears.</p>
<pre><code class="lang-javascript">&lt;KeyboardAvoidingView&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">TextInput</span> /&gt;</span></span>
&lt;/KeyboardAvoidingView&gt;
</code></pre>
<p>But it had clear limitations especially for forms or inputs near the bottom of the screen. Inputs could get stuck behind the keyboard, with no easy fix.</p>
<hr />
<h2 id="heading-community-packages-amp-native-inspirations">Community Packages &amp; Native Inspirations</h2>
<p>The React Native community saw these shortcomings and released <code>react-native-keyboard-aware-scroll-view</code>, which helped make focused inputs visible by scrolling as users interacted. Meanwhile, iOS developers outside the React Native bubble had long adopted IQKeyboardManager this inspired the React Native KeyboardManager wrapper to sync keyboard anims and add toolbars.</p>
<p><strong>Shortcomings Remained</strong></p>
<ul>
<li><p>Keyboard-aware scrolling sometimes desynced animations, especially with multiline fields.</p>
</li>
<li><p>Android didn’t need most wrappers, but lacked options for customizing or animating transitions.</p>
</li>
</ul>
<hr />
<h2 id="heading-native-breakthroughs-amp-inputaccessoryview">Native Breakthroughs &amp; InputAccessoryView</h2>
<p>As apps matured, custom behaviors became critical:</p>
<ul>
<li><p>Chat UIs wanted swipe-to-dismiss gestures.</p>
</li>
<li><p>Smart toolbars and sticky buttons became UI must-haves.</p>
</li>
</ul>
<p>iOS’s <code>InputAccessoryView</code> answered these needs, smoothly handling sticky toolbars above the keyboard and interactive dismissal. On Android, developers had less direct control, leading to inconsistencies.</p>
<hr />
<h2 id="heading-true-cross-platform-parity-the-modern-era">True Cross-Platform Parity: The Modern Era</h2>
<p>Keyboard management needed to be unified same API and parity across iOS and Android.</p>
<h2 id="heading-introducing-advanced-libraries">Introducing Advanced Libraries</h2>
<p>New libraries like <code>react-native-avoid-soft-input</code> let developers:</p>
<ul>
<li><p>Animating transitions with hooks (<code>useKeyboardAnimation</code>)</p>
</li>
<li><p>Disabling auto-resizing on both platforms for precision</p>
</li>
</ul>
<p>Android 11 introduced the <strong>window insets animation API</strong>, marking a turning point. Developers could finally synchronize UI and keyboard movement, unlocking smoother experiences on both platforms.</p>
<h2 id="heading-the-keyboard-controller-library">The Keyboard Controller Library</h2>
<p>Kiryl Ziusko, creator of Keyboard Controller, set ambitious goals:</p>
<ul>
<li><p>Identical experience on both platforms</p>
</li>
<li><p>Single API for everything, no conditional code</p>
</li>
<li><p>Advanced parity for events, animations, and gestures</p>
</li>
</ul>
<p>With hooks like <code>useKeyboardAnimation</code> (returns animated keyboard height/progress) and <code>useKeyboardHandler</code> (lets you handle animation at every frame), fine-grained control became reality.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> { height, progress } = useKeyboardAnimation();
</code></pre>
<h2 id="heading-syncing-animations-and-avoiding-jank">Syncing Animations and Avoiding Jank</h2>
<ul>
<li><p>Both iOS and Android could animate transitions in sync</p>
</li>
<li><p>You could track keyboard focus and update the UI smoothly for multiline and growing fields</p>
</li>
<li><p>New declarative components extended classic wrappers, so keyboard avoidance “just works”</p>
</li>
</ul>
<hr />
<h2 id="heading-building-with-modern-components">Building With Modern Components</h2>
<p>Today, you can use high-level components:</p>
<ul>
<li><p><strong>KeyboardAvoidingView</strong> (powered by Keyboard Controller APIs) for responsive, animated avoidance and padding.</p>
</li>
<li><p><strong>KeyboardStickyView</strong> for buttons/toolbars anchored above the keyboard, with no config needed.</p>
</li>
<li><p><strong>KeyboardAwareScrollView</strong> (now supporting animated transitions and input events).</p>
</li>
<li><p><strong>KeyboardToolbar</strong>, <strong>KeyboardExtender</strong>, and <strong>KeyboardBackgroundView</strong> for toolbars and advanced keyboard overlays.</p>
</li>
</ul>
<pre><code class="lang-javascript">&lt;KeyboardStickyView&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Button</span> <span class="hljs-attr">title</span>=<span class="hljs-string">"Submit"</span> /&gt;</span></span>
&lt;/KeyboardStickyView&gt;
</code></pre>
<p><strong>Bonus:</strong> Programmatically move focus between fields (<code>setFocusTo</code>)—no more sticky input headaches.</p>
<hr />
<h2 id="heading-going-beyond-extending-and-animating-the-keyboard">Going Beyond: Extending and Animating the Keyboard</h2>
<p>Modern solutions let you embed custom views inside or above the keyboard region. Want a quick payment selector or animated chat attachment sheet? Tools like <code>KeyboardExtender</code> and <code>KeyboardBackgroundView</code> let you do this without glitches.</p>
<p>The result? Rich UIs that feel polished, professional, and fully native.</p>
<hr />
<h2 id="heading-takeaways-for-developers">Takeaways for Developers</h2>
<ul>
<li><p><strong>Keyboard problems are solved:</strong> Modern libraries give you seamless, predictable behavior across platforms.</p>
</li>
<li><p><strong>Leverage hooks and components:</strong> Write less boilerplate let declarative wrappers and hooks handle the tough stuff.</p>
</li>
<li><p><strong>Try advanced features:</strong> Toolbars, gestures, overlays, focus management, and even shared transitions are now part of your toolkit.</p>
</li>
<li><p><strong>Don’t fear animation:</strong> Synchronized keyboard transitions enable rich, immersive mobile experiences.</p>
</li>
</ul>
<hr />
<p>Today, React Native keyboard management is no longer an afterthought or a “black hole.” Developers can now focus on user experiences, confident that input interactions will be smooth and intuitive. So embrace these tools, build boldly, and make your keyboard interactions a delight not a frustration for your users.</p>
]]></content:encoded></item><item><title><![CDATA[Monetizing Your React Native App with In-App Purchases]]></title><description><![CDATA[If you’re a React Native developer ready to turn your app into a sustainable business, understanding monetization is crucial. Monetization isn’t just about making money it’s about supporting your development, sustaining your app, and creating value f...]]></description><link>https://dev.vengalath.com/monetizing-your-react-native-app-with-in-app-purchases</link><guid isPermaLink="true">https://dev.vengalath.com/monetizing-your-react-native-app-with-in-app-purchases</guid><category><![CDATA[React Native]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Thu, 18 Sep 2025 18:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759148342207/5f0a58f9-b295-4521-bfab-87bc42955d77.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>If you’re a React Native developer ready to turn your app into a sustainable business, understanding monetization is crucial. Monetization isn’t just about making money it’s about supporting your development, sustaining your app, and creating value for your users. In this blog, we dive into how to monetize React Native apps using in-app purchases (IAPs), what works best, and practical steps to implement them.</p>
<hr />
<h2 id="heading-why-monetization-matters-for-developers">Why Monetization Matters for Developers</h2>
<p>First off, why should developers care about monetization? Simply put, you need to eat! The idea that Apple or Google will pay you just for listing an app in their stores is a myth. Both platforms charge fees and take commissions on app sales or in-app purchases. Without monetization, you'll struggle to support your development efforts.</p>
<p>Interestingly, React Native apps lead other platforms in revenue generation. React Native apps:</p>
<ul>
<li><p>Generate more revenue than Flutter and even native apps</p>
</li>
<li><p>Have better conversion rates, meaning users are more likely to subscribe</p>
</li>
<li><p>Achieve higher long-term revenue per user than competitors</p>
</li>
</ul>
<p>React Native’s strength lies in rapid development and faster market reach, helping developers tune apps closely to user preferences and needs. So, if you hear someone say React Native isn’t “native enough,” you can just smile and say, “Say that to my wallet.”</p>
<hr />
<h2 id="heading-monetization-strategies-overview">Monetization Strategies Overview</h2>
<p>There are three primary models to monetize apps:</p>
<ol>
<li><p><strong>Paid apps (buy to download):</strong><br /> This traditional method charges users upfront to download your app. It’s simple but less popular today. Users often hesitate to pay without trying the app first.</p>
</li>
<li><p><strong>Ad-supported models:</strong><br /> Apps rely on ads for revenue. While common, especially on Android, ads can degrade user experience. Often, ad quality is low, and users find them intrusive.</p>
</li>
<li><p><strong>In-app purchases (IAPs):</strong><br /> IAPs represent a more flexible, user-friendly revenue stream. Users try your app, then pay for additional features or subscriptions once hooked. This approach maximizes monetization potential and minimizes upfront barriers.</p>
</li>
</ol>
<hr />
<h2 id="heading-understanding-in-app-purchases-types">Understanding In-App Purchases Types</h2>
<p>In-app purchases come in several flavors:</p>
<ul>
<li><p><strong>Consumables:</strong><br />  One-time purchases users consume, like virtual currencies or potions in games. Once used, they must be bought again.</p>
</li>
<li><p><strong>Non-consumables:</strong><br />  Permanent purchases that unlock features or content forever, like unlocking a premium theme or removing ads.</p>
</li>
<li><p><strong>Subscriptions:</strong><br />  Recurring payments granting ongoing access to premium features for set periods (monthly, yearly). This has become the dominant monetization model due to steady revenue flow.</p>
</li>
</ul>
<p>Here’s when to use each:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Type</strong></td><td><strong>Use Cases</strong></td><td><strong>Example</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Consumable</td><td>Temporary items or boost purchases</td><td>Game coins, extra lives</td></tr>
<tr>
<td>Non-consumable</td><td>One-time permanent upgrades</td><td>Unlocking a premium mode</td></tr>
<tr>
<td>Subscriptions</td><td>Ongoing access and content updates</td><td>Netflix, Spotify premium</td></tr>
</tbody>
</table>
</div><p>Subscriptions reduce user friction by spreading costs over time. They align well with apps that provide continuous value, like fitness services, news, or content streaming.</p>
<hr />
<h2 id="heading-navigating-app-store-fees-and-policies">Navigating App Store Fees and Policies</h2>
<p>Both Apple and Google take a cut from your sales, roughly 15-30%. For small developers earning less than $1M, Apple offers an 85% share on revenues, which incentivizes smaller businesses.</p>
<p>You cannot sidestep in-app purchase policies easily for digital goods. Apple and Google are alert to violations and may reject apps that try to redirect users outside their payment systems. Some exceptions exist for physical goods, but digital subscriptions must comply.</p>
<p>For example, Spotify uses a “reader app” model where subscriptions happen outside the app (on the website) because their app cannot directly process payments in the store.</p>
<hr />
<h2 id="heading-practical-steps-to-implement-in-app-purchases-in-react-native">Practical Steps to Implement In-App Purchases in React Native</h2>
<p>Let’s get hands-on. How do you add IAP support to a React Native app?</p>
<p>If you’ve heard of RevenueCat it’s an excellent hosted solution simplifying IAP integration. They track purchases, manage subscriptions, handle cross-platform product mapping, and provide UI components for paywalls.</p>
<p><strong>Key Terms for React Native IAPs:</strong></p>
<ul>
<li><p><strong>Products:</strong> Your subscriptions or items listed in App Store / Play Store.</p>
</li>
<li><p><strong>Entitlements:</strong> Groups of products that grant access to certain features.</p>
</li>
<li><p><strong>Paywall:</strong> The UI screen where users can purchase subscriptions or items.</p>
</li>
</ul>
<hr />
<h2 id="heading-setting-up-products-and-entitlements">Setting Up Products and Entitlements</h2>
<ol>
<li><p><strong>Configure your products</strong> on the Apple App Store Connect and Google Play Console.</p>
</li>
<li><p><strong>Connect RevenueCat</strong> using API keys specific to each platform.</p>
</li>
<li><p><strong>Import products automatically</strong> into RevenueCat no tedious manual syncing.</p>
</li>
</ol>
<hr />
<h2 id="heading-coding-your-first-subscription">Coding Your First Subscription</h2>
<p>Starting fresh with Expo or React Native?</p>
<ul>
<li><p>Install <code>react-native-purchases</code> from RevenueCat.</p>
</li>
<li><p>Because Expo Go lacks native code support, use a development build.</p>
</li>
<li><p>Configure your API keys for iOS and Android.</p>
</li>
</ul>
<p>Here’s a basic example to set it up and show a paywall modal blocking access until a purchase is made:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> Purchases <span class="hljs-keyword">from</span> <span class="hljs-string">'react-native-purchases'</span>;
<span class="hljs-keyword">import</span> { Platform } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-native'</span>;

useEffect(<span class="hljs-function">() =&gt;</span> {
  Purchases.configure({
    <span class="hljs-attr">apiKey</span>: Platform.select({
      <span class="hljs-attr">ios</span>: <span class="hljs-string">'your-ios-api-key'</span>,
      <span class="hljs-attr">android</span>: <span class="hljs-string">'your-android-api-key'</span>,
    }),
  });
}, []);

<span class="hljs-keyword">const</span> Paywall = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-comment">// RevenueCat's React Native UI components make this easy - no custom UI code needed</span>
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">RevenueCatPaywall</span> /&gt;</span></span>;
};
</code></pre>
<p>Once setup, RevenueCat’s dashboard lets you customize paywall appearances dynamically with templates, enabling you to run AB tests or display different offers to segments of users.</p>
<hr />
<h2 id="heading-after-purchase-flow">After Purchase Flow</h2>
<p>When users complete a purchase:</p>
<ul>
<li><p>The paywall disappears.</p>
</li>
<li><p>Your app checks if the user has access based on entitlements.</p>
</li>
<li><p>Unlock new features or content accordingly.</p>
</li>
</ul>
<hr />
<h2 id="heading-summary-amp-recommendations">Summary &amp; Recommendations</h2>
<ul>
<li><p>Monetization is essential to sustain app development React Native apps lead in revenue outcomes.</p>
</li>
<li><p>In-app purchases provide the most flexible and user-friendly monetization strategy.</p>
</li>
<li><p>Subscriptions are the go-to format for recurring revenue.</p>
</li>
<li><p>Use hosted services like RevenueCat to simplify implementation and management.</p>
</li>
<li><p>Always comply with app store policies and design smooth, compelling paywalls.</p>
</li>
<li><p>Start with simple paywalls and iterate with dynamic offers based on your user data.</p>
</li>
</ul>
<hr />
<p>React Native developers have all the tools needed to monetize successfully and focus on building apps users love. Once set up, you can replace guesswork with data-driven paywalls and unlock new revenue streams all while delivering the best experience possible.</p>
]]></content:encoded></item><item><title><![CDATA[Taming Visual Studio’s CPU Usage: A Lightweight Workflow for Angular + MVC + API Projects]]></title><description><![CDATA[“Alas! Wielding a Chainsaw Where Scissors Suffice.”When developing multi-layer applications, sometimes the tools we use are far heavier than the actual task at hand.

If you’re building an Angular frontend hosted inside an ASP.NET MVC project with a ...]]></description><link>https://dev.vengalath.com/taming-visual-studios-cpu-usage-a-lightweight-workflow-for-angular-mvc-api-projects</link><guid isPermaLink="true">https://dev.vengalath.com/taming-visual-studios-cpu-usage-a-lightweight-workflow-for-angular-mvc-api-projects</guid><category><![CDATA[Angular]]></category><category><![CDATA[DOT NET Development]]></category><category><![CDATA[mvc]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Thu, 11 Sep 2025 17:31:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757611548837/7e34335b-6632-4c3d-a27a-721b64f6c1ad.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p><em>“Alas! Wielding a Chainsaw Where Scissors Suffice.”</em><br />When developing multi-layer applications, sometimes the tools we use are far heavier than the actual task at hand.</p>
</blockquote>
<p>If you’re building an <strong>Angular frontend hosted inside an</strong> <a target="_blank" href="http://ASP.NET"><strong>ASP.NET</strong></a> <strong>MVC project</strong> with a <strong>.NET API</strong>, chances are you’ve run into this,</p>
<ul>
<li><p>Visual Studio consuming <strong>close to 100% CPU</strong></p>
</li>
<li><p>Fans spinning like a jet engine</p>
</li>
<li><p>Even small operations feeling sluggish (Yeah, I copied and pasted a line in the same file and it was showing me a loading symbol)</p>
</li>
</ul>
<p>I ran into this exact issue and found a lightweight alternative that cut CPU usage from ~100% down to under 30%, all while keeping Angular, MVC, and API running smoothly.</p>
<h2 id="heading-why-visual-studio-eats-cpu">Why Visual Studio Eats CPU</h2>
<ul>
<li><p><strong>Roslyn Code Analysis &amp; IntelliSense</strong> → continuously scanning large solutions</p>
</li>
<li><p><strong>ServiceHub background services</strong> → CodeLens, Live Analysis, and telemetry</p>
</li>
<li><p><strong>Running Angular inside Visual Studio</strong> → even though it’s not needed just to serve the frontend</p>
</li>
</ul>
<p>The end result? High resource usage for tasks that don’t really require Visual Studio.</p>
<h2 id="heading-a-lighter-alternative">A Lighter Alternative</h2>
<p>For <strong>Angular development</strong>, Visual Studio Code (or any editor) is much lighter compared to full Visual Studio.<br />Visual Studio is still invaluable when debugging MVC or API issues but it doesn’t need to stay open all the time just to host projects.</p>
<p>Instead, you can run your projects directly from the command line.</p>
<h3 id="heading-run-the-api-with-dotnet-run">Run the API with <code>dotnet run</code></h3>
<p>From the folder where your <code>.csproj</code> file is located</p>
<pre><code class="lang-bash">dotnet run --urls <span class="hljs-string">"&lt;protocol&gt;://localhost:&lt;port&gt;"</span>
</code></pre>
<p>Example:</p>
<pre><code class="lang-bash">dotnet run --urls <span class="hljs-string">"https://localhost:7001"</span>
</code></pre>
<p>This spins up your API without needing Visual Studio.</p>
<h3 id="heading-run-the-mvc-project-with-iis-express">Run the MVC Project with IIS Express</h3>
<p>From the folder containing your <code>web.config</code>:</p>
<pre><code class="lang-bash"><span class="hljs-string">"&lt;path-to-iisexpress.exe&gt;"</span> /path:<span class="hljs-string">"&lt;path-to-project&gt;"</span> /port:&lt;desired-port&gt;
</code></pre>
<p>Example:</p>
<pre><code class="lang-bash"><span class="hljs-string">"C:\Program Files (x86)\IIS Express\iisexpress.exe"</span> /path:<span class="hljs-string">"C:\Path\to\Project\Folder"</span> /port:20500
</code></pre>
<p>This runs your MVC project lightweight via IIS Express.</p>
<h2 id="heading-benefits-of-this-setup">Benefits of This Setup</h2>
<ul>
<li><p><strong>Lower CPU usage</strong> (under 30% vs ~100%)</p>
</li>
<li><p><strong>Faster Angular hot reloads</strong></p>
</li>
<li><p><strong>No need to keep Visual Studio open all the time</strong></p>
</li>
<li><p><strong>Flexibility</strong>: only open VS when debugging MVC or API issues</p>
</li>
</ul>
<p>Visual Studio is a fantastic tool, but it’s often <strong>overkill for day-to-day frontend development</strong>. By separating concerns, running MVC and API manually, and Angular independently you can enjoy a smoother, faster workflow without your CPU maxing out.</p>
<p>If you’re struggling with performance in your dev environment, give this approach a try. Sometimes, trading the chainsaw for a pair of scissors is all you need.</p>
]]></content:encoded></item><item><title><![CDATA[How to share an iOS ipa file for installation over the air with custom domain server set up.]]></title><description><![CDATA[To share an iOS IPA file for installation over the air with a custom domain server set up, we first need to prepare the build.


Open the <YourProjectName>.xcworkspace file on Xcode

Make sure You select the Files icon in the left section and the Pro...]]></description><link>https://dev.vengalath.com/how-to-share-an-ios-ipa-file-for-installation-over-the-air-with-custom-domain-server-set-up</link><guid isPermaLink="true">https://dev.vengalath.com/how-to-share-an-ios-ipa-file-for-installation-over-the-air-with-custom-domain-server-set-up</guid><category><![CDATA[ios app development]]></category><category><![CDATA[iOS]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Wed, 14 Jun 2023 06:42:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1686722909361/2f03d930-163f-42d4-8789-9de1bb214cc4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To share an iOS IPA file for installation over the air with a custom domain server set up, we first need to prepare the build.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686722814223/56b1b612-e4ca-4b4c-bbff-8eef8e95cea5.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Open the &lt;YourProjectName&gt;.xcworkspace file on Xcode</p>
</li>
<li><p>Make sure You select the Files icon in the left section and the Project is selected.</p>
</li>
<li><p>Make Necessary changes in Version and Build number only if necessary.</p>
</li>
<li><p>Change the device to <code>Any iOS Device (Arm 64)</code></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686722857899/cc7beee7-f889-462e-ae0f-20ad9f01ce76.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>In the Top Menu select <code>Product</code> and select <code>Clean Build Folder,</code> Wait for it to show the message clean finished.</p>
</li>
<li><p>In the same menu click <code>Archive</code> and then wait for this to finish might take some time. Once completed the Organizer window will open.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723309205/7a6c9354-3e32-4d53-9c77-373a7138ec7a.png" alt class="image--center mx-auto" /></p>
<p>In that select the build you just created and click the Distribute App button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723476739/2d6d263c-a0fc-476e-ab0c-91b87732c2e3.png" alt class="image--center mx-auto" /></p>
<p>Select Ad Hoc and click on Next</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723490372/dc58d017-0028-4197-97d7-3437d436dfc4.png" alt class="image--center mx-auto" /></p>
<p>Check <code>Include manifest for over-the-air installation</code> and click on Next</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686724098260/421a3f1a-6076-4d5b-a7aa-d72b68eea892.png" alt class="image--center mx-auto" /></p>
<p>Fill in the link for the <code>.ipa</code> file where you will be hosting it.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723500073/e537f244-d9a6-472d-93e3-855963423cad.png" alt class="image--center mx-auto" /></p>
<p>Choose Signing and Proceed</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723511251/22f9fd59-969e-4b3a-a58d-d27751c7b45b.png" alt class="image--center mx-auto" /></p>
<p>Now Click export and choose a location where you wish to save the folder. This contains <code>manifest.plist</code> and <code>Wordrobe.ipa</code> files</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686723720791/71b7d763-30a2-4f81-bd31-76474208f429.png" alt class="image--center mx-auto" /></p>
<p>Now in your server, in that location create an index file which contains a button on click opens the link</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"itms-services://?action=download-manifest&amp;url=https://dl.vengalath.com/dglb/june23/9/manifest.plist"</span> <span class="hljs-attr">title</span>=<span class="hljs-string">"Install iOS app"</span>&gt;</span>
</code></pre>
<p>Which is <code>itms-services://?action=download-manifest&amp;url=&lt;link_to_your_.plist_file&gt;</code></p>
<p>Currently the folder <code>dl.vengalath.com/dglb/june23/9/</code> contains</p>
<ul>
<li><p>manifest.plist</p>
</li>
<li><p>index.html</p>
</li>
<li><p>wordrobe3.0.11.ipa</p>
</li>
</ul>
<p>Share the link with internal testers and they will be able to install the app. <strong>The client device or tester device UUID should be added to the trusted device or device list on the Apple</strong> <a target="_blank" href="https://developer.apple.com/account/resources/devices/list"><strong>app store</strong></a> <strong>only then they will be able to install the application. And the Developer mode should be turned on in that device.</strong></p>
<p>In my case, the testing device was already listed there since the device was logged in with an email of an internal tester.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1686724848556/553f4516-af3d-472a-8819-2b26ae378e6a.png" alt class="image--center mx-auto" /></p>
<p>Now when you open the <a target="_blank" href="https://dl.vengalath.com/dglb/june23/9/index.html">link</a> and click the Install App icon you should be able to test the app.</p>
<hr />
<p><a target="_blank" href="https://www.freepik.com/free-vector/mobile-testing-concept-illustration_7230644.htm#query=iOS%20app%20testing&amp;position=0&amp;from_view=search&amp;track=ais">Cover Image by storyset</a> on Freepik</p>
]]></content:encoded></item><item><title><![CDATA[Data Types and variables in Javascript]]></title><description><![CDATA[Data is anything meaningful to the computer. Javascript provides 7 different datatypes to use within Javascript.
Data Types

Undefined
Null
Boolean
String
Symbol
Number
Object

Undefined
Undefined in Javascript is something that hasn't been defined. ...]]></description><link>https://dev.vengalath.com/data-types-and-variables-in-javascript</link><guid isPermaLink="true">https://dev.vengalath.com/data-types-and-variables-in-javascript</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Tue, 22 Mar 2022 23:08:54 GMT</pubDate><content:encoded><![CDATA[<p>Data is anything meaningful to the computer. Javascript provides 7 different datatypes to use within Javascript.</p>
<h2 id="heading-data-types">Data Types</h2>
<ul>
<li>Undefined</li>
<li>Null</li>
<li>Boolean</li>
<li>String</li>
<li>Symbol</li>
<li>Number</li>
<li>Object</li>
</ul>
<h3 id="heading-undefined">Undefined</h3>
<p>Undefined in Javascript is something that hasn't been defined. eg. A variable you haven't set to anything yet</p>
<pre><code><span class="hljs-keyword">var</span> x;
console.log(x);
</code></pre><p>output:
<code>undefined</code> </p>
<h3 id="heading-null">Null</h3>
<p>Null means nothing. You set a variable to be something but the value is nothing</p>
<pre><code><span class="hljs-keyword">var</span> x <span class="hljs-operator">=</span> null;
console.log(x);
</code></pre><p>output:
<code>null</code> </p>
<h3 id="heading-boolean">Boolean</h3>
<p>A boolean means <code>true</code> or <code>false</code></p>
<pre><code><span class="hljs-keyword">var</span> x <span class="hljs-operator">=</span> <span class="hljs-number">1</span><span class="hljs-operator">&gt;</span><span class="hljs-number">2</span>;
console.log(x);
</code></pre><p>output:
<code>false</code> </p>
<h3 id="heading-string">String</h3>
<p>String is just any sort of text.</p>
<pre><code><span class="hljs-keyword">var</span> x <span class="hljs-operator">=</span> <span class="hljs-string">'Hello World'</span>;
<span class="hljs-comment">// 'here data type of x is string'</span>
</code></pre><h3 id="heading-symbol">Symbol</h3>
<p>Symbol is immutable and unique value.</p>
<pre><code><span class="hljs-keyword">let</span> <span class="hljs-keyword">value</span> = Symbol(<span class="hljs-string">'hello'</span>);
</code></pre><h3 id="heading-number">Number</h3>
<p>A Number is an integer or a floating-point number.</p>
<pre><code><span class="hljs-built_in">let</span> x = 5;
</code></pre><h3 id="heading-object">Object</h3>
<p>Object can store a lot of key value pairs of collection of data.</p>
<pre><code><span class="hljs-built_in">let</span> person = {
firstName:<span class="hljs-string">"Jane"</span>, 
lastName:<span class="hljs-string">"Doe"</span>, 
age:20, 
eyeColor:<span class="hljs-string">"blue"</span>
};
</code></pre><p>When you assign a data to a variable the datatype of that variable becomes the datatype of that data you assigned.</p>
]]></content:encoded></item><item><title><![CDATA[How to comment in javascript?]]></title><description><![CDATA[What are comments ?
Comments are lines of codes javascript intentionally ignore. They don't do anything. We can use comments in our code to make notes on what the code does so that it will be easier to read later time for us.
There are 2 types of com...]]></description><link>https://dev.vengalath.com/how-to-comment-in-javascript</link><guid isPermaLink="true">https://dev.vengalath.com/how-to-comment-in-javascript</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Fri, 31 Dec 2021 22:22:01 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-what-are-comments">What are comments ?</h3>
<p>Comments are lines of codes javascript intentionally ignore. They don't do anything. We can use comments in our code to make notes on what the code does so that it will be easier to read later time for us.</p>
<p>There are 2 types of comment in javascript </p>
<ul>
<li>In-line comment</li>
<li>Multi-line comment</li>
</ul>
<h3 id="heading-in-line-comment">In-line comment</h3>
<p>You can do in-line comment by typing <code>//</code> or by pressing <code>Ctrl + /</code> on windows and <code>Command + /</code> on mac.  You can use in-line comment to comment a line in Javascript or to add note in the end of a line. </p>
<pre><code><span class="hljs-keyword">var</span> <span class="hljs-built_in">num</span> = <span class="hljs-number">1</span>; \\ <span class="hljs-string">'in-line comment at the end of a code'</span>

<span class="hljs-comment">//var num = 1; this code will note run</span>
</code></pre><h3 id="heading-multi-line-comment">Multi-line comment</h3>
<p>To do a multi-line comment add <code>/*</code> in the starting of the comment and end it with <code>*/</code>. </p>
<pre><code><span class="hljs-comment">/*
This is a 
multi-line comment
*/</span>
</code></pre>]]></content:encoded></item><item><title><![CDATA[Do this if you have a custom domain!]]></title><description><![CDATA[Most of us will have a custom domain. It will be for various reasons like blog/merch/email. Make sure you set the SPF, DKIM, and DMARC records. 
Why is this important?
Anyone can send emails from your domain if you didn't set SPF and DMARC records. J...]]></description><link>https://dev.vengalath.com/do-this-if-you-have-a-custom-domain</link><guid isPermaLink="true">https://dev.vengalath.com/do-this-if-you-have-a-custom-domain</guid><category><![CDATA[email]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Sat, 18 Sep 2021 22:14:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1632002569508/4lZRwyIR2U.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most of us will have a custom domain. It will be for various reasons like blog/merch/email. Make sure you set the SPF, DKIM, and DMARC records. </p>
<h2 id="why-is-this-important">Why is this important?</h2>
<p>Anyone can send emails from your domain if you didn't set SPF and DMARC records. Just having the SPF will mark spoofed emails as spam.</p>
<h2 id="do-you-need-to-set-an-spf-record-for-a-domain-that-doesnt-send-mails">Do you need to set an SPF record for a domain that doesn't send mails?</h2>
<p>It will reduce the risk of being abused by phishers and spammers. if you set the SPF record as follows </p>
<p><code>v=spf1 -all</code> </p>
<h2 id="what-is-spf">What is SPF?</h2>
<p>Sender Policy Framework (SPF) is used to authenticate the sender of an email. ISP can verify an IP is authorized to send emails from your domain. know more visit https://dmarcian.com/what-is-spf/</p>
<p>To know more about DKIM visit https://dmarcian.com/what-is-dkim/</p>
<h2 id="so-what-about-dmarc">So what about DMARC?</h2>
<p>The standard email authentication method DMARC (Domain-based Message Authentication, Reporting, and Conformance) helps us to prevent attackers from spoofing the domain.</p>
<p>You can set DMARC easily with instructions from http://dmarcian.com </p>
<p>Credits 
<a href="https://www.freepik.com/photos/background">Background photo created by natanaelginting - www.freepik.com</a></p>


]]></content:encoded></item><item><title><![CDATA[How to use gpg as ssh agent.]]></title><description><![CDATA[If you don’t know how to create GPG keys read How to create GPG key-pair
This setup is for Mac users
Enable the GPG-agent ssh support by typing this in your terminal
echo enable-ssh-support >> $HOME/.gnupg/gpg-agent.conf
Set SSH_AUTH_SOCK so that SSH...]]></description><link>https://dev.vengalath.com/how-to-use-gpg-as-ssh-agent</link><guid isPermaLink="true">https://dev.vengalath.com/how-to-use-gpg-as-ssh-agent</guid><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Sun, 27 Jun 2021 20:25:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1647979653645/3fsAJ-O_R.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you don’t know how to create GPG keys read <a target="_blank" href="https://dev.vengalath.com/how-to-create-gpg-keypair">How to create GPG key-pair</a></p>
<p>This setup is for Mac users</p>
<p>Enable the GPG-agent ssh support by typing this in your terminal</p>
<pre><code>echo enable<span class="hljs-operator">-</span>ssh<span class="hljs-operator">-</span>support <span class="hljs-operator">&gt;</span><span class="hljs-operator">&gt;</span> $HOME<span class="hljs-operator">/</span>.gnupg/gpg<span class="hljs-operator">-</span>agent.conf
</code></pre><p>Set SSH_AUTH_SOCK so that SSH will use GPG-agent instead of ssh-agent. Add this to to your .bashprofile or .zshrc</p>
<p>To know your SHELL type </p>
<pre><code><span class="hljs-keyword">echo</span> $SHELL
</code></pre><p>this will print /bin/zsh or /bin/bash</p>
<p>open the .zshrc file by typing</p>
<pre><code>cd <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> nano .zshrc
</code></pre><p>or open .bashprofile by typing </p>
<pre><code>cd <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> nano .bash_profile
</code></pre><p>Add the following to the file (.bashprofile or .zshrc)</p>
<pre><code>unset SSH_AGENT_PID
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"${gnupg_SSH_AUTH_SOCK_by:-0}"</span> <span class="hljs-operator">-</span>ne $$ ]; then
  export SSH_AUTH_SOCK<span class="hljs-operator">=</span><span class="hljs-string">"$(gpgconf --list-dirs agent-ssh-socket)"</span>
fi
export GPG_TTY<span class="hljs-operator">=</span>$(tty)
gpg<span class="hljs-operator">-</span>connect<span class="hljs-operator">-</span>agent updatestartuptty <span class="hljs-operator">/</span>bye <span class="hljs-operator">&gt;</span><span class="hljs-operator">/</span>dev<span class="hljs-operator">/</span>null
</code></pre><p>Enable the gpg subkey for ssh authentication</p>
<p>Type the following command to get the the sub-key key grip</p>
<pre><code>gpg <span class="hljs-operator">-</span><span class="hljs-operator">-</span>list<span class="hljs-operator">-</span>keys <span class="hljs-operator">-</span><span class="hljs-operator">-</span>with<span class="hljs-operator">-</span>keygrip
</code></pre><p>This may print the following </p>
<pre><code><span class="hljs-string">amrith@V</span> <span class="hljs-string">~</span> <span class="hljs-string">%</span> <span class="hljs-string">gpg</span> <span class="hljs-string">-K</span> <span class="hljs-string">--with-keygrip</span>
<span class="hljs-string">/Users/amrith/.gnupg/pubring.kbx</span>
<span class="hljs-string">--------------------------------</span>
<span class="hljs-string">sec#</span>  <span class="hljs-string">rsa4096</span> <span class="hljs-number">2021-02-07</span> [<span class="hljs-string">SC</span>] [<span class="hljs-attr">expires:</span> <span class="hljs-number">2031-02-07</span>]
      <span class="hljs-string">10B0C3E9867BC44CDA48690C8678CFE303EBDB52</span>
      <span class="hljs-string">Keygrip</span> <span class="hljs-string">=</span> <span class="hljs-string">CD02E01C898C378214163C91F3D1E93107B0EBDB</span>
<span class="hljs-string">uid</span>           [<span class="hljs-string">ultimate</span>] <span class="hljs-string">Amrith</span> <span class="hljs-string">Vengalath</span> 
<span class="hljs-string">ssb</span>   <span class="hljs-string">rsa4096</span> <span class="hljs-number">2021-02-07</span> [<span class="hljs-string">E</span>] [<span class="hljs-attr">expires:</span> <span class="hljs-number">2023-02-09</span>]
      <span class="hljs-string">Keygrip</span> <span class="hljs-string">=</span> <span class="hljs-string">4778AA4AE919B0387C24389FC2E86C4B7749FAD4</span>
<span class="hljs-string">ssb</span>   <span class="hljs-string">rsa4096</span> <span class="hljs-number">2021-02-09</span> [<span class="hljs-string">S</span>] [<span class="hljs-attr">expires:</span> <span class="hljs-number">2023-02-09</span>]
      <span class="hljs-string">Keygrip</span> <span class="hljs-string">=</span> <span class="hljs-string">B19D2224DBBBCC324679AC3CDA97337035477338</span>
<span class="hljs-string">ssb</span>   <span class="hljs-string">rsa4096</span> <span class="hljs-number">2021-02-10</span> [<span class="hljs-string">A</span>] [<span class="hljs-attr">expires:</span> <span class="hljs-number">2023-02-10</span>]
      <span class="hljs-string">Keygrip</span> <span class="hljs-string">=</span> <span class="hljs-string">53C518FCC568C4D3659AD3FF0C0A567CC9593DB5</span>
</code></pre><p>Add the keygrip of your subkey in the list of approved keys by the following command</p>
<pre><code><span class="hljs-attribute">echo</span> <span class="hljs-number">53</span>C<span class="hljs-number">518</span>FCC<span class="hljs-number">568</span>C<span class="hljs-number">4</span>D<span class="hljs-number">3659</span>AD<span class="hljs-number">3</span>FF<span class="hljs-number">0</span>C<span class="hljs-number">0</span>A<span class="hljs-number">567</span>CC<span class="hljs-number">9593</span>DB<span class="hljs-number">5</span> &gt;&gt; ~/.gnupg/sshcontrol
</code></pre><p>I typed <code>53C518FCC568C4D3659AD3FF0C0A567CC9593DB5</code> here since that is my keygrip replace this with yours</p>
<p>Now type the following command to check if the key is present in the ssh identities list</p>
<pre><code>ssh<span class="hljs-operator">-</span>add <span class="hljs-operator">-</span>l
</code></pre><p>output</p>
<pre><code><span class="hljs-attribute">4096</span> SHA<span class="hljs-number">256</span>:adp<span class="hljs-number">8</span>owth<span class="hljs-number">5</span>AD<span class="hljs-number">41</span>Hk<span class="hljs-number">6</span>uHYY<span class="hljs-number">3</span>M<span class="hljs-number">5</span>rl/GJNzizQIXwRugS<span class="hljs-number">5</span>t<span class="hljs-number">0</span> (none) (RSA)
</code></pre><p>Retrieve the public ssh key for the subkey</p>
<p>for that type the following command</p>
<pre><code>gpg <span class="hljs-operator">-</span><span class="hljs-operator">-</span>export<span class="hljs-operator">-</span>ssh<span class="hljs-operator">-</span>key 03EBDB52
</code></pre><p>output</p>
<pre><code><span class="hljs-attribute">ssh</span>-rsa AAAAB<span class="hljs-number">3</span>NzaC<span class="hljs-number">1</span>yc<span class="hljs-number">2</span>EAAAADAQABAAACAQDMPKbaYFylBzBNA<span class="hljs-number">79</span>ZOzdoMit<span class="hljs-number">7</span>/HpJcqG<span class="hljs-number">1</span>qNoegN<span class="hljs-number">6</span>gxh/rdUNRA<span class="hljs-number">5</span>Lu<span class="hljs-number">700</span>ub+Z<span class="hljs-number">3</span>PioZHQHm<span class="hljs-number">01</span>PczINO<span class="hljs-number">5</span>uT<span class="hljs-number">9</span>S/kA<span class="hljs-number">0</span>FnkoIFJ+gqd<span class="hljs-number">4</span>QfAVpPhsPFzkxiEHj<span class="hljs-number">9552</span>UnjsEOlCM<span class="hljs-number">5</span>gLwXfeVr<span class="hljs-number">268</span>VUSEcY<span class="hljs-number">0</span>HtHJ<span class="hljs-number">8</span>jELF<span class="hljs-number">3</span>xOO<span class="hljs-number">9</span>JeFDAGWbrEHqKbeClvsUHKn<span class="hljs-number">2</span>Ktf<span class="hljs-number">2</span>LXITh<span class="hljs-number">0</span>tHUFbzPt+LqEopNrkjdAsMTJVUh<span class="hljs-number">7</span>mrIeJFbGlqlgUfnaWCOXZ<span class="hljs-number">9</span>vdAyj/E<span class="hljs-number">2</span>FkK<span class="hljs-number">98</span>+lg<span class="hljs-number">423</span>svrU<span class="hljs-number">5</span>gqCMcAOHww/<span class="hljs-number">8</span>qHpuZ<span class="hljs-number">3</span>ni<span class="hljs-number">6</span>VxbBMo<span class="hljs-number">6</span>aEbChGkfNMOXmrelk<span class="hljs-number">9</span>+XZOJH<span class="hljs-number">6</span>bCZPP<span class="hljs-number">6</span>egTwXMBZg<span class="hljs-number">9</span>W<span class="hljs-number">60</span>hq<span class="hljs-number">4</span>r<span class="hljs-number">1</span>lc<span class="hljs-number">6</span>pprBp<span class="hljs-number">48</span>kmdNuj<span class="hljs-number">9</span>JDg+I<span class="hljs-number">2</span>r<span class="hljs-number">2</span>q<span class="hljs-number">2</span>ETslzOZJC<span class="hljs-number">5</span>GUJv<span class="hljs-number">1</span>FifIaztPH<span class="hljs-number">9</span>lO<span class="hljs-number">6</span>L/e<span class="hljs-number">1</span>/xGiKIbQsL<span class="hljs-number">7</span>mKSju<span class="hljs-number">7</span>pnhAvMfmwGVTzo<span class="hljs-number">6</span>CwWm<span class="hljs-number">2</span>QKVEVu<span class="hljs-number">5</span>pI<span class="hljs-number">3</span>dP/dJINwXZ+LoG<span class="hljs-number">6</span>q<span class="hljs-number">2</span>lkNxt/<span class="hljs-number">6</span>xKQPUSDtwCoxmo/Di<span class="hljs-number">8</span>lFuHmoi<span class="hljs-number">0</span>Q<span class="hljs-number">2</span>TJgX<span class="hljs-number">1</span>I<span class="hljs-number">07</span>uWDurTqci+fafniYcuwABxFrQZKUcNb+ZaSL<span class="hljs-number">2</span>L<span class="hljs-number">4</span>DifMu+FvC<span class="hljs-number">0</span>sZlkprWTQ/R<span class="hljs-number">6</span>PnhTzEEuiHLQZG<span class="hljs-number">1</span>O<span class="hljs-number">3</span>UycI<span class="hljs-number">2</span>TyEhUxaPmTulJktlVjH<span class="hljs-number">8</span>GXcbp<span class="hljs-number">5</span>tWjtk/<span class="hljs-number">7</span>WYKBiVu<span class="hljs-number">8</span>yvXUtGicMpQ/VQev/Lyd<span class="hljs-number">0</span>ucb<span class="hljs-number">0</span>eTyGofLDAXwcgAsXenacBw== openpgp:<span class="hljs-number">0</span>x<span class="hljs-number">4893</span>D<span class="hljs-number">8</span>CE
</code></pre><p>You can test if the key is working with your Github account. The ssh public key generated in the previous step has to be added to your Github SSH keys.</p>
<pre><code><span class="hljs-attribute">ssh</span> -T git<span class="hljs-variable">@github</span>.com
</code></pre><p>output</p>
<pre><code><span class="hljs-type">Hi</span> <span class="hljs-type">AmrithVengalath!</span> <span class="hljs-type">You've</span> successfully authenticated, but <span class="hljs-type">GitHub</span> does not provide shell access.
</code></pre>]]></content:encoded></item><item><title><![CDATA[How to create GPG key pair.]]></title><description><![CDATA[There are many uses for gpg, like signing/encrypting emails, signing commits, linux password store, use gpg as ssh agent, etc…
This is similar to creating ssh key where you choose key size, specify an identifier, and set a passphrase. There will be a...]]></description><link>https://dev.vengalath.com/how-to-create-gpg-keypair</link><guid isPermaLink="true">https://dev.vengalath.com/how-to-create-gpg-keypair</guid><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Wed, 23 Jun 2021 19:50:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1647977809587/CK01O02Qd.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are many uses for gpg, like signing/encrypting emails, signing commits, linux password store, use gpg as ssh agent, etc…</p>
<p>This is similar to creating ssh key where you choose key size, specify an identifier, and set a passphrase. There will be a public key (which you share with everyone) and a private key (stored securely).</p>
<p>Here we will create a key to Certify and then create sub-keys to sign, encrypt and Authenticate.</p>
<h2 id="heading-generating-the-master-key">Generating the master key</h2>
<p>For this key we only want Certify capability: we use this master key only to create the subkeys, Sign – Encrypt – Authenticate capabilities will be assigned to the subkeys.</p>
<p>Run the following command in your terminal to begin</p>
<pre><code>gpg <span class="hljs-operator">-</span><span class="hljs-operator">-</span>full<span class="hljs-operator">-</span>generate<span class="hljs-operator">-</span>key <span class="hljs-operator">-</span><span class="hljs-operator">-</span>expert
</code></pre><p>Now type 8 to select option – RSA (set your own capabilities)</p>
<pre><code>amrith@V ~ % gpg <span class="hljs-comment">--full-generate-key --expert</span>
gpg (GnuPG/MacGPG2) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to <span class="hljs-keyword">change</span> <span class="hljs-keyword">and</span> redistribute it.
There <span class="hljs-keyword">is</span> <span class="hljs-keyword">NO</span> WARRANTY, <span class="hljs-keyword">to</span> the <span class="hljs-keyword">extent</span> permitted <span class="hljs-keyword">by</span> law.

gpg: <span class="hljs-keyword">directory</span> <span class="hljs-string">'/Users/amrith/.gnupg'</span> created
gpg: keybox <span class="hljs-string">'/Users/amrith/.gnupg/pubring.kbx'</span> created
Please <span class="hljs-keyword">select</span> what kind <span class="hljs-keyword">of</span> <span class="hljs-keyword">key</span> you want:
   (<span class="hljs-number">1</span>) RSA <span class="hljs-keyword">and</span> RSA (<span class="hljs-keyword">default</span>)
   (<span class="hljs-number">2</span>) DSA <span class="hljs-keyword">and</span> Elgamal
   (<span class="hljs-number">3</span>) DSA (<span class="hljs-keyword">sign</span> <span class="hljs-keyword">only</span>)
   (<span class="hljs-number">4</span>) RSA (<span class="hljs-keyword">sign</span> <span class="hljs-keyword">only</span>)
   (<span class="hljs-number">7</span>) DSA (<span class="hljs-keyword">set</span> your own capabilities)
   (<span class="hljs-number">8</span>) RSA (<span class="hljs-keyword">set</span> your own capabilities)
   (<span class="hljs-number">9</span>) ECC <span class="hljs-keyword">and</span> ECC
  (<span class="hljs-number">10</span>) ECC (<span class="hljs-keyword">sign</span> <span class="hljs-keyword">only</span>)
  (<span class="hljs-number">11</span>) ECC (<span class="hljs-keyword">set</span> your own capabilities)
  (<span class="hljs-number">13</span>) Existing <span class="hljs-keyword">key</span>
  (<span class="hljs-number">14</span>) Existing <span class="hljs-keyword">key</span> <span class="hljs-keyword">from</span> card
Your selection? <span class="hljs-number">8</span>
</code></pre><p>Now type s to disable sign capability for the key</p>
<pre><code><span class="hljs-selector-tag">Possible</span> <span class="hljs-selector-tag">actions</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">RSA</span> <span class="hljs-selector-tag">key</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Certify</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span> 
<span class="hljs-selector-tag">Current</span> <span class="hljs-selector-tag">allowed</span> <span class="hljs-selector-tag">actions</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Certify</span> <span class="hljs-selector-tag">Encrypt</span> 

   (S) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">sign</span> <span class="hljs-selector-tag">capability</span>
   (E) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">encrypt</span> <span class="hljs-selector-tag">capability</span>
   (A) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">authenticate</span> <span class="hljs-selector-tag">capability</span>
   (Q) <span class="hljs-selector-tag">Finished</span>

<span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">S</span>
</code></pre><p>Now type E to disable encrypt capabilities for this key</p>
<pre><code><span class="hljs-selector-tag">Possible</span> <span class="hljs-selector-tag">actions</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">RSA</span> <span class="hljs-selector-tag">key</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Certify</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span> 
<span class="hljs-selector-tag">Current</span> <span class="hljs-selector-tag">allowed</span> <span class="hljs-selector-tag">actions</span>: <span class="hljs-selector-tag">Certify</span> <span class="hljs-selector-tag">Encrypt</span> 

   (S) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">sign</span> <span class="hljs-selector-tag">capability</span>
   (E) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">encrypt</span> <span class="hljs-selector-tag">capability</span>
   (A) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">authenticate</span> <span class="hljs-selector-tag">capability</span>
   (Q) <span class="hljs-selector-tag">Finished</span>

<span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">E</span>
</code></pre><p>Now type Q to quit the toggle process and continue</p>
<pre><code><span class="hljs-selector-tag">Possible</span> <span class="hljs-selector-tag">actions</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">RSA</span> <span class="hljs-selector-tag">key</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Certify</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span> 
<span class="hljs-selector-tag">Current</span> <span class="hljs-selector-tag">allowed</span> <span class="hljs-selector-tag">actions</span>: <span class="hljs-selector-tag">Certify</span> 

   (S) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">sign</span> <span class="hljs-selector-tag">capability</span>
   (E) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">encrypt</span> <span class="hljs-selector-tag">capability</span>
   (A) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">authenticate</span> <span class="hljs-selector-tag">capability</span>
   (Q) <span class="hljs-selector-tag">Finished</span>

<span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">Q</span>
</code></pre><p>Enter the desired key size for your master key</p>
<pre><code><span class="hljs-attribute">RSA</span> keys may be between <span class="hljs-number">1024</span> and <span class="hljs-number">4096</span> bits long.
<span class="hljs-attribute">What</span> keysize do you want? (<span class="hljs-number">3072</span>) <span class="hljs-number">4096</span>
<span class="hljs-attribute">Requested</span> keysize is <span class="hljs-number">4096</span> bits
</code></pre><p>Set the expiration for your master key</p>
<pre><code>Please specify how long the key should be valid.
         0 <span class="hljs-operator">=</span> key does not expire
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>  <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">days</span>
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>w <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">weeks</span>
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>m <span class="hljs-operator">=</span> key expires in n months
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>y <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">years</span>
Key <span class="hljs-keyword">is</span> valid <span class="hljs-keyword">for</span>? (<span class="hljs-number">0</span>) 1y
Key expires at Fri Jun <span class="hljs-number">24</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">15</span> <span class="hljs-number">2022</span> IST
Is <span class="hljs-built_in">this</span> correct? (y<span class="hljs-operator">/</span>N) y
</code></pre><p>Construct your user ID (input your full name and email, leave comment empty). Type O to complete</p>
<pre><code>GnuPG needs to construct a user ID to identify your key.

Real name: Amrith Vengalath
Email <span class="hljs-keyword">address</span>: blog@vengalath.com
Comment: 
You selected <span class="hljs-built_in">this</span> USER<span class="hljs-operator">-</span>ID:
    <span class="hljs-string">"Amrith Vengalath &lt;blog@vengalath.com&gt;"</span>

Change (N)ame, (C)omment, (E)mail or (O)kay<span class="hljs-operator">/</span>(Q)uit?
</code></pre><p>Enter a passphrase for your master key</p>
<pre><code class="lang-┌──────────────────────────────────────────────────────┐">  │ Please enter the passphrase to                       │
  │ protect your new key                                 │
  │                                                      │
  │ Passphrase: ________________________________________ │
  │                                                      │
  │       &lt;OK&gt;                              &lt;Cancel&gt;     │
  └──────────────────────────────────────────────────────┘
</code></pre>
<p>If you did the above steps correctly you should have the following result</p>
<pre><code>We need to generate a lot of random <span class="hljs-built_in">bytes</span>. It <span class="hljs-keyword">is</span> a good idea to perform
some other action (<span class="hljs-keyword">type</span> on the keyboard, move the mouse, utilize the
disks) during the prime generation; <span class="hljs-built_in">this</span> gives the random number
generator a better chance to gain enough entropy.
gpg: <span class="hljs-operator">/</span>Users<span class="hljs-operator">/</span>amrith<span class="hljs-operator">/</span>.gnupg/trustdb.gpg: trustdb created
gpg: key ED15BADA58E13002 marked <span class="hljs-keyword">as</span> ultimately trusted
gpg: directory <span class="hljs-string">'/Users/amrith/.gnupg/openpgp-revocs.d'</span> created
gpg: revocation certificate stored <span class="hljs-keyword">as</span> <span class="hljs-string">'/Users/amrith/.gnupg/openpgp-revocs.d/C1B6013E0F6B140F876C4AE5ED15BADA58E13002.rev'</span>
<span class="hljs-keyword">public</span> and secret key created and signed.

pub   rsa4096 <span class="hljs-number">2021</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span> [C] [expires: <span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>]
      C1B6013E0F6B140F876C4AE5ED15BADA58E13002
uid                      Amrith Vengalath <span class="hljs-operator">&lt;</span>blog@vengalath.com&gt;
</code></pre><p>Store the revocation certificate (created by GPG) for your master key on a physical device.</p>
<h2 id="heading-generate-sign-encrypt-and-authentication-sub-keys">Generate Sign, Encrypt and Authentication sub-keys</h2>
<p>You may create 3 sub keys. one to sign (S) another for encryption (E) and one for Authentication</p>
<p>Run this command to edit your key</p>
<pre><code><span class="hljs-attribute">amrith</span>@V ~ % gpg --expert --edit-key Amrith
<span class="hljs-attribute">gpg</span> (GnuPG/MacGPG<span class="hljs-number">2</span>) <span class="hljs-number">2</span>.<span class="hljs-number">2</span>.<span class="hljs-number">27</span>; Copyright (C) <span class="hljs-number">2021</span> Free Software Foundation, Inc.
<span class="hljs-attribute">This</span> is free software: you are free to change and redistribute it.
<span class="hljs-attribute">There</span> is NO WARRANTY, to the extent permitted by law.

<span class="hljs-attribute">Secret</span> key is available.

<span class="hljs-attribute">gpg</span>: checking the trustdb
<span class="hljs-attribute">gpg</span>: marginals needed: <span class="hljs-number">3</span>  completes needed: <span class="hljs-number">1</span>  trust model: pgp
<span class="hljs-attribute">gpg</span>: depth: <span class="hljs-number">0</span>  valid:   <span class="hljs-number">1</span>  signed:   <span class="hljs-number">0</span>  trust: <span class="hljs-number">0</span>-, <span class="hljs-number">0</span>q, <span class="hljs-number">0</span>n, <span class="hljs-number">0</span>m, <span class="hljs-number">0</span>f, <span class="hljs-number">1</span>u
<span class="hljs-attribute">gpg</span>: next trustdb check due at <span class="hljs-number">2022</span>-<span class="hljs-number">06</span>-<span class="hljs-number">24</span>
<span class="hljs-attribute">sec</span>  rsa<span class="hljs-number">4096</span>/ED<span class="hljs-number">15</span>BADA<span class="hljs-number">58</span>E<span class="hljs-number">13002</span>
     <span class="hljs-attribute">created</span>: <span class="hljs-number">2021</span>-<span class="hljs-number">06</span>-<span class="hljs-number">24</span>  expires: <span class="hljs-number">2022</span>-<span class="hljs-number">06</span>-<span class="hljs-number">24</span>  usage: C   
     <span class="hljs-attribute">trust</span>: ultimate      validity: ultimate<span class="hljs-meta">
[ultimate] (1). Amrith Vengalath &lt;blog@vengalath.com&gt;</span>
</code></pre><p>In the gpg console prompt specify that you want to add a new key for that master key:</p>
<pre><code>gpg<span class="hljs-operator">&gt;</span> addkey
</code></pre><p>Select the set your own capabilities creation process (type 8)</p>
<pre><code><span class="hljs-selector-tag">Please</span> <span class="hljs-selector-tag">select</span> <span class="hljs-selector-tag">what</span> <span class="hljs-selector-tag">kind</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">want</span>:
   (<span class="hljs-number">3</span>) <span class="hljs-selector-tag">DSA</span> (sign only)
   (<span class="hljs-number">4</span>) <span class="hljs-selector-tag">RSA</span> (sign only)
   (<span class="hljs-number">5</span>) <span class="hljs-selector-tag">Elgamal</span> (encrypt only)
   (<span class="hljs-number">6</span>) <span class="hljs-selector-tag">RSA</span> (encrypt only)
   (<span class="hljs-number">7</span>) <span class="hljs-selector-tag">DSA</span> (set your own capabilities)
   (<span class="hljs-number">8</span>) <span class="hljs-selector-tag">RSA</span> (set your own capabilities)
  (<span class="hljs-number">10</span>) <span class="hljs-selector-tag">ECC</span> (sign only)
  (<span class="hljs-number">11</span>) <span class="hljs-selector-tag">ECC</span> (set your own capabilities)
  (<span class="hljs-number">12</span>) <span class="hljs-selector-tag">ECC</span> (encrypt only)
  (<span class="hljs-number">13</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span>
  (<span class="hljs-number">14</span>) <span class="hljs-selector-tag">Existing</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">card</span>
<span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">8</span>
</code></pre><p>Add Authenticate capabilities (type A). Sign and Encrypt capabilities are already enabled by default or you may type E to turn off encryption and then create signing and Authenticate keys separately repeating the add key command</p>
<pre><code><span class="hljs-selector-tag">Possible</span> <span class="hljs-selector-tag">actions</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">RSA</span> <span class="hljs-selector-tag">key</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span>
  <span class="hljs-selector-tag">Current</span> <span class="hljs-selector-tag">allowed</span> <span class="hljs-selector-tag">actions</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Encrypt</span>

  (S) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">sign</span> <span class="hljs-selector-tag">capability</span>
  (E) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">encrypt</span> <span class="hljs-selector-tag">capability</span>
  (A) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">authenticate</span> <span class="hljs-selector-tag">capability</span>
  (Q) <span class="hljs-selector-tag">Finished</span>

  <span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">A</span>
</code></pre><p>Type Q to continue the process</p>
<pre><code><span class="hljs-selector-tag">Possible</span> <span class="hljs-selector-tag">actions</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">RSA</span> <span class="hljs-selector-tag">key</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span>
  <span class="hljs-selector-tag">Current</span> <span class="hljs-selector-tag">allowed</span> <span class="hljs-selector-tag">actions</span>: <span class="hljs-selector-tag">Sign</span> <span class="hljs-selector-tag">Encrypt</span> <span class="hljs-selector-tag">Authenticate</span>

  (S) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">sign</span> <span class="hljs-selector-tag">capability</span>
  (E) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">encrypt</span> <span class="hljs-selector-tag">capability</span>
  (A) <span class="hljs-selector-tag">Toggle</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">authenticate</span> <span class="hljs-selector-tag">capability</span>
  (Q) <span class="hljs-selector-tag">Finished</span>

  <span class="hljs-selector-tag">Your</span> <span class="hljs-selector-tag">selection</span>? <span class="hljs-selector-tag">Q</span>
</code></pre><p>Input the desired key size for the subkey</p>
<pre><code><span class="hljs-attribute">RSA</span> keys may be between <span class="hljs-number">1024</span> and <span class="hljs-number">4096</span> bits long.
<span class="hljs-attribute">What</span> keysize do you want? (<span class="hljs-number">3072</span>) <span class="hljs-number">4096</span>
<span class="hljs-attribute">Requested</span> keysize is <span class="hljs-number">4096</span> bits
</code></pre><p>Setup the expiration for the subkey</p>
<pre><code>Please specify how long the key should be valid.
         0 <span class="hljs-operator">=</span> key does not expire
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>  <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">days</span>
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>w <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">weeks</span>
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>m <span class="hljs-operator">=</span> key expires in n months
      <span class="hljs-operator">&lt;</span>n<span class="hljs-operator">&gt;</span>y <span class="hljs-operator">=</span> key expires in n <span class="hljs-literal">years</span>
Key <span class="hljs-keyword">is</span> valid <span class="hljs-keyword">for</span>? (<span class="hljs-number">0</span>) 1y
Key expires at Fri Jun <span class="hljs-number">24</span> <span class="hljs-number">14</span>:<span class="hljs-number">17</span>:<span class="hljs-number">16</span> <span class="hljs-number">2022</span> IST
Is <span class="hljs-built_in">this</span> correct? (y<span class="hljs-operator">/</span>N) y
Really create? (y<span class="hljs-operator">/</span>N) y
</code></pre><p>Input the passphrase for the master key (the one you setup in the master key generation process). You should get this result</p>
<pre><code>We need to generate a lot of random <span class="hljs-built_in">bytes</span>. It <span class="hljs-keyword">is</span> a good idea to perform
some other action (<span class="hljs-keyword">type</span> on the keyboard, move the mouse, utilize the
disks) during the prime generation; <span class="hljs-built_in">this</span> gives the random number
generator a better chance to gain enough entropy.


sec  rsa4096<span class="hljs-operator">/</span>ED15BADA58E13002
     created: <span class="hljs-number">2021</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>  expires: <span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>  usage: C   
     trust: ultimate      validity: ultimate
ssb  rsa4096<span class="hljs-operator">/</span>99067D8DFE5EF249
     created: <span class="hljs-number">2021</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>  expires: <span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>  usage: SEA 
[ultimate] (<span class="hljs-number">1</span>). Amrith Vengalath <span class="hljs-operator">&lt;</span>blog@vengalath.com&gt;
</code></pre><p>Save and exit</p>
<pre><code>gpg<span class="hljs-operator">&gt;</span> save
</code></pre><p>Now if you list your keys you will see also a subkey (sub) with SEA capabilities (Sign – Encrypt – Authenticate). You may use different sub-keys for Signing, Encrypt and Authentication. You can only use one Encryption key.</p>
<pre><code>amrith@V <span class="hljs-operator">~</span> <span class="hljs-operator">%</span> gpg <span class="hljs-operator">-</span><span class="hljs-operator">-</span>list<span class="hljs-operator">-</span>keys
<span class="hljs-operator">/</span>Users<span class="hljs-operator">/</span>amrith<span class="hljs-operator">/</span>.gnupg/pubring.kbx
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
pub   rsa4096 <span class="hljs-number">2021</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span> [C] [expires: <span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>]
      C1B6013E0F6B140F876C4AE5ED15BADA58E13002
uid           [ultimate] Amrith Vengalath <span class="hljs-operator">&lt;</span>blog@vengalath.com&gt;
sub   rsa4096 <span class="hljs-number">2021</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span> [SEA] [expires: <span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-number">-24</span>]
</code></pre>]]></content:encoded></item><item><title><![CDATA[A Google quiz that helps you spot email phishing scams better.]]></title><description><![CDATA[Many people fall for those bogus emails which range from attractive shopping offers to fake emails telling you to secure your online accounts. Identifying a phishing email might not be easy as you think. You may only realise that you clicked a malici...]]></description><link>https://dev.vengalath.com/a-google-quiz-that-helps-you-spot-email-phishing-scams-better</link><guid isPermaLink="true">https://dev.vengalath.com/a-google-quiz-that-helps-you-spot-email-phishing-scams-better</guid><dc:creator><![CDATA[Amrith Vengalath]]></dc:creator><pubDate>Tue, 22 Jun 2021 19:32:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1647977355139/3l7sBz38d.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many people fall for those bogus emails which range from attractive shopping offers to fake emails telling you to secure your online accounts. Identifying a phishing email might not be easy as you think. You may only realise that you clicked a malicious link after it’s done.</p>
<h2 id="heading-so-what-is-a-phishing-email">So what is a Phishing email?</h2>
<p>A phishing email is a mail sent by an attacker to his victim to make them click on a link and make them enter their sensitive information or download malware. Most of the emails we receive are in HTML. So we can’t say that the link displayed on our screen is the one you are gonna visit as in the example below.</p>
<p><img src="https://blog.vengalath.com/wp-content/uploads/2021/06/Screenshot-2021-06-24-at-1.27.35-AM.png" alt="Screenshot-2021-06-24-at-1.27.35-AM.webp" /></p>
<p>Here the link shown to us is google.com but the actual link is malicious-site.com. You get to know how to spot most of the phishing emails by taking this quiz from google</p>
<p><a target="_blank" href="https://phishingquiz.withgoogle.com">Take the Quiz</a></p>
]]></content:encoded></item></channel></rss>