Как изменить основание в функции сжатия в реализации NaCl Poly1305? - PullRequest
0 голосов
/ 28 марта 2019

Я хочу изменить основание целочисленного ввода h функции squeeze() в NaCl ref реализации алгоритма Poly1305 с 2 на степень 8 на 2 на степень 26.

Функция изначально выглядит так:

static void squeeze(unsigned int h[17])
{
    unsigned int j;
    unsigned int u;
    u = 0;
    for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
    u += h[16]; h[16] = u & 3;
    u = 5 * (u >> 2);
    for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
    u += h[16]; h[16] = u;
}

Здесь h представляет целое число, состоящее из 17 «конечностей», каждое с основанием 2 ^ 8 = 256. Фактически:

h = h[0] + 2^8 * h[1] + 2^16 * h[2] + ... + 2^128 * h[16]

Я хочу изменить это на основание 2 до степени 26, так что h теперь состоит из 7 «конечностей», каждое из основания 2 в степень 26.

Я сделал это следующим образом:

static void squeeze26(unsigned int h[7])
{
    unsigned int j;
    unsigned int u;
    u = 0;
    for (j = 0;j < 6;++j) { u += h[j]; h[j] = u & 67108863; u >>= 26; }
    u += h[6]; h[6] = u & 3;
    u = 5 * (u >> 2);
    for (j = 0;j < 6;++j) { u += h[j]; h[j] = u & 67108863; u >>= 26; }
    u += h[6]; h[6] = u;
}

К сожалению, вышесказанное дает мне неверные результаты.Кто-нибудь знает, где проблема и как ее исправить?

...