Hello Niels,

just a reminder for you to take a look at the updated balloon.patch. I
would like to work on the patch until it is in an acceptable state. I don't
want to leave it hanging unfinished.

Kind regards,
Zoltan

On Thu, Sep 1, 2022 at 4:41 PM Zoltan Fridrich <zfrid...@redhat.com> wrote:

> Hello Niels,
>
> I am sending you an updated patch. I have resolved all of the issues
> except for the modulo.
> Can you please take a look again?
>
> Kind regards,
> Zoltan
>
> On Thu, Sep 1, 2022 at 12:56 PM Niels Möller <ni...@lysator.liu.se> wrote:
>
>> Zoltan Fridrich <zfrid...@redhat.com> writes:
>>
>> >> +        r %= mod;
>> >
>> >>Division is a pretty expensive operation. If this loop is in any way
>> >>performance critical, there are ways to speed up this arithmetic.
>> >
>> > How would you recommend speeding it up?
>>
>> E.g, if m is small enough, you can precompute 0x10000 % m outside of
>> the loop, something like (totally untested)
>>
>>   uint32_t two16_mod_m = 0x10000 % mod;
>>   uint32_t r = 0;
>>   unsigned i;
>>   for (i = length; i-- > 0; )
>>     {
>>       r = (r << 8) + block[i];
>>       r = (r & 0xffff) + (r >> 16) * two16_mod_m;
>>     }
>>   return r % mod;
>>
>> (one needs some analys to ensure that r stays in range and never
>> overflows; the above is probably not quite right).
>>
>> I think one can gain speed by only keeping r partially reduced in the
>> loop. It's also possible to reduce it completely, but replace division
>> by multiplication (see https://gmplib.org/~tege/divcnst-pldi94.pdf,
>> https://gmplib.org/~tege/division-paper.pdf). If the compiler is clever
>> enough, it could realize that mod is a loop invariant and do that for
>> you, but I wouldn't count on that.
>>
>> The point is that on typical processors, a division instruction can take
>> 50-100 cycles or more, while a multiplication is typicalle done in 5
>> cycles or less.
>>
>> >>For consistency, can you see if you can make the interface/function
>> >>signature closer to the pbkdf2 function (see pbkdf2.h)? It takes a
>> >>pointer to a mac context, already initialized by the caller (in this
>> >>case, it would instead be a hash context), function pointers for update
>> >>and digest, and the digest size.
>> >
>> > The closest function signature I can think of would look like this:
>> >
>> > void
>> > balloon(void *hash_ctx,
>> >              nettle_hash_update_func *update,
>> >              nettle_hash_digest_func *digest,
>> >              size_t digest_size, uint *buf,
>> >              size_t s_cost, size_t t_cost,
>> >              size_t passwd_length, const uint8_t *passwd,
>> >              size_t salt_length, const uint8_t *salt,
>> >              size_t length, uint8_t *dst)
>> >
>> > But isn't 13 argument function an overkill?
>> > Would this function signature be ok or would you recommend something
>> else?
>>
>> I agree it's a bit unwieldy, but ok for a low-level primitive. But I
>> think you can reduce it to 12, since length and digest_size are always
>> the same, right?
>>
>> One can then add wrappers for hash functions of interest, e.g.,
>> balloon_sha256, which would be a bit simper.
>>
>> > Good point. I think it might be reasonable for someone to want a buffer
>> > size of a few GB in extreme cases.
>> > I can put s_cost and t_cost as size_t. I think there is no harm in doing
>> > that. Is that ok if I put them as size_t?
>>
>> I think that is ok. size_t for cost_s makes sense. I don't know what's
>> the reasonable value is for cost_t? But makes some sense to stick to the
>> same type for both cost parameters.
>>
>> Regards,
>> /Niels
>>
>> --
>> Niels Möller. PGP key CB4962D070D77D7FCB8BA36271D8F1FF368C6677.
>> Internet email is subject to wholesale government surveillance.
>>
>>
_______________________________________________
nettle-bugs mailing list -- nettle-bugs@lists.lysator.liu.se
To unsubscribe send an email to nettle-bugs-le...@lists.lysator.liu.se

Reply via email to