<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-andesco-otpauth-uri-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="otpauth-uri">The otpauth URI Scheme: One-Time Password (OTP) Credential Provisioning</title>
    <seriesInfo name="Internet-Draft" value="draft-andesco-otpauth-uri-01"/>
    <author fullname="Andrew Escobar">
      <organization>independent</organization>
      <address>
        <postal>
          <country>Canada</country>
        </postal>
        <email>ietf@andrewe.dev</email>
      </address>
    </author>
    <date year="2026" month="October" day="30"/>
    <keyword>otpauth</keyword>
    <keyword>hotp</keyword>
    <keyword>totp</keyword>
    <abstract>
      <?line 56?>

<t>This document defines syntax and processing rules for the <tt>otpauth:</tt> URI
scheme used to provision one-time-password (OTP) credentials (verification
codes) for HOTP and TOTP.</t>
      <t>This document defines a common baseline for interoperability, including issuer
handling rules that improve account matching while maintaining compatibility
with existing deployments. It does not preclude future extensions for other OTP
methods.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/andesco/otpauth-uri"/>.</t>
    </note>
  </front>
  <middle>
    <?line 67?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The <tt>otpauth:</tt> URI scheme is used to transfer OTP configuration, including a shared secret and related parameters, into OTP clients. The scheme is currently registered with IANA as a provisional URI scheme <xref target="URI-SCHEMES"/>.</t>
      <t>Current ecosystem behavior is primarily described by vendor documentation, including Google's <tt>otpauth</tt> key URI format <xref target="GOOGLE-KEYURI"/> and Apple's verification code guidance <xref target="APPLE-VERIFICATION-CODES"/>. Those documents are largely aligned, but differ on semantics for issuer information.</t>
      <t>This document defines interoperable behavior for URI producers and consumers for
HOTP and TOTP, with emphasis on reliable account association in modern password
managers. This document does not preclude future extensions for other OTP
methods.</t>
      <t>An earlier individual Internet-Draft, <xref target="I-D.linuxgemini-otpauth-uri"/>, also
proposes standardizing the <tt>otpauth:</tt> URI scheme. The two documents differ
mainly in these ways:</t>
      <ul spacing="normal">
        <li>
          <t>This document defines normative processing rules for producers and consumers,
including conditions under which a consumer must reject a URI. The earlier
draft describes the syntax without such rules.</t>
        </li>
        <li>
          <t>This document permits the legacy issuer label prefix for compatibility and
makes the <tt>issuer</tt> parameter authoritative for account matching. The earlier
draft instead recommends carrying the issuer only as a separate parameter.</t>
        </li>
        <li>
          <t>This document sets a minimum consumer baseline (SHA1 and 6 digits) and treats
other values as SHOULD. The earlier draft calls for support of all of its
optional parameters in all cases.</t>
        </li>
        <li>
          <t>This document constrains the <tt>label</tt> and <tt>secret</tt> grammar using <xref target="RFC3986"/>
productions.</t>
        </li>
        <li>
          <t>This document adds Security and Privacy Considerations for the shared secret.</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
<?line -6?>
      </t>
      <t>This specification uses the Augmented Backus-Naur Form (ABNF) notation defined in <xref target="RFC5234"/>.</t>
      <t>This specification uses the OTP concepts from <xref target="RFC4226"/> and <xref target="RFC6238"/>. In this document, <tt>secret</tt>, <tt>issuer</tt>, and <tt>account</tt> identify credential attributes associated with HOTP and TOTP methods.</t>
      <t>The term URI is imported from <xref target="RFC3986"/>. Mentions of "query string" in this document refer to the URI query component defined in Section 3.4 of <xref target="RFC3986"/>.</t>
      <t>The Base16, Base32, and Base64 data encodings referenced in this document are from <xref target="RFC4648"/>.</t>
      <t>The terms "producer" and "consumer" are used throughout:</t>
      <ul spacing="normal">
        <li>
          <t>A producer creates an <tt>otpauth:</tt> URI.</t>
        </li>
        <li>
          <t>A consumer parses and imports an <tt>otpauth:</tt> URI.</t>
        </li>
      </ul>
    </section>
    <section anchor="uri-format">
      <name>URI Format</name>
      <t>An <tt>otpauth:</tt> URI uses this general form:</t>
      <artwork><![CDATA[
otpauth://<type>/<label>?<parameters>
]]></artwork>
      <t>where <tt>&lt;type&gt;</tt> identifies the OTP algorithm family and <tt>&lt;parameters&gt;</tt> contains URL query parameters.</t>
      <section anchor="syntax">
        <name>Syntax</name>
        <t>The syntax is defined using ABNF from <xref target="RFC5234"/> and URI productions from <xref target="RFC3986"/>.</t>
        <sourcecode type="abnf"><![CDATA[
uri = "otpauth://" otp-type "/" label "?" parameter
      *( "&" parameter )

otp-type = "totp" / "hotp"

label = account / issuer-label ( ":" / "%3A" ) *"%20" account

issuer-label = 1*( unreserved / pct-encoded / sub-delims / "@" )
account      = 1*( unreserved / pct-encoded / sub-delims / "@" )

parameter = secret / algorithm / digits / counter
            / period / issuer / extension

secret    = "secret=" 1*( %x41-5A / %x32-37 ) ; Base32 A-Z2-7
algorithm = "algorithm=" ( "SHA1" / "SHA256" / "SHA512" )
digits    = "digits=" ( "6" / "7" / "8" )
counter   = "counter=" 1*DIGIT ; 0 to 2^64 - 1
period    = "period=" 1*DIGIT ; greater than zero
issuer    = "issuer=" *pchar ; domain name recommended
extension = 1*( ALPHA / DIGIT / "-" / "_" ) "=" *pchar
]]></sourcecode>
        <t>Per <xref target="RFC5234"/>, quoted ABNF literals are case-insensitive. Therefore, <tt>otpauth</tt>, <tt>totp</tt>, and <tt>hotp</tt> are matched case-insensitively by this grammar. Producers SHOULD emit lowercase forms for consistency. The same case-insensitive matching applies to quoted parameter names and quoted enumerated values in this ABNF.</t>
        <t>This ABNF names commonly used parameters explicitly and allows extension parameters. Parameter requirements are defined in the following section. Parameter values MUST percent-encode literal <tt>&amp;</tt> characters as <tt>%26</tt>.</t>
        <t>A consumer MUST parse <tt>label</tt> before decoding as follows:</t>
        <ul spacing="normal">
          <li>
            <t>If <tt>label</tt> contains a separator, split the raw string at the first separator, where separator is either literal <tt>:</tt> or percent-encoded <tt>%3A</tt> (case-insensitive).</t>
          </li>
          <li>
            <t>If <tt>label</tt> does not contain a separator, treat the entire <tt>label</tt> as <tt>account</tt>.</t>
          </li>
          <li>
            <t>Percent-decode each parsed component using standard URI decoding rules from <xref target="RFC3986"/>.</t>
          </li>
          <li>
            <t>If decoded <tt>issuer-label</tt> or decoded <tt>account</tt> contains a colon, the consumer MUST reject the URI.</t>
          </li>
        </ul>
      </section>
      <section anchor="otp-type">
        <name>otp-type</name>
        <t><tt>otp-type</tt> identifies the OTP method and MUST be either <tt>totp</tt> or <tt>hotp</tt>. A consumer MUST reject a URI with any other <tt>otp-type</tt>.</t>
      </section>
      <section anchor="label">
        <name>label</name>
        <t><tt>label</tt> identifies the account being provisioned:</t>
        <sourcecode type="text"><![CDATA[
<issuer-label>: <account>
]]></sourcecode>
        <t>In this structure:</t>
        <ul spacing="normal">
          <li>
            <t><tt>issuer-label</tt> is optional</t>
          </li>
          <li>
            <t>the separator is either a literal colon (<tt>:</tt>) or <tt>%3A</tt></t>
          </li>
          <li>
            <t>optional spaces before <tt>account</tt> are encoded as <tt>%20</tt></t>
          </li>
          <li>
            <t><tt>issuer-label</tt> and <tt>account</tt> MUST NOT themselves contain a colon</t>
          </li>
        </ul>
        <t>Producers SHOULD percent-encode <tt>label</tt> components using URI encoding rules from <xref target="RFC3986"/>. Valid examples include <tt>alice@example.com</tt>, <tt>Example:alice@example.com</tt>, and <tt>Example%20Issuer%3A%20alice@example.com</tt>.</t>
      </section>
      <section anchor="parameters">
        <name>Parameters</name>
        <t>Parameter order is not significant.</t>
        <t>A producer MUST include exactly one <tt>secret</tt> parameter.</t>
        <t>A consumer MUST reject the URI if <tt>secret</tt> is missing.</t>
        <t>A producer MUST include <tt>counter</tt> if <tt>otp-type</tt> is <tt>hotp</tt>. A producer MAY include <tt>algorithm</tt>, <tt>digits</tt>, and <tt>issuer</tt>, and MAY include <tt>period</tt> if <tt>otp-type</tt> is <tt>totp</tt>. Each known parameter MUST appear at most once.</t>
        <t>A consumer MUST reject the URI if any known parameter appears more than once.</t>
        <t><xref target="param-applicability"/> shows which parameters apply to each <tt>otp-type</tt>.</t>
        <table anchor="param-applicability">
          <name>Parameter applicability by otp-type</name>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">totp</th>
              <th align="left">hotp</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>secret</tt></td>
              <td align="left">REQUIRED</td>
              <td align="left">REQUIRED</td>
            </tr>
            <tr>
              <td align="left">
                <tt>issuer</tt></td>
              <td align="left">RECOMMENDED</td>
              <td align="left">RECOMMENDED</td>
            </tr>
            <tr>
              <td align="left">
                <tt>algorithm</tt></td>
              <td align="left">OPTIONAL</td>
              <td align="left">OPTIONAL</td>
            </tr>
            <tr>
              <td align="left">
                <tt>digits</tt></td>
              <td align="left">OPTIONAL</td>
              <td align="left">OPTIONAL</td>
            </tr>
            <tr>
              <td align="left">
                <tt>period</tt></td>
              <td align="left">OPTIONAL</td>
              <td align="left">NOT USED</td>
            </tr>
            <tr>
              <td align="left">
                <tt>counter</tt></td>
              <td align="left">NOT USED</td>
              <td align="left">REQUIRED</td>
            </tr>
          </tbody>
        </table>
        <t>NOT USED means that a producer SHOULD NOT include the parameter and a consumer MUST ignore it.</t>
        <section anchor="secret">
          <name>secret</name>
          <t>The <tt>secret</tt> parameter carries the shared OTP secret and is mandatory. The value MUST use unpadded Base32 with alphabet <tt>A-Z2-7</tt>, as specified by <xref target="RFC4648"/>. Producers SHOULD emit uppercase Base32 text. Consumers MAY accept lowercase Base32 text for interoperability.</t>
          <t><xref target="RFC4226"/> requires a shared secret of at least 128 bits and recommends 160 bits (Section 4). Producers MUST use a secret that decodes to at least 128 bits and SHOULD use at least 160 bits. A consumer MAY reject a URI whose decoded <tt>secret</tt> is shorter than 128 bits.</t>
        </section>
        <section anchor="issuer">
          <name>issuer</name>
          <t>The <tt>issuer</tt> parameter identifies the relying party that issued the OTP credential.</t>
          <t>A producer SHOULD include <tt>issuer</tt>.</t>
          <t>A producer SHOULD set <tt>issuer</tt> to a stable service identifier that is useful for account matching and credential suggestion. A domain name controlled by the relying party (for example, <tt>example.com</tt>) is RECOMMENDED where available, but non-domain identifiers are allowed.</t>
          <t>A consumer SHOULD use <tt>issuer</tt> as the primary identifier for account matching and credential suggestion.</t>
        </section>
        <section anchor="algorithm">
          <name>algorithm</name>
          <t><tt>algorithm</tt> is OPTIONAL. If absent, the default is <tt>SHA1</tt>.</t>
          <t>Valid <tt>algorithm</tt> values are <tt>SHA1</tt>, <tt>SHA256</tt>, and <tt>SHA512</tt>. Producers SHOULD use one of these values.</t>
          <ul spacing="normal">
            <li>
              <t>Consumers MUST support <tt>SHA1</tt>.</t>
            </li>
            <li>
              <t>Consumers SHOULD support <tt>SHA256</tt> and <tt>SHA512</tt>.</t>
            </li>
          </ul>
          <t><xref target="RFC4226"/> defines HOTP with HMAC-SHA-1 only, and <xref target="RFC6238"/> adds HMAC-SHA-256 and HMAC-SHA-512 for TOTP. This document also permits <tt>SHA256</tt> and <tt>SHA512</tt> with <tt>hotp</tt>, applying the same HMAC substitution, because some consumers support it. Some consumers ignore this parameter and always use <tt>SHA1</tt>; such a consumer generates codes that do not match the producer's. A producer SHOULD use <tt>SHA1</tt> with <tt>hotp</tt> unless it knows the consumer supports other values.</t>
          <t>If a consumer receives an unsupported <tt>algorithm</tt> value, it SHOULD reject the URI.</t>
        </section>
        <section anchor="digits">
          <name>digits</name>
          <t><tt>digits</tt> is OPTIONAL. If absent, the default is <tt>6</tt>. Valid <tt>digits</tt> values are <tt>6</tt>, <tt>7</tt>, and <tt>8</tt>.</t>
          <ul spacing="normal">
            <li>
              <t>Producers SHOULD use <tt>6</tt> or <tt>8</tt>.</t>
            </li>
            <li>
              <t>Consumers MUST support <tt>6</tt>.</t>
            </li>
            <li>
              <t>Consumers SHOULD support <tt>8</tt>.</t>
            </li>
            <li>
              <t>Consumers MAY support <tt>7</tt>.</t>
            </li>
          </ul>
          <t><xref target="RFC4226"/> permits 7-digit codes, but <xref target="GOOGLE-KEYURI"/> lists only 6 and 8, so producers are advised to avoid 7.</t>
          <t>If a consumer receives an unsupported <tt>digits</tt> value, it SHOULD reject the URI.</t>
        </section>
        <section anchor="period">
          <name>period</name>
          <t><tt>period</tt> is OPTIONAL for <tt>totp</tt>. It is the time step, in seconds, defined in <xref target="RFC6238"/>. The value MUST be a decimal integer greater than zero. If absent, the default is <tt>30</tt>. A consumer MUST reject the URI if <tt>period</tt> is not a decimal integer greater than zero.</t>
          <t>The start of time counting (T0 in <xref target="RFC6238"/>) is the Unix epoch, and time is measured in UTC. This document defines no parameter to change it.</t>
          <t><tt>period</tt> is NOT USED for <tt>hotp</tt>.</t>
        </section>
        <section anchor="counter">
          <name>counter</name>
          <t><tt>counter</tt> is REQUIRED for <tt>hotp</tt>. It is the initial counter value, the value the consumer uses to generate the first code. The value MUST be a decimal integer from 0 to 18446744073709551615 (2^64 - 1) inclusive. A consumer MUST reject an <tt>hotp</tt> URI if <tt>counter</tt> is missing or is not a decimal integer in this range.</t>
          <t>After provisioning, the consumer maintains and increments the counter. A URI carries only the initial value and does not track later state.</t>
          <t><tt>counter</tt> is NOT USED for <tt>totp</tt>.</t>
          <t>These parameters map to HOTP and TOTP behavior defined in <xref target="RFC4226"/> and <xref target="RFC6238"/>, while allowing extension values where explicitly noted.</t>
        </section>
        <section anchor="additional-parameters">
          <name>Additional Parameters</name>
          <t>Producers MAY include additional parameters that are not defined by this document.</t>
          <t>Consumers SHOULD ignore unrecognized parameters unless local policy requires rejecting them.</t>
        </section>
      </section>
    </section>
    <section anchor="issuer-label-prefix-and-issuer-parameter">
      <name>Issuer Label Prefix and Issuer Parameter</name>
      <t>In this document:</t>
      <ul spacing="normal">
        <li>
          <t>The issuer label prefix (<tt>issuer-label</tt>) is presentation-oriented text for display.</t>
        </li>
        <li>
          <t>The issuer parameter (<tt>issuer</tt>) is the canonical identifier for account matching.</t>
        </li>
      </ul>
      <t>A producer MAY include an issuer label prefix for backward compatibility.</t>
      <t>A producer that includes both values SHOULD use a human-readable service name for the issuer label prefix and a stable matching identifier for the issuer parameter.</t>
      <t>If both issuer label prefix and issuer parameter are present:</t>
      <ul spacing="normal">
        <li>
          <t>A consumer MUST NOT reject the URI only because the two values differ.</t>
        </li>
        <li>
          <t>A consumer SHOULD treat the issuer parameter as authoritative for account matching.</t>
        </li>
        <li>
          <t>A consumer MAY use issuer label prefix for display.</t>
        </li>
      </ul>
      <t>A consumer MUST continue to accept URIs where issuer label prefix and issuer parameter are equal, as this remains common in deployed systems <xref target="GOOGLE-KEYURI"/>.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>The following are valid <tt>otpauth:</tt> URIs (where <tt>PB4XU</tt> is the unpadded Base32 encoding of <tt>xyz</tt>):</t>
      <artwork><![CDATA[
otpauth://totp/Example?secret=PB4XU&issuer=example.com
]]></artwork>
      <artwork><![CDATA[
otpauth://totp/Example%3Aalice?secret=PB4XU&issuer=example.com
]]></artwork>
      <artwork><![CDATA[
otpauth://hotp/Example?secret=PB4XU&counter=42&issuer=example.com
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This URI format does not in itself pose a security threat. However, the <tt>secret</tt> parameter carries a bearer credential. Disclosure of <tt>secret</tt> enables OTP generation and can lead to account compromise.</t>
      <t>Producers and consumers:</t>
      <ul spacing="normal">
        <li>
          <t>SHOULD treat <tt>otpauth:</tt> URIs as sensitive secrets.</t>
        </li>
        <li>
          <t>SHOULD avoid writing full URIs to logs, analytics, and crash reports.</t>
        </li>
        <li>
          <t>SHOULD transport provisioning data only over authenticated and encrypted channels.</t>
        </li>
      </ul>
      <t>Consumers SHOULD display issuer and account information clearly before import so users can detect phishing or provisioning mistakes.</t>
      <t>For <tt>hotp</tt>, the <tt>counter</tt> in a URI is only the initial value. A consumer that imports a previously issued URI again after generating codes would reset its counter, which can repeat codes already used or put it out of step with the verifier. A consumer SHOULD NOT silently replace the counter of an existing credential with the value from a newly imported URI.</t>
      <t>For <tt>totp</tt>, a code is valid only if the consumer's clock and the verifier's clock agree closely enough. Clock synchronization is outside the scope of this document.</t>
      <t>Verifier behavior, such as HOTP counter resynchronization and TOTP acceptance windows, is also outside the scope of this document; see <xref target="RFC4226"/> and <xref target="RFC6238"/>.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t><tt>otpauth:</tt> URIs may reveal account identifiers and service associations through label and issuer fields.</t>
      <t>Applications handling these URIs SHOULD minimize retention and SHOULD avoid sharing raw URI values across process boundaries unless necessary for explicit user action.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>The <tt>otpauth:</tt> URI scheme is registered as provisional in the IANA URI Schemes registry <xref target="URI-SCHEMES"/>.</t>
      <t>Upon publication of this document as an RFC, IANA is requested to update the reference for the existing <tt>otpauth</tt> provisional registration to point to this RFC.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4226">
          <front>
            <title>HOTP: An HMAC-Based One-Time Password Algorithm</title>
            <author fullname="D. M'Raihi" initials="D." surname="M'Raihi"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="F. Hoornaert" initials="F." surname="Hoornaert"/>
            <author fullname="D. Naccache" initials="D." surname="Naccache"/>
            <author fullname="O. Ranen" initials="O." surname="Ranen"/>
            <date month="December" year="2005"/>
            <abstract>
              <t>This document describes an algorithm to generate one-time password values, based on Hashed Message Authentication Code (HMAC). A security analysis of the algorithm is presented, and important parameters related to the secure deployment of the algorithm are discussed. The proposed algorithm can be used across a wide range of network applications ranging from remote Virtual Private Network (VPN) access, Wi-Fi network logon to transaction-oriented Web applications.</t>
              <t>This work is a joint effort by the OATH (Open AuTHentication) membership to specify an algorithm that can be freely distributed to the technical community. The authors believe that a common and shared algorithm will facilitate adoption of two-factor authentication on the Internet by enabling interoperability across commercial and open-source implementations. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4226"/>
          <seriesInfo name="DOI" value="10.17487/RFC4226"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC6238">
          <front>
            <title>TOTP: Time-Based One-Time Password Algorithm</title>
            <author fullname="D. M'Raihi" initials="D." surname="M'Raihi"/>
            <author fullname="S. Machani" initials="S." surname="Machani"/>
            <author fullname="M. Pei" initials="M." surname="Pei"/>
            <author fullname="J. Rydell" initials="J." surname="Rydell"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>This document describes an extension of the One-Time Password (OTP) algorithm, namely the HMAC-based One-Time Password (HOTP) algorithm, as defined in RFC 4226, to support the time-based moving factor. The HOTP algorithm specifies an event-based OTP algorithm, where the moving factor is an event counter. The present work bases the moving factor on a time value. A time-based variant of the OTP algorithm provides short-lived OTP values, which are desirable for enhanced security.</t>
              <t>The proposed algorithm can be used across a wide range of network applications, from remote Virtual Private Network (VPN) access and Wi-Fi network logon to transaction-oriented Web applications. The authors believe that a common and shared algorithm will facilitate adoption of two-factor authentication on the Internet by enabling interoperability across commercial and open-source implementations. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6238"/>
          <seriesInfo name="DOI" value="10.17487/RFC6238"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="URI-SCHEMES" target="https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml">
          <front>
            <title>Uniform Resource Identifier (URI) Schemes</title>
            <author>
              <organization>Internet Assigned Numbers Authority</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="GOOGLE-KEYURI" target="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">
          <front>
            <title>Key Uri Format</title>
            <author>
              <organization>Google</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="I-D.linuxgemini-otpauth-uri">
          <front>
            <title>One-Time Password (OTP) Credential Provisioning URI Format: otpauth</title>
            <author fullname="İlteriş Yağıztegin Eroğlu" initials="I. Y." surname="Eroğlu">
              <organization>independent</organization>
            </author>
            <date day="24" month="August" year="2026"/>
            <abstract>
              <t>   This document specify the One-Time Password (OTP) Credential
   Provisioning otpauth URI format, utilized by TOTP (Time-Based One-
   Time Password Algorithm) and HOTP (An HMAC-Based One-Time Password
   Algorithm) based authenticators.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-linuxgemini-otpauth-uri-03"/>
        </reference>
        <reference anchor="APPLE-VERIFICATION-CODES" target="https://developer.apple.com/documentation/authenticationservices/securing-logins-with-icloud-keychain-verification-codes">
          <front>
            <title>Securing Logins with iCloud Keychain Verification Codes</title>
            <author>
              <organization>Apple</organization>
            </author>
            <date/>
          </front>
        </reference>
      </references>
    </references>
    <?line 344?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author thanks the maintainers and implementers of authenticator applications and password managers, including the teams at Apple and Google whose documentation helped shape existing interoperable behavior.</t>
      <t>The author also thanks İlteriş Eroğlu, author of <xref target="I-D.linuxgemini-otpauth-uri"/>, for earlier work bringing the <tt>otpauth:</tt> URI scheme to the IETF.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
