<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hey Curves folk,<br>
    <br>
    There's been some flak thrown up at "verifiably random" curves
    recently, and I'm wondering if there's any interest in doing it
    right.  Of course, it's not obvious at all that random curves should
    have any quality which is better than, say, the Microsoft "2^NIST -
    minimal such that 3 mod 4" curves.  But if anyone cares about the
    random case, CRYPTO would be the place to generate the curves.<br>
    <br>
    I would suggest a procedure like the following.  It's a rough sketch
    and I'd like to hear suggestions.<br>
    <ul>
      <li> At the CRYPTO rump session, we will generate a seed.</li>
      <ul>
        <li>The process will be explained with handout cards that have
          an explanation, and hash values of documentation and
          verification (at least) scripts that we will distribute over
          the internet, presumably before and after.  This commits us to
          the procedure.  The hash values will be written in large font,
          so that they can be photographed.<br>
        </li>
        <li>Human-powered entropy sources that can be photographed will
          be used to create the seed.  A half-dozen Boggle boards are an
          easy choice, as are dice or Bananagrams tiles.  They will be
          shaken by members of the audience.<br>
        </li>
        <li>Audience takes photographs of the seed with the handouts
          behind them.  The hash values will be visible in the
          photographs along with the seed, because they are in large
          font.<br>
        </li>
        <ul>
          <li>At least one photo should be taken with a film camera,
            preferably a Polaroid; or we should print out some photos on
            the spot.<br>
          </li>
        </ul>
        <li>The seed will be entered into a console connected to an EC2
          or similar cluster.</li>
        <li>The exact format in which the seed will be entered must be
          specified ahead of time.</li>
        <ul>
          <li>Eg, the Boggle boards will be entered left to right.  Each
            board will be entered left-to-right, then top-to-bottom like
            English text.  Rotation will be ignored.  The letters will
            be capitalized as on the board (with Qu entered like that if
            it so reads on the tile).<br>
          </li>
        </ul>
      </ul>
      <li>The cluster will find suitable Edwards curves.</li>
      <ul>
        <li>The field orders will have bit-lengths 160, 192, 224, 256,
          384 and 512, or possibly some subset of these.<br>
        </li>
        <li>The prime will be generated by computing a truncated hash of
          the seed, "-", the desired bitlength, "-p-", and a counter. 
          The counter will be in decimal and will count from 1.  This
          string will not be null-terminated.  We will set the high bit
          and the low two bits of the candidate modulus, so that the
          prime must be of the correct length and must be 3 mod 4.  For
          each bit length, the least positive counter which results in a
          prime will be used.<br>
        </li>
        <li>An untwisted Edwards curve will be generated by the
          truncated hash seed-bitlength-d-counter.  The least positive
          counter which results in a curve that meets the SafeCurves
          criteria (with this spec considered to provide rigidity) with
          cofactor exactly 4 will be used.  It will take perhaps a
          couple hundred core hours to find all the curves.<br>
        </li>
        <li>The generation script will generate a certificate that the
          curve was correct, and for why smaller counters were
          rejected.  For the primes this will consist of a base which
          causes Miller-Rabin to fail.  For the curves it will consist
          of a point of order 8, or order less than 1/4 the Hasse-Weil
          bound on the curve, or composite order inside 1/4 the
          Hasse-Weil bound of the curve.  This might take a comparable
          amount of time to key generation.</li>
        <ul>
          <li>I don't know how to check all the SafeCurves criteria. 
            The ones which aren't about orders hold with high
            probability, but we should still check them.<br>
          </li>
        </ul>
      </ul>
      <li>If we want to generate prime-order short Weierstrass curves,
        that can be done as well.</li>
      <ul>
        <li>The primes should probably be the same as for Edwards, to
          simplify implementation.<br>
        </li>
        <li>I would suggest a4 = -3 for performance, since there is an
          isomorphic curve to this with reasonable probability anyway.</li>
        <li>We would hash "-a-" instead of "-d-".<br>
        </li>
        <li>Obviously we would have to ignore the "it must be an Edwards
          curve" criteria in the SafeCurves spec.<br>
        </li>
      </ul>
      <li>If we rent enough cores, we can probably hand out the results
        at the end of the rump session.  Otherwise, the next day.<br>
      </li>
      <li>Later, people can verify that the curves were randomly
        generated.</li>
      <ul>
        <li>They will have the words and photographs from the rump
          session audience, showing the hash of the documentation and
          the verification script, and the seed.<br>
        </li>
        <li>They will have the documentation, the verification script,
          and the ability to verify the certificate based on the seed.</li>
        <li>The verification script should run in minutes at most.</li>
      </ul>
      <li>If this procedure fails in a way that preserves its entropy
        and binding properties, it will still be considered valid.  If
        it fails in a way that fails to preserve either property, it is
        not valid.<br>
      </li>
    </ul>
    <p>Is anyone interested in doing this?  Or should we just forget
      about random options, or use Brainpool?  I have versions of some
      of the scripts for special primes, and it shouldn't be that hard
      to modify them.<br>
    </p>
    <p>Cheers,<br>
      -- Mike<br>
    </p>
  </body>
</html>