Skip to content
Snippets Groups Projects
  1. Mar 01, 2020
  2. Feb 23, 2020
    • Simon Tatham's avatar
      mpint: add a gcd function. · 2debb352
      Simon Tatham authored
      This is another application of the existing mp_bezout_into, which
      needed a tweak or two to cope with the numbers not necessarily being
      coprime, plus a wrapper function to deal with shared factors of 2.
      
      It reindents the entire second half of mp_bezout_into, so the patch is
      best viewed with whitespace differences ignored.
      2debb352
    • Simon Tatham's avatar
      mpint: add mp_random_upto(). · 957f1408
      Simon Tatham authored
      This is a third random-number generation function, with an API in
      between the too-specific mp_random_bits and the too-general
      mp_random_in_range. Now you can generate a value between 0 and n
      without having to either make n a power of 2, or tediously allocate a
      zero mp_int to be the lower limit for mp_random_in_range.
      
      Implementation is done by sawing the existing mp_random_in_range into
      two pieces and exposing the API between them.
      957f1408
    • Simon Tatham's avatar
      mpint: add mp_lshift_fixed(). · d4a4111f
      Simon Tatham authored
      This is a version of mp_lshift_fixed_into() which allocates the output
      number, which it can do because you know the size of the original
      number and are allowed to treat the shift count as non-secret.
      
      (By contrast, mp_lshift_safe() would be a nonsensical function - if
      you're trying to keep the shift count secret, you _can't_ use it as a
      parameter of memory allocation! In that situation you have no choice
      but to allocate memory based on a fixed upper bound.)
      d4a4111f
    • Simon Tatham's avatar
      mpint: add mp_[lr]shift_safe_into functions. · 18678ba9
      Simon Tatham authored
      There was previously no safe left shift at all, which is an omission.
      And rshift_safe_into was an odd thing to be missing, so while I'm
      here, I've added it on the basis that it will probably be useful
      sooner or later.
      18678ba9
  3. Feb 26, 2019
  4. Feb 09, 2019
  5. Jan 29, 2019
  6. Jan 23, 2019
    • Simon Tatham's avatar
      Replace random_byte() with random_read(). · 628e7948
      Simon Tatham authored
      This is in preparation for a PRNG revamp which will want to have a
      well defined boundary for any given request-for-randomness, so that it
      can destroy the evidence afterwards. So no more looping round calling
      random_byte() and then stopping when we feel like it: now you say up
      front how many random bytes you want, and call random_read() which
      gives you that many in one go.
      
      Most of the call sites that had to be fixed are fairly mechanical, and
      quite a few ended up more concise afterwards. A few became more
      cumbersome, such as mp_random_bits, in which the new API doesn't let
      me load the random bytes directly into the target integer without
      triggering undefined behaviour, so instead I have to allocate a
      separate temporary buffer.
      
      The _most_ interesting call site was in the PKCS#1 v1.5 padding code
      in sshrsa.c (used in SSH-1), in which you need a stream of _nonzero_
      random bytes. The previous code just looped on random_byte, retrying
      if it got a zero. Now I'm doing a much more interesting thing with an
      mpint, essentially scaling a binary fraction repeatedly to extract a
      number in the range [0,255) and then adding 1 to it.
      628e7948
  7. Jan 03, 2019
    • Simon Tatham's avatar
      Remove unused function monty_copy. · ffa8dcc1
      Simon Tatham authored
      I wrote it for the sake of a test-system design I had in mind at the
      time, but that design changed after I committed, and now I think
      _even_ my upcoming test application won't need to copy MontyContexts.
      So I'll remove the function now, so as not to have to pointlessly
      write tests for it :-)
      ffa8dcc1
  8. Dec 31, 2018
    • Simon Tatham's avatar
      Complete rewrite of PuTTY's bignum library. · 25b034ee
      Simon Tatham authored
      The old 'Bignum' data type is gone completely, and so is sshbn.c. In
      its place is a new thing called 'mp_int', handled by an entirely new
      library module mpint.c, with API differences both large and small.
      
      The main aim of this change is that the new library should be free of
      timing- and cache-related side channels. I've written the code so that
      it _should_ - assuming I haven't made any mistakes - do all of its
      work without either control flow or memory addressing depending on the
      data words of the input numbers. (Though, being an _arbitrary_
      precision library, it does have to at least depend on the sizes of the
      numbers - but there's a 'formal' size that can vary separately from
      the actual magnitude of the represented integer, so if you want to
      keep it secret that your number is actually small, it should work fine
      to have a very long mp_int and just happen to store 23 in it.) So I've
      done all my conditionalisation by means of computing both answers and
      doing bit-masking to swap the right one into place, and all loops over
      the words of an mp_int go up to the formal size rather than the actual
      size.
      
      I haven't actually tested the constant-time property in any rigorous
      way yet (I'm still considering the best way to do it). But this code
      is surely at the very least a big improvement on the old version, even
      if I later find a few more things to fix.
      
      I've also completely rewritten the low-level elliptic curve arithmetic
      from sshecc.c; the new ecc.c is closer to being an adjunct of mpint.c
      than it is to the SSH end of the code. The new elliptic curve code
      keeps all coordinates in Montgomery-multiplication transformed form to
      speed up all the multiplications mod the same prime, and only converts
      them back when you ask for the affine coordinates. Also, I adopted
      extended coordinates for the Edwards curve implementation.
      
      sshecc.c has also had a near-total rewrite in the course of switching
      it over to the new system. While I was there, I've separated ECDSA and
      EdDSA more completely - they now have separate vtables, instead of a
      single vtable in which nearly every function had a big if statement in
      it - and also made the externally exposed types for an ECDSA key and
      an ECDH context different.
      
      A minor new feature: since the new arithmetic code includes a modular
      square root function, we can now support the compressed point
      representation for the NIST curves. We seem to have been getting along
      fine without that so far, but it seemed a shame not to put it in,
      since it was suddenly easy.
      
      In sshrsa.c, one major change is that I've removed the RSA blinding
      step in rsa_privkey_op, in which we randomise the ciphertext before
      doing the decryption. The purpose of that was to avoid timing leaks
      giving away the plaintext - but the new arithmetic code should take
      that in its stride in the course of also being careful enough to avoid
      leaking the _private key_, which RSA blinding had no way to do
      anything about in any case.
      
      Apart from those specific points, most of the rest of the changes are
      more or less mechanical, just changing type names and translating code
      into the new API.
      25b034ee
Loading