<?xml version="1.0" encoding="utf-8"?>
<?xml-model href="rfc7991bis.rnc"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!DOCTYPE rfc [
<!ENTITY nbsp "&#160;">
<!ENTITY zwsp "&#8203;">
<!ENTITY nbhy "&#8209;">
<!ENTITY wj "&#8288;">
]>
<rfc category="info" docName="draft-corbel-updates-to-rfc2289-00"
     ipr="trust200902" obsoletes="" submissionType="IETF" updates="2289"
     version="3" xml:lang="en" xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:xi="http://www.w3.org/2001/XInclude"
     xmlns:svg="http://www.w3.org/2000/svg">

  <front>

    <title abbrev="Updates to RFC2289">Updates to the One-Time Password (OTP) System defined by RFC 2289</title>
    <seriesInfo name="Internet-Draft" value="draft-corbel-updates-to-rfc2289-00"/>
    <author fullname="R. Corbel" initials="R." surname="Corbel">
      <organization>Orange S.A.</organization>
      <address>
        <postal>
          <street>2 avenue Pierre Marzin</street>
          <city>Lannion</city>
          <code>22300</code>
          <country>FR</country>
        </postal>
        <email>regis.corbel@orange.com</email>
        <uri>http://www.orange.com</uri>
      </address>
    </author>

    <date day="8" month="9" year="2026"/>
    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>OTP One-time password</keyword>

    <abstract>
      <t>This document aims to submit a few updates to RFC 2289
        <xref target="RFC2289"/>, which describes a One-Time Password (OTP)
        System: an application programming interface to the new Secure Hash
        Algorithms (SHA256, SHA384, and SHA512), an algorithm for folding
        hashes to 64 bits, using alternate dictionaries, and automatic
        renewal of authentication parameters will be described.</t>
    </abstract>

  </front>

  <middle>

    <section>
      <name>Introduction</name>
      <t>When <xref target="RFC2289"/> was published in 1998, and became a
        Standards Track specification in 2000, it described a powerful
        One-Time Password system. Many things have changed since that time,
        notably the way hashes are computed: one distinct interface for each
        hash algorithm yesterday, only one today. We describe here that unique
        interface. As a consequence, folding hashes to 64 bits (the length of
        an OTP) requires a different technique, which is also described.
        Finally, we suggest a technique for automatically renewing
        authentication parameters between a user and an OTP authentication
        server. Understanding <xref target="RFC2289"/> is a requirement.</t>

      <section anchor="requirements">
        <name>Requirements Language</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="BCP14"/> when, and only when, they appear in all
        capitals, as shown here.</t>
      </section>
    </section>

    <section>
      <name>Interfaces to Secure Hash Algorithms</name>
      <t>In 1998, only three secure hash algorithms were commonly used: MD4
      <xref target="RFC1320"/>, MD5 <xref target="RFC1321"/>, and SHA1
      <xref target="NIST"/>. As the security of those algorithms became
      insufficient, three new secure hash algorithms appeared: SHA256, SHA384,
      and SHA512 <xref target="RFC6234"/>. MD4 is not used anymore. A common
      interface has been defined by OpenSSL <xref target="OSSL"/> for those
      five hash algorithms, in C <xref target="CLANG"/>:</t>
        <sourcecode type="c">
          <![CDATA[
EVP_MD_CTX * mdctx;
unsigned int dlen;
const EVP_MD * md;
unsigned char digest[EVP_MAX_MD_SIZE+1];

/* algo is a string naming the desired hash. Case insensitive. Name
is one of "md5", "sha1", "sha256", "sha384", and "sha512". */
md = EVP_get_digestbyname(algo);
mdctx = EVP_MD_CTX_new(); 

/* Compute the hash. */
memset(digest, 0, sizeof digest);
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, data, sizeof(data));
EVP_DigestFinal_ex(mdctx, digest, &dlen);

/* Free the memory used by the context. */
EVP_MD_CTX_free(mdctx);
          ]]>
        </sourcecode>
    </section>

    <section>
      <name>Folding hashes to 64 bits</name>
      <t>The lengths of the hashes produced by MD5, SHA1, SHA256, SHA384, and
      SHA512 are, respectively, 128, 160, 256, 384, and 512 bits. Since the
      length of an OTP is 64 bits, it is necessary to fold the hashes.</t>

      <t>The technique in C <xref target="CLANG"/> for folding MD5 hashes to
        64 bits is taken as is from <xref target="RFC2289"/> (Appendix A):</t>

        <sourcecode type="c">
          <![CDATA[
/* The MD5 hash */
unsigned char result[16];
/* Fold the 128 bit result to 64 bits */
for (i = 0; i < 8; i++) result[i] ^= result[i+8];
          ]]>
        </sourcecode>

      <t>The technique for folding SHA hashes to 64 bits is a generalization
      of the one presented in <xref target="RFC2289"/> for SHA1. It is
      designed to be compiled and to run on a 64-bit, Little Endian
      platform. This algorithm is written in C <xref target="CLANG"/>.</t>

        <sourcecode type="c">
           <![CDATA[
/* dlen is the number of BYTES contained in the array pointed
to by d1. d2 is the array that receives the result of the
folding. */
void foldShaTo64(unsigned int dlen, unsigned char * d1,
unsigned char d2[8]) {
  /* Size of the array pointed to by d1 in number of 32-bit
      words. */
  unsigned int dlen32 = dlen / 4;
  /* Typecast digest d1 to an array of 32-bit words. */
  unsigned int ld[dlen32];
  unsigned int * pl = (unsigned int *)d1;
  for (unsigned int i = 0; i < dlen32; i++) {
    ld[i] = *(pl + i);
  }
  /* Actual folding to 64 bits. */
  for (unsigned int i = 2; i < dlen32; i++) {
    ld[i % 2] ^= ld[i];
  }
  /* Store the result as a Big Endian value in the output
  array. */
  int i, j;
  for (i = 0, j = 0; j < 8; i++, j += 4) {
    d2[j+0] = (unsigned char)((ld[i] >> 24) & 0xFF);
    d2[j+1] = (unsigned char)((ld[i] >> 16) & 0xFF);
    d2[j+2] = (unsigned char)((ld[i] >>  8) & 0xFF);
    d2[j+3] = (unsigned char)((ld[i]      ) & 0xFF);
  }
}
        ]]>
        </sourcecode>

        <t>We now have the tools for producing 64-bits OTP from hashes
        computed by any of the five algorithms. Appendix A gives a series of
        inputs and correct outputs to check the behavior of an implementation
        of an OTP generator. <xref target="RFC2289"/> gives such information
        for MD5 and SHA1, while Appendix A here gives the information for the
        same inputs hashed by SHA256, SHA384, and SHA512 hash algorithms.</t>
        <t>The conversion of a 64-bit OTP to a set of six words taken from the
        <xref target="RFC2289"/> Standard Dictionary is based upon the same
        process (compute a 2-bit checksum from the 64-bit OTP, stick those two
        bits at the end of the OTP thus producing a 66-bit value; this value
        is then splitted into six slices of 11 bits that allow to address six
        different words in a 2048-word dictionary).</t>
    </section>

    <section>
      <name>Holes in Alternate Dictionaries</name>
      <t><xref target="RFC2289"/> specifies a 2048 English word dictionary
        (Appendix D) that can be used by OTP generators for converting a raw
        OTP expressed in hexadecimal into a set of six different words taken
        from that dictionary. This feature is designed to ease authentication
        by human users.</t>
      <t><xref target="RFC2289"/> also specifies a way to use Alternate
        Dictionaries, that is dictionaries made of 2048 words taken from a
        language different than English, no word appearing in more than one
        dictionary. As stated in <xref target="RFC2289"/> Appendix B:</t>
      <sourcecode>
        "An alternative dictionary of 2048 words may be created such that
        each word W and position of the word in the dictionary N obey the
        relationship: alg( W ) % 2048 == N where alg is the hash algorithm
        used (e.g. MD4, MD5, SHA1). In addition, no words in the standard
        dictionary may be chosen."
      </sourcecode>
      <t>Let's consider the <xref target="RFC2289"/> Standard Dictionary and
        the Alternate Dictionary defined in this document (Appendix B), made
        of 2048 French words, and let's apply the above algorithm to both
        lists of words, using the five hash algorithms. The results can be
        found in this document (Appendix C below).</t>
      <t>For both lists, the collision rate varies roughly from 35% to 37%.
      This means that on 10 words taken from one of the lists, almost 4 of
      them share at least two equal (alg(W) % 2048) values. Concretely, every
      word W of a n-uplet that share the same (alg(W) % 2048) value will be
      written in the same slot of the 2048-word alternate dictionary, the last
      word of the n-uplet taking over the first ones. Finally, this technique
      leaves (n-1) empty slots or "holes" in the final alternate
      dictionary.</t>
      <t>This MAY lead to a security weakness if an attacker gets to know the
      alternate dictionary computed, as shown above, from an initial list of
      2048 words (none of them appears in the Standard Dictionary). The
      alternate dictionary is reduced by roughly 35% in size, eventually
      easing the task of guessing one or more words that will appear in the
      next OTP.</t>
    </section>

    <section>
      <name>Automatic renewal of authentication parameters</name>
      <t>By design, OTP's cannot be used forever by the same user: when the
      sequence number, decreased at each successful authentication, reaches
      zero, the user can't authenticate anymore. A renewal of the user's
      parameters MUST occur, by providing the server with a new seed, a new
      sequence number, and the first matching OTP resulting from these new
      parameters. A different hash algorithm name MAY also be transmitted to
      the server.</t>
      <t>The renewal MAY be done by hand, but it is much more efficient to use
      an automatic mechanism, that is, that does not require a human hand.
      This would be particularly useful in the field of the Internet of
      Objects (IoT), for example.</t>
      <t>Since the channel between a client and a server is supposed
      unencrypted, the user cannot transmit his new authentication parameters
      in clear text. The user MUST encrypt them, by using an algorithm both
      parties have agreed on when the user's account has been created and
      provisioned in the server. Obviously, the key used to encrypt the new
      authentication parameters cannot be the current OTP.</t>
      <t>So we say that, when the sequence number reaches the value 2, the
      user computes (normally) the OTP matching this sequence number, and
      computes also the following OTP, that is the OTP that matches the
      sequence number 1. That last OTP is then used to encrypt the new
      authentication parameters, which are thansmitted by the user to the
      server along with the OTP for sequence number 2. The new parameters MAY
      be encoded in Base 64 before being transmitted. The user and the server
      can now renew the authentication parameters, thus initiating a new
      authentication cycle.</t>
    </section>

    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>This document does not create a new registry nor does it register any
      values in existing registries, and no IANA action is required.</t>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>This document is entirely about security. Note that the technique
        described above allows the user to update his authent parameters
        anytime, whatever the value of the sequence (superior or equal to 2).
        It is then possible to design the user client program so that it
        requests a renewal of its authentication parameters on a regular basis
        (every hour, every twelve hours,...). The client program can also
        choose a random number between 2 and the current sequence number, and
        require a renewal when the sequence number reaches the random number.
        These techniques would constitute a good protection against race
        attacks, because they prevent an attacker from accumulating data on
        the sequences of OTP's he may see.</t>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1320.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1321.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2289.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml"/>

        <reference anchor="CLANG"
                   target="https://www.iso.org/standard/82075.html">
          <front>
            <title>Information technology - Programming languages - C</title>
            <author>
              <organization>ISO/IEC</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="ISO/IEC" value="9899:2024"/>
        </reference>
        
        <reference anchor="OSSL"
                   target="https://docs.openssl.org/master/man3/">
          <front>
            <title>OpenSSL libraries</title>
            <author>
              <organization>OpenSSL Software Foundation Inc</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.0014.xml"/>

        <reference anchor="NIST"
                   target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>NIST</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
          <seriesInfo name="NIST" value="FIPS 180-4"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
        </reference>

      </references>

    </references>

    <section>
      <name>OTP Verification Examples</name>
      <t>This appendix provides a series of inputs and correct outputs for all
      three of the new OTP cryptographic hashes, specifically SHA256, SHA384,
      and SHA512. This document is intended to be used by developers for
      interoperability checks when creating generators or servers. Output is
      provided in both hexadecimal notation and the six-word encoding with the
      <xref target="RFC2289"/> Standard Dictionary.</t>

      <section>
        <name>SHA256 ENCODINGS</name>
          <sourcecode>
            <![CDATA[
Passphrase      Seed    Cnt Hex                 Six Word Format
========================================================================
This is a test. TeSt     0  6FF2 6FCA 1D41 2482
                                           DATA HANG USER SAP EVE TOM
This is a test. TeSt     1  61A3 30FB 5460 EFE8
                                           BUSY HAY SUP KYLE DO VEND
This is a test. TeSt    99  A759 47C5 CB99 C0FE
                                           KLAN OVAL TURN HERO HUFF FERN
AbCdEfGhIjK     alpha1   0  33B7 C6B4 7704 4BC2
                                           PI MONK LENT TOOT WEB SODA
AbCdEfGhIjK     alpha1   1  9D7B 7E17 5E8D 0112
                                           HUSH SIGN FOWL MOAN RINK GARY
AbCdEfGhIjK     alpha1  99  3CCC F2F5 054F 0E7C
                                           SKY CLAY MOCK CAP TUNA SUB
OTP's are good  correct  0  3ACF A072 7DE5 CAFA
                                           SAW FAIL HUH WILL BOOM FAIR
OTP's are good  correct  1  4013 9EB6 13CA 6C66 
                                           TEN HUNT LEST MAW KING PEP
OTP's are good  correct 99  A194 AD13 0170 DF76
                                           JILL KATE WED APT DEN MILL
            ]]>
          </sourcecode>
      </section>

      <section>
        <name>SHA384 ENCODINGS</name>
          <sourcecode>
            <![CDATA[
Passphrase      Seed    Cnt Hex                 Six Word Format
========================================================================
This is a test. TeSt     0  A25E 045C 7326 E83A
                                           JOEL TROY GIL SWAY DALE IDA
This is a test. TeSt     1  0F19 0252 ACE0 9271
                                           DOE OLIN HATH BLUE BUM ROW
This is a test. TeSt    99  BE65 531C A0CC E0D5
                                           MOOD NAG OHIO TON REEK COOL
AbCdEfGhIjK     alpha1   0  C542 1287 DBD0 6FFA
                                           NONE EAT JOAN MARS BEN WONT
AbCdEfGhIjK     alpha1   1  4A3D 9E8A C1CA DF58
                                           AIRY TOGO JOIN FOAM LICE LEEK
AbCdEfGhIjK     alpha1  99  8012 50DA 1475 F556
                                           FILE HAIR RAT MOB BROW LATE
OTP's are good  correct  0  3111 133B 8359 9CFA
                                           OWL GALA REST BEE HOLT FAIL
OTP's are good  correct  1  1D33 F015 80C0 F50D
                                           IDA ISLE BAD ALP DON FROG
OTP's are good  correct 99  F4D5 13BA 5694 3100
                                           VICE KURD TOUR LEON UP FIND
            ]]>
          </sourcecode>
      </section>

      <section>
        <name>SHA512 ENCODINGS</name>
          <sourcecode>
            <![CDATA[
Passphrase      Seed    Cnt Hex                 Six Word Format
========================================================================
This is a test. TeSt     0  9A33 631B AA8E 1097
                                           HONK HOST OBOE BEAU SOAK ALTO
This is a test. TeSt     1  72B2 58A6 8686 BC04
                                           DIAL HALF MOT DAD COWL ANT
This is a test. TeSt    99  41B5 690A 77B8 C1CC
                                           TOO LAVA TUM TREK GIST SWAN
AbCdEfGhIjK     alpha1   0  40EA E6E7 F6DA 6A1F
                                           TIP BETH MELT TONY KIND DUB
AbCdEfGhIjK     alpha1   1  D53A DF93 1E55 FB53
                                           RUTH SARA SUIT SKI BUFF LAMB
AbCdEfGhIjK     alpha1  99  91DC 3DF2 5AE1 A17F
                                           GWEN SOLD EYED MAGI HER MOVE
OTP's are good  correct  0  0F78 A93E 448A AC9A
                                           DOT NONE AVID GAME LASS ANNE
OTP's are good  correct  1  208A CD3F 2C54 BB0E
                                           JOB BERG AVON BITS ALUM FUNK
OTP's are good  correct 99  16AF FE29 10EC AB94
                                           GEM FIGS GEAR KEY OWNS OUTS
            ]]>
          </sourcecode>
      </section>
    </section>

    <section>
      <name>French Alternate Dictionary</name>

      <t>This dictionary is made up of 2048 French words. None of these words
      appears in the <xref target="RFC2289"/> Standard Dictionary, and none
      of these words are composed solely of A to F letters (thus avoiding
      confusion with hexadecimal numbers). This French dictionary MAY be used
      as an alternate dictionary by a user, although 35% of its words share
      at least two equal (alg(W)%2048) values (see Appendix C below). But,
      once again, this list can be used straightforward as an alternate
      dictionary because, when receiving a set of six words from this list
      computed by the user willing to authenticate, the server just computes
      (alg(W)%2048) for each of the six words. It doesn't care about the
      number of words in the alternate dictionary that generate the same
      (alg(W)%2048) value, nor does it need to know the alternate dictionary
      at all (as stated in <xref target="RFC2289"/>). The syntax of the
      dictionary is that of the C language <xref target="CLANG"/>.</t>

        <sourcecode type="c">
          <![CDATA[
char frdict[2048][5] =   
{ "AAS",   "ADO",   "AGA",   "AGE",   "AGI",   "AIE",   "AIL",   "AIS",
  "AIT",   "ALE",   "ALU",   "AME",   "AMI",   "ANE",   "ANS",   "API",
  "ARA",   "ARS",   "ASA",   "ASE",   "AUX",   "AXA",   "AXE",   "AYS",
  "BAI",   "BAL",   "BAS",   "BAU",   "BEL",   "BER",   "BIC",   "BIO",
  "BIP",   "BIS",   "BLE",   "BOA",   "BOF",   "BOL",   "BOT",   "BOX",
  "BRU",   "BUE",   "CAS",   "CEP",   "CES",   "CET",   "CHU",   "CIF",
  "CIL",   "CIS",   "CLE",   "COB",   "COI",   "COQ",   "COR",   "COU",
  "CRE",   "CRI",   "CRU",   "CUL",   "DAL",   "DAO",   "DAW",   "DER",
  "DEY",   "DIA",   "DIS",   "DIT",   "DIX",   "DOC",   "DOL",   "DOM",
  "DOP",   "DOS",   "DRU",   "DUC",   "DUO",   "DUR",   "DUS",   "DUT",
  "EAU",   "ECO",   "ECU",   "ELU",   "EMU",   "EON",   "EPI",   "ERE",
  "ERG",   "ERS",   "ETA",   "ETE",   "EUE",   "EUH",   "EUS",   "EUT",
  "EUX",   "EXO",   "FAQ",   "FAX",   "FER",   "FEU",   "FEZ",   "FIA",
  "FIC",   "FIE",   "FIL",   "FIS",   "FLA",   "FOB",   "FOC",   "FOI",
  "FOL",   "FOU",   "FOX",   "FUI",   "FUS",   "FUT",   "GAI",   "GAN",
  "GAZ",   "GEO",   "GEX",   "GIS",   "GIT",   "GLU",   "GOI",   "GON",
  "GOS",   "GOY",   "GRE",   "GUE",   "GUI",   "GUR",   "HAI",   "HEP",
  "HEU",   "HIA",   "HIC",   "HIE",   "HOU",   "HUA",   "HUI",   "HUN",
  "IBN",   "IBO",   "ICI",   "IDE",   "IFS",   "ILE",   "ILS",   "IPE",
  "ISO",   "IVE",   "IXA",   "IXE",   "JAS",   "JEU",   "JUS",   "KAN",
  "KAS",   "KEA",   "KHI",   "KIF",   "KIL",   "KIP",   "KIR",   "KOB",
  "KOP",   "KOT",   "KRU",   "KSI",   "KWA",   "KYU",   "LAI",   "LAO",
  "LAS",   "LEI",   "LEK",   "LEM",   "LES",   "LEU",   "LEV",   "LEZ",
  "LIA",   "LIS",   "LOF",   "LOI",   "LUE",   "LUI",   "LUS",   "LUT",
  "LUX",   "LYS",   "MAI",   "MAL",   "MAS",   "MAX",   "MEC",   "MEO",
  "MER",   "MES",   "MIE",   "MIL",   "MIR",   "MIS",   "MIX",   "MMM",
  "MOA",   "MOI",   "MOL",   "MON",   "MOR",   "MOU",   "MOX",   "MUA",
  "MUE",   "MUR",   "MUS",   "MUT",   "MYE",   "NEF",   "NEM",   "NEO",
  "NES",   "NEY",   "NEZ",   "NIA",   "NID",   "NIE",   "NIF",   "NOM",
  "NOS",   "NUA",   "NUE",   "NUI",   "NUL",   "NUS",   "OBA",   "OBI",
  "OHE",   "OHM",   "OIE",   "OKA",   "OLA",   "OLE",   "ONC",   "ONT",
  "OPE",   "ORS",   "OSA",   "OSE",   "OST",   "OTA",   "OTE",   "OUD",
  "OUF",   "OUH",   "OUI",   "OVE",   "OXO",   "OYE",   "PAF",   "PAS",
  "PEC",   "PEU",   "PFF",   "PHO",   "PIC",   "PIF",   "PIS",   "PIU",
  "PLI",   "PLU",   "POU",   "PRE",   "PSI",   "PST",   "PSY",   "PUA",
  "PUE",   "PUR",   "PUS",   "PUY",   "QAT",   "QIN",   "QUE",   "QUI",
  "RAB",   "RAC",   "RAD",   "RAI",   "RAS",   "RAZ",   "REA",   "REE",
  "REG",   "REM",   "REZ",   "RHE",   "RHO",   "RIA",   "RIE",   "RIF",
  "RIS",   "RIT",   "RIZ",   "ROC",   "ROI",   "ROM",   "ROS",   "RUA",
  "RUS",   "RUT",   "RUZ",   "SAI",   "SAR",   "SAS",   "SAX",   "SEL",
  "SEP",   "SES",   "SIC",   "SIL",   "SIX",   "SKA",   "SOC",   "SOI",
  "SOL",   "SOM",   "SOT",   "SOU",   "SPI",   "SUA",   "SUC",   "SUR",
  "SUS",   "SUT",   "TAC",   "TAF",   "TAO",   "TAS",   "TAT",   "TAU",
  "TEC",   "TEK",   "TEL",   "TEP",   "TER",   "TES",   "TET",   "TEX",
  "TIF",   "TIR",   "TOC",   "TOI",   "TOT",   "TRI",   "TUA",   "TUE",
  "TUF",   "TUS",   "TUT",   "UNE",   "UNI",   "UNS",   "URE",   "USA",
  "UTE",   "VAL",   "VAR",   "VAS",   "VAU",   "VER",   "VES",   "VIA",
  "VIF",   "VIL",   "VIN",   "VIS",   "VIT",   "VOL",   "VOS",   "VUE",
  "VUS",   "WAP",   "WAX",   "WUS",   "YAK",   "YEN",   "YIN",  "YOD",
  "YUE",   "ZEC",   "ZEE",   "ZEF",   "ZEK",   "ZEN",   "ZIG",  "ZIP",
  "ZOB",   "ZOE",   "ZOO",   "ZOU",   "ZUP",   "ZUT",
 "ABAT",  "ABER",  "ABOI",  "ABOT",  "ABRI",  "ABUS",  "ACCU",  "ACES",
 "ACNE",  "ACON",  "ACRA",  "ACTE",  "ACTU",  "ACUL",  "ADAS",  "ADAV",
 "ADNE",  "ADON",  "ADOS",  "AERA",  "AERE",  "AFAT",  "AFIN",  "AGAS",
 "AGES",  "AGHA",  "AGIE",  "AGIO",  "AGIR",  "AGIS",  "AGIT",  "AGUI",
 "AHAN",  "AIES",  "AIGU",  "AILE",  "AILS",  "AIMA",  "AIME",  "AINE",
 "AIRA",  "AIRE",  "AIRS",  "AISE",  "AISY",  "AJUT",  "AKAN",  "ALEA",
 "ALEM",  "ALES",  "ALFA",  "ALLA",  "ALLE",  "ALLO",  "ALOI",  "ALPE",
 "ALUN",  "ALUS",  "ALYA",  "AMAN",  "AMAS",  "AMER",  "AMIE",  "AMIS",
 "AMMI",  "AMUI",  "ANAL",  "ANAR",  "ANAS",  "ANEE",  "ANEL",  "ANES",
 "ANGE",  "ANIL",  "ANIS",  "ANON",  "ANSE",  "ANUS",  "AOUT",  "APAX",
 "APEX",  "APIS",  "APRE",  "APTE",  "ARAC",  "ARAK",  "ARAS",  "ARCS",
 "ARDU",  "AREC",  "AREG",  "ARES",  "AREU",  "ARIA",  "ARMA",  "ARME",
 "AROL",  "ARUM",  "ASES",  "ASIN",  "ASPE",  "ASPI",  "ASSE",  "ASTI",
 "ATRE",  "AUBE",  "AUGE",  "AULA",  "AULX",  "AUNA",  "AUNE",  "AVAL",
 "AVEC",  "AVEN",  "AVEU",  "AVEZ",  "AXAI",  "AXAS",  "AXAT",  "AXEE",
 "AXEL",  "AXER",  "AXES",  "AXEZ",  "AXIS",  "AYEZ",  "AZUR",  "BACS",
 "BAES",  "BAHT",  "BAIE",  "BAIN",  "BAIS",  "BALS",  "BANC",  "BANI",
 "BANS",  "BARS",  "BASA",  "BASI",  "BATA",  "BATI",  "BATS",  "BAUD",
 "BAUX",  "BAVA",  "BAVE",  "BAYA",  "BAYE",  "BEAI",  "BEAS",  "BECS",
 "BEES",  "BEEZ",  "BEGU",  "BEKE",  "BELE",  "BELS",  "BENE",  "BENI",
 "BENS",  "BERK",  "BERS",  "BETE",  "BEUR",  "BEYS",  "BIBI",  "BICS",
 "BIEF",  "BIGE",  "BILA",  "BINA",  "BINE",  "BINZ",  "BIOS",  "BIPA",
 "BIPE",  "BIPS",  "BIRR",  "BISA",  "BISE",  "BITA",  "BITU",  "BIWA",
 "BLES",  "BLET",  "BLEU",  "BLOG",  "BOAS",  "BOBO",  "BOBS",  "BOER",
 "BOGE",  "BOGS",  "BOIS",  "BOIT",  "BOLS",  "BOME",  "BONI",  "BONS",
 "BOPS",  "BORA",  "BORD",  "BORT",  "BOTE",  "BOTS",  "BOUC",  "BOUE",
 "BOUH",  "BOUM",  "BOUR",  "BOUS",  "BOXA",  "BOXE",  "BOYS",  "BRAI",
 "BRAS",  "BREF",  "BREN",  "BRIE",  "BRIK",  "BRIN",  "BRIO",  "BRIS",
 "BROC",  "BROL",  "BROU",  "BRRR",  "BRUI",  "BRUN",  "BRUS",  "BRUT",
 "BUEE",  "BUES",  "BUGS",  "BUIS",  "BUNA",  "BUNS",  "BURE",  "BUSA",
 "BUSC",  "BUSE",  "BUTA",  "BUTE",  "BUTO",  "BUTS",  "CABS",  "CADI",
 "CAGE",  "CAID",  "CALA",  "CALE",  "CALO",  "CALS",  "CAMA",  "CAMP",
 "CANA",  "CAPA",  "CAPE",  "CAPO",  "CAPS",  "CARI",  "CARS",  "CARY",
 "CASA",  "CATA",  "CATI",  "CAVA",  "CAYE",  "CECI",  "CEDI",  "CELA",
 "CELE",  "CENE",  "CENS",  "CEPE",  "CEPS",  "CERF",  "CERS",  "CEUX",
 "CHAH",  "CHAI",  "CHAN",  "CHAS",  "CHEB",  "CHER",  "CHEZ",  "CHIA",
 "CHIE",  "CHIP",  "CHOC",  "CHOP",  "CHTI",  "CHUE",  "CHUS",  "CHUT",
 "CHVA",  "CIAO",  "CIEL",  "CILS",  "CIME",  "CINE",  "CINQ",  "CIRA",
 "CIRE",  "CITA",  "CIVE",  "CLAC",  "CLAP",  "CLEF",  "CLES",  "CLIC",
 "CLIM",  "CLIN",  "CLIP",  "CLOS",  "CLOU",  "COBS",  "COCU",  "COEF",
 "COIR",  "COIS",  "COIT",  "COLO",  "COLS",  "CONE",  "CONS",  "COPS",
 "COQS",  "CORS",  "COSY",  "COTA",  "COTE",  "COTI",  "COUD",  "COUP",
 "COUR",  "COUS",  "COUT",  "CRAC",  "CRAN",  "CRAU",  "CREA",  "CREE",
 "CRET",  "CRIA",  "CRIC",  "CRIE",  "CRIN",  "CRIS",  "CROC",  "CRUE",
 "CRUS",  "CRUT",  "CUBI",  "CUCU",  "CUIR",  "CUIS",  "CUIT",  "CULA",
 "CULE",  "CULS",  "CURA",  "CUTI",  "CUVA",  "CUVE",  "CYAN",  "CYME",
 "CYON",  "CZAR",  "DABS",  "DAHU",  "DAIL",  "DAIM",  "DAIS",  "DAMA",
 "DAME",  "DAMS",  "DANS",  "DAOS",  "DARD",  "DARI",  "DAUW",  "DAWS",
 "DEBS",  "DECI",  "DECO",  "DECU",  "DEFI",  "DEJA",  "DELA",  "DEME",
 "DEMI",  "DEMO",  "DENI",  "DENT",  "DERS",  "DEUG",  "DEUX",  "DEYS",
 "DIAM",  "DIAS",  "DIBI",  "DICO",  "DIEU",  "DINA",  "DIOL",  "DIOT",
 "DIRA",  "DISE",  "DITE",  "DITO",  "DITS",  "DIVA",  "DOCS",  "DODO",
 "DODU",  "DOGE",  "DOIS",  "DOIT",  "DOJO",  "DOLA",  "DOLO",  "DOLS",
 "DOMS",  "DONA",  "DONC",  "DONF",  "DONG",  "DONS",  "DONT",  "DOPA",
 "DOPE",  "DOPS",  "DORE",  "DORS",  "DORT",  "DOSA",  "DOTA",  "DOTS",
 "DOUA",  "DOUE",  "DOUM",  "DOUX",  "DRAP",  "DROP",  "DRUE",  "DRUS",
 "DRYS",  "DUBS",  "DUCE",  "DUCS",  "DUES",  "DUIT",  "DUOS",  "DUPA",
 "DUPE",  "DURA",  "DURE",  "DURS",  "DYKE",  "DYNE",  "EAUX",  "EBAT",
 "ECHA",  "ECHE",  "ECHU",  "ECOS",  "ECOT",  "ECRU",  "ECUS",  "EDAM",
 "EGAL",  "EJET",  "ELFE",  "ELIA",  "ELIE",  "ELIS",  "ELIT",  "ELLE",
 "ELUA",  "ELUE",  "ELUS",  "ELUT",  "EMBU",  "EMET",  "EMEU",  "EMIA",
 "EMIE",  "EMIR",  "EMIS",  "EMOI",  "EMOU",  "EMUE",  "EMUS",  "EMUT",
 "ENOL",  "ENTA",  "ENTE",  "ENVI",  "EONS",  "EPAR",  "EPEE",  "EPIA",
 "EPIE",  "EPIS",  "EPOI",  "ERES",  "ERGS",  "ERRA",  "ERRE",  "ERSE",
 "ESSE",  "ESTE",  "ETAI",  "ETAL",  "ETAT",  "ETAU",  "ETES",  "ETOC",
 "ETRE",  "ETUI",  "EUES",  "EURO",  "EVOE",  "EWES",  "EXAM",  "EXIL",
 "EXIT",  "EXON",  "EXOS",  "EXPO",  "EYRA",  "FACS",  "FADO",  "FAFS",
 "FAIM",  "FAIS",  "FAIT",  "FAIX",  "FANA",  "FANE",  "FANS",  "FAON",
 "FAQS",  "FARD",  "FARE",  "FARO",  "FARS",  "FART",  "FATS",  "FAUT",
 "FAUX",  "FAXA",  "FAXE",  "FEAL",  "FEES",  "FELA",  "FELE",  "FERA",
 "FERS",  "FERU",  "FETA",  "FETE",  "FETU",  "FEUE",  "FEUJ",  "FEUS",
 "FEUX",  "FEVE",  "FIAI",  "FIAS",  "FIAT",  "FICS",  "FIEE",  "FIEL",
 "FIER",  "FIES",  "FIEU",  "FIEZ",  "FIFI",  "FIGE",  "FILA",  "FILO",
 "FILS",  "FINI",  "FINN",  "FINS",  "FION",  "FIQH",  "FISC",  "FIXA",
 "FIXE",  "FIZZ",  "FLAC",  "FLAN",  "FLET",  "FLIC",  "FLIP",  "FLOE",
 "FLOP",  "FLOT",  "FLOU",  "FLUA",  "FLUO",  "FLUX",  "FOCS",  "FOGS",
 "FOHN",  "FOIE",  "FOIN",  "FOIS",  "FORA",  "FORS",  "FOUI",  "FOUS",
 "FOUT",  "FOXE",  "FRAC",  "FRAI",  "FRIC",  "FRIS",  "FRIT",  "FROC",
 "FUGU",  "FUIE",  "FUIR",  "FUIS",  "FUIT",  "FUMA",  "FUNE",  "FUNS",
 "FUSA",  "FUTE",  "FUTS",  "GABA",  "GADE",  "GAGA",  "GAGS",  "GAIE",
 "GAIS",  "GALS",  "GANS",  "GANT",  "GAPS",  "GARA",  "GARE",  "GARI",
 "GARS",  "GATA",  "GAVA",  "GAYS",  "GAZA",  "GAZE",  "GEAI",  "GELA",
 "GELE",  "GELS",  "GEMI",  "GENA",  "GENS",  "GEOS",  "GERA",  "GERE",
 "GIGA",  "GINS",  "GITA",  "GITE",  "GLAS",  "GLEY",  "GLIE",  "GLUA",
 "GLUI",  "GLUS",  "GNON",  "GNOU",  "GOBA",  "GOBE",  "GODA",  "GODE",
 "GOGE",  "GOGO",  "GOIM",  "GOIS",  "GOND",  "GONS",  "GORD",  "GOTH",
 "GOUM",  "GOUR",  "GOYM",  "GOYS",  "GRAM",  "GRAS",  "GRAU",  "GREA",
 "GREC",  "GREE",  "GRES",  "GRIL",  "GRIP",  "GRIS",  "GROG",  "GROS",
 "GRRR",  "GRUE",  "GUAI",  "GUEA",  "GUEE",  "GUES",  "GUET",  "GUIB",
 "GUIS",  "GUNZ",  "GURS",  "GUSS",  "GYMS",  "HADJ",  "HAIE",  "HAIK",
 "HAIS",  "HAIT",  "HAJE",  "HAKA",  "HALA",  "HARO",  "HASE",  "HATA",
 "HAUT",  "HAVA",  "HAVI",  "HEIN",  "HELA",  "HELE",  "HEME",  "HEUR",
 "HIAI",  "HIAS",  "HIAT",  "HIEE",  "HIER",  "HIES",  "HIEZ",  "HIFI",
 "HILE",  "HITS",  "HOAX",  "HOCA",  "HOIR",  "HOLA",  "HOMO",  "HOPI",
 "HORA",  "HORS",  "HOTE",  "HOTS",  "HOTU",  "HOUA",  "HOUE",  "HOUP",
 "HOUX",  "HUAI",  "HUAS",  "HUAT",  "HUBS",  "HUEE",  "HUER",  "HUES",
 "HUEZ",  "HUIS",  "HUIT",  "HUMA",  "HUME",  "HUNE",  "HUNS",  "HURE",
 "HUTU",  "IBNS",  "IBOS",  "IDEE",  "IDEM",  "IDES",  "IGNE",  "IGUE",
 "IKAT",  "ILES",  "ILET",  "ILOT",  "IMAM",  "IMAN",  "IMBU",  "INDE",
 "INDU",  "INFO",  "INNE",  "INNU",  "INOX",  "INSU",  "INTI",  "INUK",
 "IODA",  "IODE",  "IPES",  "IRAI",  "IRAS",  "IRES",  "IREZ",  "ISBA",
 "ISSA",  "ISSU",  "ITOU",  "IULE",  "IVES",  "IVRE",  "IWAN",  "IXAI",
 "IXAS",  "IXAT",  "IXEE",  "IXER",  "IXES",  "IXEZ",  "IXIA",  "JABS",
 "JACO",  "JAIN",  "JAIS",  "JALE",  "JAMS",  "JANS",  "JARD",  "JARS",
 "JASA",  "JASE",  "JASS",  "JAZZ",  "JEEP",  "JETA",  "JETE",  "JETS",
 "JEUN",  "JEUX",  "JEZE",  "JOIE",  "JOJO",  "JOLI",  "JONC",  "JOTA",
 "JOUA",  "JOUE",  "JOUG",  "JOUI",  "JOUR",  "JUBE",  "JUGE",  "JUIF",
 "JUIN",  "JUMP",  "JUPE",  "JURA",  "JURE",  "JUTA",  "KADI",  "KAKI",
 "KALI",  "KAMI",  "KANA",  "KANS",  "KAON",  "KAPO",  "KART",  "KATA",
 "KAVA",  "KAWA",  "KAWI",  "KEAS",  "KEPI",  "KEUF",  "KEUM",  "KHAN",
 "KHAT",  "KHOL",  "KIDS",  "KIEF",  "KIFA",  "KIFE",  "KIFS",  "KIKI",
 "KILO",  "KILS",  "KILT",  "KINA",  "KINE",  "KIPS",  "KIRS",  "KITS",
 "KIWI",  "KOAN",  "KOBS",  "KOKA",  "KOLA",  "KOPS",  "KORA",  "KORE",
 "KOTA",  "KOTE",  "KOTO",  "KOTS",  "KRAK",  "KRUS",  "KSAR",  "KUNA",
 "KURU",  "KVAS",  "KWAS",  "KYAT",  "KYUS",  "LABO",  "LACA",  "LACS",
 "LADS",  "LAIC",  "LAIE",  "LAIS",  "LAIT",  "LAKH",  "LALA",  "LAMA",
 "LAOS",  "LAPA",  "LAPE",  "LAPS",  "LARE",  "LARI",  "LATS",  "LAVE",
 "LAYA",  "LAYE",  "LEGE",  "LEGO",  "LEGS",  "LEHM",  "LEKS",  "LEMS",
 "LESA",  "LESE",  "LEUR",  "LEUS",  "LEVA",  "LEVE",  "LEVS",  "LIAI",
 "LIAS",  "LIAT",  "MAAR",  "MACH",  "MACS",  "MAFE",  "MAGE",  "MAIA",
 "MAIE",  "MAIS",  "MAJE",  "MAKI",  "MALM",  "MALS",  "MAMY",  "MANS",
 "MANX",  "MAOS",  "MARA",  "MARI",  "MASO",  "MATA",  "MATI",  "MATS",
 "MATU",  "MAUX",  "MAXI",  "MAYA",  "MAYE",  "MAZA",  "MAZE",  "MECS",
 "MEDE",  "MEGA",  "MEGI",  "MELA",  "MELE",  "MELO",  "MELS",  "MEME",
 "MENA",  "MENE",  "MENS",  "MENT",  "MEOS",  "MERE",  "MERL",  "MERS",
 "MESA",  "META",  "METS",  "MEUF",  "MEUH",  "MEUS",  "MEUT",  "MEZE",
 "MIAM",  "MICA",  "MIDI",  "MIEL",  "MIEN",  "MIES",  "MILS",  "MIMA",
 "MIME",  "MINA",  "MING",  "MINS",  "MIPS",  "MIRA",  "MIRO",  "MIRS",
 "MISA",  "MISE",  "MISO",  "MITA",  "MIXA",  "MIXE",  "MOAI",  "MOAS",
 "MOBS",  "MOCO",  "MOHO",  "MOIE",  "MOIS",  "MOKA",  "MOKO",  "MOLY",
 "MOME",  "MONO",  "MONS",  "MORD",  "MORS",  "MOTO",  "MOTS",  "MOUD",
 "MOUE",  "MOUS",  "MOUT",  "MOXA",  "MOYA",  "MOYE",  "MUAI",  "MUAS",
 "MUAT",  "MUEE",  "MUER",  "MUES",  "MUET",  "MUEZ",  "MUGE",  "MUGI",
 "MUGS",  "MUID",  "MUNI",  "MUON",  "MURA",  "MURE",  "MURI",  "MURS",
 "MUSA",  "MUSC",  "MUSE",  "MUTA",  "MYES",  "NABI",  "NAFE",  "NAGA",
 "NAGE",  "NAGI",  "NAIF",  "NAIN",  "NAIS",  "NAIT",  "NAJA",  "NANA",
 "NAOS",  "NARD",  "NASE",  "NAYS",  "NAZE",  "NAZI",  "NEEM",  "NEES",
 "NEFS",  "NEMI",  "NEMS",  "NENE",  "NEOS",  "NEPE",  "NERE",  "NERF",
 "NETS",  "NEUF",  "NEVE",  "NEYS",  "NIAI",  "NIAS",  "NIAT",  "NIDA",
 "NIDS",  "NIEE",  "NIER",  "NIES",  "NIET",  "NIEZ",  "NIFE",  "NIFS",
 "NITS",  "NIVE",  "NIXE",  "NOCA",  "NOCE",  "NOIE",  "NOIR",  "NOIX",
 "NOME",  "NOMS",  "NORD",  "NORI",  "NOTA",  "NOUA",  "NOUC",  "NOUE",
 "NOUS",  "NOVE",  "NOVI",  "NOYA",  "NOYE",  "NUAI",  "NUAS",  "NUAT",
 "NUEE",  "NUER",  "NUES",  "NUEZ",  "NUIS",  "NUIT",  "NULS",  "OBAS",
 "OBEI",  "OBEL",  "OBIS",  "OBIT",  "OBUS",  "OCRA",  "OCRE",  "ODES",
 "OEIL",  "OEUF",  "OGAM",  "OGRE",  "OHMS",  "OIES",  "OING",  "OINS",
 "OKAS",  "OKRA",  "OLAS",  "OLIM",  "OLLE",  "OMET",  "OMIS",  "ONDE",
 "ONYX",  "ONZE",  "OPEN",  "OPES",  "OPTA",  "OPTE",  "OPUS",  "ORBE",
 "ORDI",  "ORDO",  "OREE",  "ORES",  "ORGE",  "ORIN",  "ORLE",  "ORME",
 "ORNA",  "ORNE",  "ORYX",  "OSAI",  "OSAS",  "OSAT",  "OSEE",  "OSER",
 "OSES",  "OSEZ",  "OSSU",  "OSTO",  "OSTS",  "OTAI",  "OTAS",  "OTAT",
 "OTEE",  "OTER",  "OTES",  "OTEZ",  "OUAH",  "OUDS",  "OUED",  "OUFS",
 "OUIE",  "OUIN",  "OUIR",  "OUIS",  "OUPS",  "OURS",  "OUZO",  "OVEE",
 "OVES",  "OVIN",  "OVNI",  "OXER",  "OYAT",  "OYES",  "OYEZ",  "PACA",
 "PACK",  "PACS",  "PAFS",  "PAGE",  "PAGI",  "PAIE",  "PAIN",  "PAIR",
 "PAIS",  "PAIT",  "PAIX",  "PALA",  "PALE",  "PALI",  "PALS",  "PALU",
 "PAMA",  "PAME",  "PANA",  "PANE",  "PANS",  "PAON",  "PAPA",  "PAPE",
 "PAPI",  "PAPY",  "PARA",  "PARC",  "PARE",  "PARI",  "PARS",  "PART",
 "PARU",  "PATE",  "PATI",  "PATS",  "PAVA",  "PAVE",  "PAYA",  "PAYE",
 "PAYS",  "PEAN",  "PEAU",  "PECS",  "PEDE",  "PELA",  "PELE",  "PEND",
 "PENE",  "PEON",  "PEPE",  "PEPS",  "PERD",  "PERE",  "PERF",  "PERI",
 "PERM",  "PERS",  "PESA",  "PESE",  "PESO",  "PETA",  "PETE",  "PETS",
 "PEUH",  "PEUL",  "PEUR",  "PEUT",  "PEUX",  "PEZE",  "PFFT",  "PFUT",
 "PHOS",  "PHOT",  "PIAF",  "PIAN",  "PICA",  "PICS",  "PIED",  "PIER",
 "PIES",  "PIEU",  "PIFA",  "PIFE",  "PIFS",  "PIGE",  "PILA",  "PILE",
 "PILS",  "PINE",  "PINS",  "PION",  "PIPA",  "PIPE",  "PIPI",  "PIPO",
 "PIRE",  "PISE",  "PITA",  "PITE",  "PIVE",  "PLAF",  "PLAN",  "PLAT",
 "PLIA",  "PLIE",  "PLIS",  "PLOC",  "PLOT",  "PLUS",  "PLUT",  "PNEU",
 "POCO",  "POGO",  "POIL",  "POIS",  "POIX",  "POLE",  "POLI",  "POLO",
 "POLY",  "POND",  "PONT",  "POOL",  "POPE",  "POPS",  "PORC",  "PORE",
 "PORT",  "POSA",  "POSE",  "POTE",  "POTS",  "POTU",  "POUF",  "POUH",
 "POUM",  "POUR",  "POUX",  "POYA",  "PRAO",  "PRES",  "PRET",  "PRIA",
 "PRIE",  "PRIS",  "PRIT",  "PRIX",  "PROF",  "PROS",  "PROU",  "PSYS",
 "PUAI",  "PUAS",  "PUAT",  "PUBS",  "PUCE",  "PUCK",  "PUEE",  "PUER",
 "PUES",  "PUEZ",  "PUIS",  "PUJA",  "PULA",  "PULL",  "PUMA",  "PUNA",
 "PUNI",  "PUNK",  "PUNT",  "PUPE",  "PURE",  "PURO",  "PURS",  "PUTE",
 "PUTS",  "PUTT",  "PUYS",  "QATS",  "QING",  "QINS",  "QUAI",  "QUEL",
 "QUIA",  "QUIZ",  "QUOI",  "RAAG",  "RABE",  "RABS",  "RACA",  "RADA",
 "RADE",  "RADS",  "RAGA",  "RAIA",  "RAIE",  "RAIS",  "RAIT",  "RAJA",
 "RAKI",  "RALA",  "RALE",  "RAMA",  "RAME",  "RAMI",  "RAND",  "RANG",
 "RANI",  "RANZ",  "RAPA",  "RAPE",  "RAPS",  "RAPT",  "RASA",  "RASE",
 "RATA",  "RATS",  "RAVI",  "RAYA",  "RAYE",  "REAC",  "REAI",  "REAS",
 "REAT",  "REBU",  "RECU",  "REDU",  "REER",  "REES",  "REEZ",  "REGI",
 "REGS",  "REIS",  "RELU",  "REMS",  "RENE",  "REPS",  "REPU",  "RETS",
 "REVA",  "REVE",  "REVU",  "RHES",  "RHUM",  "RIAD",  "RIAL",  "RIAS",
 "RIDA",  "RIEL",  "RIEN",  "RIES",  "RIEZ",  "RIFF",  "RIFS",  "RIMA",
 "RIOS",  "RIPA",  "RIPE",  "RIRA",  "RIRE",  "RISS",  "RITS",  "RIVA",
 "RIVE",  "RIXE",  "ROBA",  "ROBS",  "ROCS",  "RODA",  "ROIS",  "ROLE",
 "ROMS",  "ROND",  "ROSI",  "ROTA",  "ROTE",  "ROTI",  "ROTS",  "ROUA",
 "ROUE",  "ROUF",  "ROUI",  "ROUX",  "RUAI",  "RUAS",  "RUAT",  "RUEE",
 "RUER",  "RUES",  "RUEZ",  "RUGI",  "RUMB",  "RUNE",  "RUPA",  "RUPE",
 "RUSA",  "RUTS",  "RYAD",  "RYAL",  "RYES",  "SACS",  "SADO",  "SAGA",
 "SAIE",  "SAIN",  "SAIS",  "SAIT",  "SAKE",  "SAKI",  "SALA",  "SALI",
 "SALS",  "SAMU",  "SANA",  "SANS",  "SAPA",  "SAPE",  "SARI",  "SARS",
 "SART",  "SATE",  "SATI",  "SAUF",  "SAUR",  "SAUT",  "SAXE",  "SAXO",
 "SCIA",  "SCIE",  "SEAU",  "SECS",  "SECU",  "SEGA",  "SEIN",  "SELS",
 "SEMA",  "SEME",  "SENE",  "SENS",  "SEPS",  "SEPT",  "SERA",  "SERE",
 "SERF",  "SERS",  "SERT",  "SEUL",  "SEVE",  "SEVI",  "SEXE",  "SEXY",
 "SHAH",  "SHIT",  "SIAL",  "SIDA",  "SIDI",  "TAAL",  "TACO",  "TACS",
 "TAEL",  "TAFS",  "TAGS",  "TAIE",  "TAIN",  "TAIS",  "TAIT",  "TAKA",
 "TALA",  "TALC",  "TANS",  "TANT",  "TAON",  "TAOS",  "TAPA",  "TAPE",
 "TAPI",  "TARA",  "TARD",  "TARE",  "TARI",  "TARO",  "TARS",  "TAUX",
 "TAXA",  "TAXE",  "TAXI",  "TEST",  "TOUS",  "TRES",  "TROP",  "TRIO",
 "TRUC",  "TUBE",  "UNIR",  "VERS",  "VERT",  "VELO",  "VITE",  "VLAN",
 "VOIR",  "VOIX",  "VOUS",  "VRAI",  "WOLF",  "XENON", "YACK",  "YEUX",
 "YOGA",  "ZINC"
};
          ]]>
        </sourcecode>
    </section>

    <section>
      <name>Statistical analysis of English and French
      dictionaries</name>

      <t>For a given dictionary (English or EN, French or FR), and a given
      hash algorithm (MD5, SHA1, SHA256, SHA384, or SHA512), this table shows
      the number (and ratio on 2048 words) of collisions - that is, the number
      of words that share at least two equal (alg(word) % 2048) values. The EN
      dictionary is the <xref target="RFC2289"/> standard, while the FR
      dictionary is made of 2048 French different words shown in Appendix B
      above. None of these words appears in the English
      <xref target="RFC2289"/> standard dictionary.</t>

          <table>
            <tbody>
              <tr>
                <td>lang/alg</td>
                <td>MD5</td>
                <td>SHA1</td>
                <td>SHA256</td>
                <td>SHA384</td>
                <td>SHA512</td>
              </tr>
              <tr>
                <td>FR</td>
                <td>759<br/>37,0%</td>
                <td>766<br/>37,4%</td>
                <td>757<br/>37,0%</td>
                <td>763<br/>37,3%</td>
                <td>764<br/>37,3%</td>
              </tr>
              <tr>
                <td>EN</td>
                <td>727<br/>35,5%</td>
                <td>722<br/>35,3%</td>
                <td>730<br/>35,6%</td>
                <td>762<br/>37,2%</td>
                <td>755<br/>36,9%</td>
              </tr>
            </tbody>
          </table>
        <t>These figures show that collision rate varies from 35,3% to 37,4%,
        which can be considered very high, whatever the dictionary, word
        distribution, and hash algorithm. They mean that, among 10 words
        randomly chosen in a source dictionary, almost 4 of them share 1 slot
        in the final (computed) alternate dictionary.</t>
    </section>
  </back>
</rfc>
