# HACKING                                                       -*- org -*-
#+TITLE: Hacking notes for Libgcrypt
#+STARTUP: showall

* How to contribute

  The following stuff explains some basic procedures you need to
  follow if you want to contribute code or documentation.

** No more ChangeLog files

  Do not modify any of the ChangeLog files in Libgcrypt.  Starting on
  December 1st, 2011 we put change information only in the GIT commit
  log, and generate a top-level ChangeLog file from logs at "make
  dist" time.  As such, there are strict requirements on the form of
  the commit log messages.  The old ChangeLog files have all be
  renamed to ChangeLog-2011

** Commit log requirements

  Your commit log should always start with a one-line summary, the
  second line should be blank, and the remaining lines are usually
  ChangeLog-style entries for all affected files.  However, it's fine
  -- even recommended -- to write a few lines of prose describing the
  change, when the summary and ChangeLog entries don't give enough of
  the big picture.  Omit the leading TABs that you're used to seeing
  in a "real" ChangeLog file, but keep the maximum line length at 72
  or smaller, so that the generated ChangeLog lines, each with its
  leading TAB, will not exceed 80 columns.

** License policy

  Libgcrypt is currently licensed under the LGPLv2+ with tools and the
  manual being under the GPLv2+.  We may eventually update to a newer
  version of the licenses or a combination of them.  It is thus
  important, that all contributed code allows for an update of the
  license; for example we can't accept code under the LGPLv2(only).

  Libgcrypt used to have a strict policy of requiring copyright
  assignments to the FSF.  To avoid this major organizational overhead
  and to allow inclusion of code, not copyrighted by the FSF, this
  policy has been relaxed.  It is now also possible to contribute code
  by asserting that the contribution is in accordance to the
  "Libgcrypt Developer's Certificate of Origin" as found in the file
  "DCO".  (Except for a slight wording change, this DCO is identical
  to the one used by the Linux kernel.)

  If your want to contribute code or documentation to Libgcrypt and
  you didn't signed a copyright assignment with the FSF in the past,
  you need to take these simple steps:

  - Decide which mail address you want to use.  Please have your real
    name in the address and not a pseudonym.  Anonymous contributions
    can only be done if you find a proxy who certifies for you.

  - If your employer or school might claim ownership of code written
    by you; you need to talk to them to make sure that you have the
    right to contribute under the DCO.

  - Send an OpenPGP signed mail to the gcrypt-devel@gnupg.org mailing
    list from your mail address.  Include a copy of the DCO as found
    in the official master branch.  Insert your name and email address
    into the DCO in the same way you want to use it later.  Example:

      Signed-off-by: Joe R. Hacker <joe@example.org>

    (If you really need it, you may perform simple transformations of
    the mail address: Replacing "@" by " at " or "." by " dot ".)

  - That's it.  From now on you only need to add a "Signed-off-by:"
    line with your name and mail address to the commit message.  It is
    recommended to send the patches using a PGP/MIME signed mail.

** Coding standards

  Please follow the GNU coding standards.  If you are in doubt consult
  the existing code as an example.  Do no re-indent code without a
  need.  If you really need to do it, use a separate commit for such a
  change.


* Porting hints
** Taking optimized MPI code out of GMP:

  I generated the pentium4/* files by glueing the existing assembler
  prologues to the GMP 4.2.1 assembler files generated with the m4
  tool in GMP's build process, for example:

    $ m4 -DHAVE_CONFIG_H -D__GMP_WITHIN_GMP -DOPERATION_rshift -DPIC \
      rshift.asm >tmp-rshift.s

  Then tmp-rshift will contain the assembler instructions for the
  configured platform.  Unfortunately, this way the comments are lost.
  For most files I re-inserted some of the comments, but this is
  tedious work.


* Debug hints

** Debugging math stuff:

  While debugging the ECC code in libgcrypt, I was in need for some
  computer algebra system which would allow me to verify the numbers
  in the debugging easily.  I found that PARI (pari-gp package in
  Debian) has support for elliptic curves.  The below commands shows
  how they are set up and used with an example.

  ===8<========
  hextodec(s)=local(v=Vec(s),a=10,b=11,c=12,d=13,e=14,f=15,A=10,B=11,C=12,D=13,E=14,F=15,h);if(#setunion(Set(v),Vec("0123456789ABCDEFabcdef"))>22,error);for(i=1,#v,h=shift(h,4)+eval(v[i]));h

  p = hextodec("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
  a = hextodec("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC")
  b = hextodec("51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00")

  /* Set up y^2 = x^3 + ax + b mod (p).  */
  e = ellinit(Mod(1,p)*[0,0,0,a,b]);

  gx = hextodec ("00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66")
  gy = hextodec ("011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650")
  g = Mod(1,p)*[gx,gy]

  n = hextodec ("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409")

  /* Verify that G is on the curve, and that n is the order.  */
  ellisoncurve (e,g)
  isprime (n)
  ellpow (e,g,n)

  d = hextodec ("018F9573F25059571BDF614529953DE2540497CEDABD04F3AF78813BED7BB163A2FD919EECF822848FCA39EF55E500F8CE861C7D53D371857F7774B79428E887F81B")

  qx = hextodec ("00316AAAD3E905875938F588BD9E8A4785EF9BDB76D62A83A5340F82CB8E800B25619F5C3EA02B7A4FA43D7497C7702F7DFBEAC8E8F92C3CAABD9F84182FDA391B3B")
  /* Note: WRONG! (It is apparent that this is the same as X shifted by
     8 bit).  */
  qy = hextodec ("0000316AAAD3E905875938F588BD9E8A4785EF9BDB76D62A83A5340F82CB8E800B25619F5C3EA02B7A4FA43D7497C7702F7DFBEAC8E8F92C3CAABD9F84182FDA391B")
  q = Mod(1,p)*[qx,qy]

  /* Calculate what Q should be given d.  */
  ellpow (e,g,d)

  /* This is not 0 and thus shows that libgcrypt gave Q and d that do
  not match.  */
  ellpow (e,g,d) - q
  ====8<=====================
