tsc.c - sick - sign and check files using ed25519
 (HTM) git clone git://z3bra.org/sick
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tsc.c (22867B)
       ---
            1 #include "fixedint.h"
            2 #include "sc.h"
            3 
            4 static uint64_t load_3(const unsigned char *in) {
            5     uint64_t result;
            6 
            7     result = (uint64_t) in[0];
            8     result |= ((uint64_t) in[1]) << 8;
            9     result |= ((uint64_t) in[2]) << 16;
           10 
           11     return result;
           12 }
           13 
           14 static uint64_t load_4(const unsigned char *in) {
           15     uint64_t result;
           16 
           17     result = (uint64_t) in[0];
           18     result |= ((uint64_t) in[1]) << 8;
           19     result |= ((uint64_t) in[2]) << 16;
           20     result |= ((uint64_t) in[3]) << 24;
           21     
           22     return result;
           23 }
           24 
           25 /*
           26 Input:
           27   s[0]+256*s[1]+...+256^63*s[63] = s
           28 
           29 Output:
           30   s[0]+256*s[1]+...+256^31*s[31] = s mod l
           31   where l = 2^252 + 27742317777372353535851937790883648493.
           32   Overwrites s in place.
           33 */
           34 
           35 void sc_reduce(unsigned char *s) {
           36     int64_t s0 = 2097151 & load_3(s);
           37     int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
           38     int64_t s2 = 2097151 & (load_3(s + 5) >> 2);
           39     int64_t s3 = 2097151 & (load_4(s + 7) >> 7);
           40     int64_t s4 = 2097151 & (load_4(s + 10) >> 4);
           41     int64_t s5 = 2097151 & (load_3(s + 13) >> 1);
           42     int64_t s6 = 2097151 & (load_4(s + 15) >> 6);
           43     int64_t s7 = 2097151 & (load_3(s + 18) >> 3);
           44     int64_t s8 = 2097151 & load_3(s + 21);
           45     int64_t s9 = 2097151 & (load_4(s + 23) >> 5);
           46     int64_t s10 = 2097151 & (load_3(s + 26) >> 2);
           47     int64_t s11 = 2097151 & (load_4(s + 28) >> 7);
           48     int64_t s12 = 2097151 & (load_4(s + 31) >> 4);
           49     int64_t s13 = 2097151 & (load_3(s + 34) >> 1);
           50     int64_t s14 = 2097151 & (load_4(s + 36) >> 6);
           51     int64_t s15 = 2097151 & (load_3(s + 39) >> 3);
           52     int64_t s16 = 2097151 & load_3(s + 42);
           53     int64_t s17 = 2097151 & (load_4(s + 44) >> 5);
           54     int64_t s18 = 2097151 & (load_3(s + 47) >> 2);
           55     int64_t s19 = 2097151 & (load_4(s + 49) >> 7);
           56     int64_t s20 = 2097151 & (load_4(s + 52) >> 4);
           57     int64_t s21 = 2097151 & (load_3(s + 55) >> 1);
           58     int64_t s22 = 2097151 & (load_4(s + 57) >> 6);
           59     int64_t s23 = (load_4(s + 60) >> 3);
           60     int64_t carry0;
           61     int64_t carry1;
           62     int64_t carry2;
           63     int64_t carry3;
           64     int64_t carry4;
           65     int64_t carry5;
           66     int64_t carry6;
           67     int64_t carry7;
           68     int64_t carry8;
           69     int64_t carry9;
           70     int64_t carry10;
           71     int64_t carry11;
           72     int64_t carry12;
           73     int64_t carry13;
           74     int64_t carry14;
           75     int64_t carry15;
           76     int64_t carry16;
           77 
           78     s11 += s23 * 666643;
           79     s12 += s23 * 470296;
           80     s13 += s23 * 654183;
           81     s14 -= s23 * 997805;
           82     s15 += s23 * 136657;
           83     s16 -= s23 * 683901;
           84     s23 = 0;
           85     s10 += s22 * 666643;
           86     s11 += s22 * 470296;
           87     s12 += s22 * 654183;
           88     s13 -= s22 * 997805;
           89     s14 += s22 * 136657;
           90     s15 -= s22 * 683901;
           91     s22 = 0;
           92     s9 += s21 * 666643;
           93     s10 += s21 * 470296;
           94     s11 += s21 * 654183;
           95     s12 -= s21 * 997805;
           96     s13 += s21 * 136657;
           97     s14 -= s21 * 683901;
           98     s21 = 0;
           99     s8 += s20 * 666643;
          100     s9 += s20 * 470296;
          101     s10 += s20 * 654183;
          102     s11 -= s20 * 997805;
          103     s12 += s20 * 136657;
          104     s13 -= s20 * 683901;
          105     s20 = 0;
          106     s7 += s19 * 666643;
          107     s8 += s19 * 470296;
          108     s9 += s19 * 654183;
          109     s10 -= s19 * 997805;
          110     s11 += s19 * 136657;
          111     s12 -= s19 * 683901;
          112     s19 = 0;
          113     s6 += s18 * 666643;
          114     s7 += s18 * 470296;
          115     s8 += s18 * 654183;
          116     s9 -= s18 * 997805;
          117     s10 += s18 * 136657;
          118     s11 -= s18 * 683901;
          119     s18 = 0;
          120     carry6 = (s6 + (1 << 20)) >> 21;
          121     s7 += carry6;
          122     s6 -= carry6 << 21;
          123     carry8 = (s8 + (1 << 20)) >> 21;
          124     s9 += carry8;
          125     s8 -= carry8 << 21;
          126     carry10 = (s10 + (1 << 20)) >> 21;
          127     s11 += carry10;
          128     s10 -= carry10 << 21;
          129     carry12 = (s12 + (1 << 20)) >> 21;
          130     s13 += carry12;
          131     s12 -= carry12 << 21;
          132     carry14 = (s14 + (1 << 20)) >> 21;
          133     s15 += carry14;
          134     s14 -= carry14 << 21;
          135     carry16 = (s16 + (1 << 20)) >> 21;
          136     s17 += carry16;
          137     s16 -= carry16 << 21;
          138     carry7 = (s7 + (1 << 20)) >> 21;
          139     s8 += carry7;
          140     s7 -= carry7 << 21;
          141     carry9 = (s9 + (1 << 20)) >> 21;
          142     s10 += carry9;
          143     s9 -= carry9 << 21;
          144     carry11 = (s11 + (1 << 20)) >> 21;
          145     s12 += carry11;
          146     s11 -= carry11 << 21;
          147     carry13 = (s13 + (1 << 20)) >> 21;
          148     s14 += carry13;
          149     s13 -= carry13 << 21;
          150     carry15 = (s15 + (1 << 20)) >> 21;
          151     s16 += carry15;
          152     s15 -= carry15 << 21;
          153     s5 += s17 * 666643;
          154     s6 += s17 * 470296;
          155     s7 += s17 * 654183;
          156     s8 -= s17 * 997805;
          157     s9 += s17 * 136657;
          158     s10 -= s17 * 683901;
          159     s17 = 0;
          160     s4 += s16 * 666643;
          161     s5 += s16 * 470296;
          162     s6 += s16 * 654183;
          163     s7 -= s16 * 997805;
          164     s8 += s16 * 136657;
          165     s9 -= s16 * 683901;
          166     s16 = 0;
          167     s3 += s15 * 666643;
          168     s4 += s15 * 470296;
          169     s5 += s15 * 654183;
          170     s6 -= s15 * 997805;
          171     s7 += s15 * 136657;
          172     s8 -= s15 * 683901;
          173     s15 = 0;
          174     s2 += s14 * 666643;
          175     s3 += s14 * 470296;
          176     s4 += s14 * 654183;
          177     s5 -= s14 * 997805;
          178     s6 += s14 * 136657;
          179     s7 -= s14 * 683901;
          180     s14 = 0;
          181     s1 += s13 * 666643;
          182     s2 += s13 * 470296;
          183     s3 += s13 * 654183;
          184     s4 -= s13 * 997805;
          185     s5 += s13 * 136657;
          186     s6 -= s13 * 683901;
          187     s13 = 0;
          188     s0 += s12 * 666643;
          189     s1 += s12 * 470296;
          190     s2 += s12 * 654183;
          191     s3 -= s12 * 997805;
          192     s4 += s12 * 136657;
          193     s5 -= s12 * 683901;
          194     s12 = 0;
          195     carry0 = (s0 + (1 << 20)) >> 21;
          196     s1 += carry0;
          197     s0 -= carry0 << 21;
          198     carry2 = (s2 + (1 << 20)) >> 21;
          199     s3 += carry2;
          200     s2 -= carry2 << 21;
          201     carry4 = (s4 + (1 << 20)) >> 21;
          202     s5 += carry4;
          203     s4 -= carry4 << 21;
          204     carry6 = (s6 + (1 << 20)) >> 21;
          205     s7 += carry6;
          206     s6 -= carry6 << 21;
          207     carry8 = (s8 + (1 << 20)) >> 21;
          208     s9 += carry8;
          209     s8 -= carry8 << 21;
          210     carry10 = (s10 + (1 << 20)) >> 21;
          211     s11 += carry10;
          212     s10 -= carry10 << 21;
          213     carry1 = (s1 + (1 << 20)) >> 21;
          214     s2 += carry1;
          215     s1 -= carry1 << 21;
          216     carry3 = (s3 + (1 << 20)) >> 21;
          217     s4 += carry3;
          218     s3 -= carry3 << 21;
          219     carry5 = (s5 + (1 << 20)) >> 21;
          220     s6 += carry5;
          221     s5 -= carry5 << 21;
          222     carry7 = (s7 + (1 << 20)) >> 21;
          223     s8 += carry7;
          224     s7 -= carry7 << 21;
          225     carry9 = (s9 + (1 << 20)) >> 21;
          226     s10 += carry9;
          227     s9 -= carry9 << 21;
          228     carry11 = (s11 + (1 << 20)) >> 21;
          229     s12 += carry11;
          230     s11 -= carry11 << 21;
          231     s0 += s12 * 666643;
          232     s1 += s12 * 470296;
          233     s2 += s12 * 654183;
          234     s3 -= s12 * 997805;
          235     s4 += s12 * 136657;
          236     s5 -= s12 * 683901;
          237     s12 = 0;
          238     carry0 = s0 >> 21;
          239     s1 += carry0;
          240     s0 -= carry0 << 21;
          241     carry1 = s1 >> 21;
          242     s2 += carry1;
          243     s1 -= carry1 << 21;
          244     carry2 = s2 >> 21;
          245     s3 += carry2;
          246     s2 -= carry2 << 21;
          247     carry3 = s3 >> 21;
          248     s4 += carry3;
          249     s3 -= carry3 << 21;
          250     carry4 = s4 >> 21;
          251     s5 += carry4;
          252     s4 -= carry4 << 21;
          253     carry5 = s5 >> 21;
          254     s6 += carry5;
          255     s5 -= carry5 << 21;
          256     carry6 = s6 >> 21;
          257     s7 += carry6;
          258     s6 -= carry6 << 21;
          259     carry7 = s7 >> 21;
          260     s8 += carry7;
          261     s7 -= carry7 << 21;
          262     carry8 = s8 >> 21;
          263     s9 += carry8;
          264     s8 -= carry8 << 21;
          265     carry9 = s9 >> 21;
          266     s10 += carry9;
          267     s9 -= carry9 << 21;
          268     carry10 = s10 >> 21;
          269     s11 += carry10;
          270     s10 -= carry10 << 21;
          271     carry11 = s11 >> 21;
          272     s12 += carry11;
          273     s11 -= carry11 << 21;
          274     s0 += s12 * 666643;
          275     s1 += s12 * 470296;
          276     s2 += s12 * 654183;
          277     s3 -= s12 * 997805;
          278     s4 += s12 * 136657;
          279     s5 -= s12 * 683901;
          280     s12 = 0;
          281     carry0 = s0 >> 21;
          282     s1 += carry0;
          283     s0 -= carry0 << 21;
          284     carry1 = s1 >> 21;
          285     s2 += carry1;
          286     s1 -= carry1 << 21;
          287     carry2 = s2 >> 21;
          288     s3 += carry2;
          289     s2 -= carry2 << 21;
          290     carry3 = s3 >> 21;
          291     s4 += carry3;
          292     s3 -= carry3 << 21;
          293     carry4 = s4 >> 21;
          294     s5 += carry4;
          295     s4 -= carry4 << 21;
          296     carry5 = s5 >> 21;
          297     s6 += carry5;
          298     s5 -= carry5 << 21;
          299     carry6 = s6 >> 21;
          300     s7 += carry6;
          301     s6 -= carry6 << 21;
          302     carry7 = s7 >> 21;
          303     s8 += carry7;
          304     s7 -= carry7 << 21;
          305     carry8 = s8 >> 21;
          306     s9 += carry8;
          307     s8 -= carry8 << 21;
          308     carry9 = s9 >> 21;
          309     s10 += carry9;
          310     s9 -= carry9 << 21;
          311     carry10 = s10 >> 21;
          312     s11 += carry10;
          313     s10 -= carry10 << 21;
          314 
          315     s[0] = (unsigned char) (s0 >> 0);
          316     s[1] = (unsigned char) (s0 >> 8);
          317     s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5));
          318     s[3] = (unsigned char) (s1 >> 3);
          319     s[4] = (unsigned char) (s1 >> 11);
          320     s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2));
          321     s[6] = (unsigned char) (s2 >> 6);
          322     s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7));
          323     s[8] = (unsigned char) (s3 >> 1);
          324     s[9] = (unsigned char) (s3 >> 9);
          325     s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4));
          326     s[11] = (unsigned char) (s4 >> 4);
          327     s[12] = (unsigned char) (s4 >> 12);
          328     s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1));
          329     s[14] = (unsigned char) (s5 >> 7);
          330     s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6));
          331     s[16] = (unsigned char) (s6 >> 2);
          332     s[17] = (unsigned char) (s6 >> 10);
          333     s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3));
          334     s[19] = (unsigned char) (s7 >> 5);
          335     s[20] = (unsigned char) (s7 >> 13);
          336     s[21] = (unsigned char) (s8 >> 0);
          337     s[22] = (unsigned char) (s8 >> 8);
          338     s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5));
          339     s[24] = (unsigned char) (s9 >> 3);
          340     s[25] = (unsigned char) (s9 >> 11);
          341     s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2));
          342     s[27] = (unsigned char) (s10 >> 6);
          343     s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7));
          344     s[29] = (unsigned char) (s11 >> 1);
          345     s[30] = (unsigned char) (s11 >> 9);
          346     s[31] = (unsigned char) (s11 >> 17);
          347 }
          348 
          349 
          350 
          351 /*
          352 Input:
          353   a[0]+256*a[1]+...+256^31*a[31] = a
          354   b[0]+256*b[1]+...+256^31*b[31] = b
          355   c[0]+256*c[1]+...+256^31*c[31] = c
          356 
          357 Output:
          358   s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
          359   where l = 2^252 + 27742317777372353535851937790883648493.
          360 */
          361 
          362 void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) {
          363     int64_t a0 = 2097151 & load_3(a);
          364     int64_t a1 = 2097151 & (load_4(a + 2) >> 5);
          365     int64_t a2 = 2097151 & (load_3(a + 5) >> 2);
          366     int64_t a3 = 2097151 & (load_4(a + 7) >> 7);
          367     int64_t a4 = 2097151 & (load_4(a + 10) >> 4);
          368     int64_t a5 = 2097151 & (load_3(a + 13) >> 1);
          369     int64_t a6 = 2097151 & (load_4(a + 15) >> 6);
          370     int64_t a7 = 2097151 & (load_3(a + 18) >> 3);
          371     int64_t a8 = 2097151 & load_3(a + 21);
          372     int64_t a9 = 2097151 & (load_4(a + 23) >> 5);
          373     int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
          374     int64_t a11 = (load_4(a + 28) >> 7);
          375     int64_t b0 = 2097151 & load_3(b);
          376     int64_t b1 = 2097151 & (load_4(b + 2) >> 5);
          377     int64_t b2 = 2097151 & (load_3(b + 5) >> 2);
          378     int64_t b3 = 2097151 & (load_4(b + 7) >> 7);
          379     int64_t b4 = 2097151 & (load_4(b + 10) >> 4);
          380     int64_t b5 = 2097151 & (load_3(b + 13) >> 1);
          381     int64_t b6 = 2097151 & (load_4(b + 15) >> 6);
          382     int64_t b7 = 2097151 & (load_3(b + 18) >> 3);
          383     int64_t b8 = 2097151 & load_3(b + 21);
          384     int64_t b9 = 2097151 & (load_4(b + 23) >> 5);
          385     int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
          386     int64_t b11 = (load_4(b + 28) >> 7);
          387     int64_t c0 = 2097151 & load_3(c);
          388     int64_t c1 = 2097151 & (load_4(c + 2) >> 5);
          389     int64_t c2 = 2097151 & (load_3(c + 5) >> 2);
          390     int64_t c3 = 2097151 & (load_4(c + 7) >> 7);
          391     int64_t c4 = 2097151 & (load_4(c + 10) >> 4);
          392     int64_t c5 = 2097151 & (load_3(c + 13) >> 1);
          393     int64_t c6 = 2097151 & (load_4(c + 15) >> 6);
          394     int64_t c7 = 2097151 & (load_3(c + 18) >> 3);
          395     int64_t c8 = 2097151 & load_3(c + 21);
          396     int64_t c9 = 2097151 & (load_4(c + 23) >> 5);
          397     int64_t c10 = 2097151 & (load_3(c + 26) >> 2);
          398     int64_t c11 = (load_4(c + 28) >> 7);
          399     int64_t s0;
          400     int64_t s1;
          401     int64_t s2;
          402     int64_t s3;
          403     int64_t s4;
          404     int64_t s5;
          405     int64_t s6;
          406     int64_t s7;
          407     int64_t s8;
          408     int64_t s9;
          409     int64_t s10;
          410     int64_t s11;
          411     int64_t s12;
          412     int64_t s13;
          413     int64_t s14;
          414     int64_t s15;
          415     int64_t s16;
          416     int64_t s17;
          417     int64_t s18;
          418     int64_t s19;
          419     int64_t s20;
          420     int64_t s21;
          421     int64_t s22;
          422     int64_t s23;
          423     int64_t carry0;
          424     int64_t carry1;
          425     int64_t carry2;
          426     int64_t carry3;
          427     int64_t carry4;
          428     int64_t carry5;
          429     int64_t carry6;
          430     int64_t carry7;
          431     int64_t carry8;
          432     int64_t carry9;
          433     int64_t carry10;
          434     int64_t carry11;
          435     int64_t carry12;
          436     int64_t carry13;
          437     int64_t carry14;
          438     int64_t carry15;
          439     int64_t carry16;
          440     int64_t carry17;
          441     int64_t carry18;
          442     int64_t carry19;
          443     int64_t carry20;
          444     int64_t carry21;
          445     int64_t carry22;
          446 
          447     s0 = c0 + a0 * b0;
          448     s1 = c1 + a0 * b1 + a1 * b0;
          449     s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0;
          450     s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
          451     s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
          452     s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
          453     s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
          454     s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0;
          455     s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0;
          456     s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
          457     s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
          458     s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
          459     s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
          460     s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2;
          461     s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3;
          462     s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4;
          463     s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
          464     s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
          465     s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
          466     s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
          467     s20 = a9 * b11 + a10 * b10 + a11 * b9;
          468     s21 = a10 * b11 + a11 * b10;
          469     s22 = a11 * b11;
          470     s23 = 0;
          471     carry0 = (s0 + (1 << 20)) >> 21;
          472     s1 += carry0;
          473     s0 -= carry0 << 21;
          474     carry2 = (s2 + (1 << 20)) >> 21;
          475     s3 += carry2;
          476     s2 -= carry2 << 21;
          477     carry4 = (s4 + (1 << 20)) >> 21;
          478     s5 += carry4;
          479     s4 -= carry4 << 21;
          480     carry6 = (s6 + (1 << 20)) >> 21;
          481     s7 += carry6;
          482     s6 -= carry6 << 21;
          483     carry8 = (s8 + (1 << 20)) >> 21;
          484     s9 += carry8;
          485     s8 -= carry8 << 21;
          486     carry10 = (s10 + (1 << 20)) >> 21;
          487     s11 += carry10;
          488     s10 -= carry10 << 21;
          489     carry12 = (s12 + (1 << 20)) >> 21;
          490     s13 += carry12;
          491     s12 -= carry12 << 21;
          492     carry14 = (s14 + (1 << 20)) >> 21;
          493     s15 += carry14;
          494     s14 -= carry14 << 21;
          495     carry16 = (s16 + (1 << 20)) >> 21;
          496     s17 += carry16;
          497     s16 -= carry16 << 21;
          498     carry18 = (s18 + (1 << 20)) >> 21;
          499     s19 += carry18;
          500     s18 -= carry18 << 21;
          501     carry20 = (s20 + (1 << 20)) >> 21;
          502     s21 += carry20;
          503     s20 -= carry20 << 21;
          504     carry22 = (s22 + (1 << 20)) >> 21;
          505     s23 += carry22;
          506     s22 -= carry22 << 21;
          507     carry1 = (s1 + (1 << 20)) >> 21;
          508     s2 += carry1;
          509     s1 -= carry1 << 21;
          510     carry3 = (s3 + (1 << 20)) >> 21;
          511     s4 += carry3;
          512     s3 -= carry3 << 21;
          513     carry5 = (s5 + (1 << 20)) >> 21;
          514     s6 += carry5;
          515     s5 -= carry5 << 21;
          516     carry7 = (s7 + (1 << 20)) >> 21;
          517     s8 += carry7;
          518     s7 -= carry7 << 21;
          519     carry9 = (s9 + (1 << 20)) >> 21;
          520     s10 += carry9;
          521     s9 -= carry9 << 21;
          522     carry11 = (s11 + (1 << 20)) >> 21;
          523     s12 += carry11;
          524     s11 -= carry11 << 21;
          525     carry13 = (s13 + (1 << 20)) >> 21;
          526     s14 += carry13;
          527     s13 -= carry13 << 21;
          528     carry15 = (s15 + (1 << 20)) >> 21;
          529     s16 += carry15;
          530     s15 -= carry15 << 21;
          531     carry17 = (s17 + (1 << 20)) >> 21;
          532     s18 += carry17;
          533     s17 -= carry17 << 21;
          534     carry19 = (s19 + (1 << 20)) >> 21;
          535     s20 += carry19;
          536     s19 -= carry19 << 21;
          537     carry21 = (s21 + (1 << 20)) >> 21;
          538     s22 += carry21;
          539     s21 -= carry21 << 21;
          540     s11 += s23 * 666643;
          541     s12 += s23 * 470296;
          542     s13 += s23 * 654183;
          543     s14 -= s23 * 997805;
          544     s15 += s23 * 136657;
          545     s16 -= s23 * 683901;
          546     s23 = 0;
          547     s10 += s22 * 666643;
          548     s11 += s22 * 470296;
          549     s12 += s22 * 654183;
          550     s13 -= s22 * 997805;
          551     s14 += s22 * 136657;
          552     s15 -= s22 * 683901;
          553     s22 = 0;
          554     s9 += s21 * 666643;
          555     s10 += s21 * 470296;
          556     s11 += s21 * 654183;
          557     s12 -= s21 * 997805;
          558     s13 += s21 * 136657;
          559     s14 -= s21 * 683901;
          560     s21 = 0;
          561     s8 += s20 * 666643;
          562     s9 += s20 * 470296;
          563     s10 += s20 * 654183;
          564     s11 -= s20 * 997805;
          565     s12 += s20 * 136657;
          566     s13 -= s20 * 683901;
          567     s20 = 0;
          568     s7 += s19 * 666643;
          569     s8 += s19 * 470296;
          570     s9 += s19 * 654183;
          571     s10 -= s19 * 997805;
          572     s11 += s19 * 136657;
          573     s12 -= s19 * 683901;
          574     s19 = 0;
          575     s6 += s18 * 666643;
          576     s7 += s18 * 470296;
          577     s8 += s18 * 654183;
          578     s9 -= s18 * 997805;
          579     s10 += s18 * 136657;
          580     s11 -= s18 * 683901;
          581     s18 = 0;
          582     carry6 = (s6 + (1 << 20)) >> 21;
          583     s7 += carry6;
          584     s6 -= carry6 << 21;
          585     carry8 = (s8 + (1 << 20)) >> 21;
          586     s9 += carry8;
          587     s8 -= carry8 << 21;
          588     carry10 = (s10 + (1 << 20)) >> 21;
          589     s11 += carry10;
          590     s10 -= carry10 << 21;
          591     carry12 = (s12 + (1 << 20)) >> 21;
          592     s13 += carry12;
          593     s12 -= carry12 << 21;
          594     carry14 = (s14 + (1 << 20)) >> 21;
          595     s15 += carry14;
          596     s14 -= carry14 << 21;
          597     carry16 = (s16 + (1 << 20)) >> 21;
          598     s17 += carry16;
          599     s16 -= carry16 << 21;
          600     carry7 = (s7 + (1 << 20)) >> 21;
          601     s8 += carry7;
          602     s7 -= carry7 << 21;
          603     carry9 = (s9 + (1 << 20)) >> 21;
          604     s10 += carry9;
          605     s9 -= carry9 << 21;
          606     carry11 = (s11 + (1 << 20)) >> 21;
          607     s12 += carry11;
          608     s11 -= carry11 << 21;
          609     carry13 = (s13 + (1 << 20)) >> 21;
          610     s14 += carry13;
          611     s13 -= carry13 << 21;
          612     carry15 = (s15 + (1 << 20)) >> 21;
          613     s16 += carry15;
          614     s15 -= carry15 << 21;
          615     s5 += s17 * 666643;
          616     s6 += s17 * 470296;
          617     s7 += s17 * 654183;
          618     s8 -= s17 * 997805;
          619     s9 += s17 * 136657;
          620     s10 -= s17 * 683901;
          621     s17 = 0;
          622     s4 += s16 * 666643;
          623     s5 += s16 * 470296;
          624     s6 += s16 * 654183;
          625     s7 -= s16 * 997805;
          626     s8 += s16 * 136657;
          627     s9 -= s16 * 683901;
          628     s16 = 0;
          629     s3 += s15 * 666643;
          630     s4 += s15 * 470296;
          631     s5 += s15 * 654183;
          632     s6 -= s15 * 997805;
          633     s7 += s15 * 136657;
          634     s8 -= s15 * 683901;
          635     s15 = 0;
          636     s2 += s14 * 666643;
          637     s3 += s14 * 470296;
          638     s4 += s14 * 654183;
          639     s5 -= s14 * 997805;
          640     s6 += s14 * 136657;
          641     s7 -= s14 * 683901;
          642     s14 = 0;
          643     s1 += s13 * 666643;
          644     s2 += s13 * 470296;
          645     s3 += s13 * 654183;
          646     s4 -= s13 * 997805;
          647     s5 += s13 * 136657;
          648     s6 -= s13 * 683901;
          649     s13 = 0;
          650     s0 += s12 * 666643;
          651     s1 += s12 * 470296;
          652     s2 += s12 * 654183;
          653     s3 -= s12 * 997805;
          654     s4 += s12 * 136657;
          655     s5 -= s12 * 683901;
          656     s12 = 0;
          657     carry0 = (s0 + (1 << 20)) >> 21;
          658     s1 += carry0;
          659     s0 -= carry0 << 21;
          660     carry2 = (s2 + (1 << 20)) >> 21;
          661     s3 += carry2;
          662     s2 -= carry2 << 21;
          663     carry4 = (s4 + (1 << 20)) >> 21;
          664     s5 += carry4;
          665     s4 -= carry4 << 21;
          666     carry6 = (s6 + (1 << 20)) >> 21;
          667     s7 += carry6;
          668     s6 -= carry6 << 21;
          669     carry8 = (s8 + (1 << 20)) >> 21;
          670     s9 += carry8;
          671     s8 -= carry8 << 21;
          672     carry10 = (s10 + (1 << 20)) >> 21;
          673     s11 += carry10;
          674     s10 -= carry10 << 21;
          675     carry1 = (s1 + (1 << 20)) >> 21;
          676     s2 += carry1;
          677     s1 -= carry1 << 21;
          678     carry3 = (s3 + (1 << 20)) >> 21;
          679     s4 += carry3;
          680     s3 -= carry3 << 21;
          681     carry5 = (s5 + (1 << 20)) >> 21;
          682     s6 += carry5;
          683     s5 -= carry5 << 21;
          684     carry7 = (s7 + (1 << 20)) >> 21;
          685     s8 += carry7;
          686     s7 -= carry7 << 21;
          687     carry9 = (s9 + (1 << 20)) >> 21;
          688     s10 += carry9;
          689     s9 -= carry9 << 21;
          690     carry11 = (s11 + (1 << 20)) >> 21;
          691     s12 += carry11;
          692     s11 -= carry11 << 21;
          693     s0 += s12 * 666643;
          694     s1 += s12 * 470296;
          695     s2 += s12 * 654183;
          696     s3 -= s12 * 997805;
          697     s4 += s12 * 136657;
          698     s5 -= s12 * 683901;
          699     s12 = 0;
          700     carry0 = s0 >> 21;
          701     s1 += carry0;
          702     s0 -= carry0 << 21;
          703     carry1 = s1 >> 21;
          704     s2 += carry1;
          705     s1 -= carry1 << 21;
          706     carry2 = s2 >> 21;
          707     s3 += carry2;
          708     s2 -= carry2 << 21;
          709     carry3 = s3 >> 21;
          710     s4 += carry3;
          711     s3 -= carry3 << 21;
          712     carry4 = s4 >> 21;
          713     s5 += carry4;
          714     s4 -= carry4 << 21;
          715     carry5 = s5 >> 21;
          716     s6 += carry5;
          717     s5 -= carry5 << 21;
          718     carry6 = s6 >> 21;
          719     s7 += carry6;
          720     s6 -= carry6 << 21;
          721     carry7 = s7 >> 21;
          722     s8 += carry7;
          723     s7 -= carry7 << 21;
          724     carry8 = s8 >> 21;
          725     s9 += carry8;
          726     s8 -= carry8 << 21;
          727     carry9 = s9 >> 21;
          728     s10 += carry9;
          729     s9 -= carry9 << 21;
          730     carry10 = s10 >> 21;
          731     s11 += carry10;
          732     s10 -= carry10 << 21;
          733     carry11 = s11 >> 21;
          734     s12 += carry11;
          735     s11 -= carry11 << 21;
          736     s0 += s12 * 666643;
          737     s1 += s12 * 470296;
          738     s2 += s12 * 654183;
          739     s3 -= s12 * 997805;
          740     s4 += s12 * 136657;
          741     s5 -= s12 * 683901;
          742     s12 = 0;
          743     carry0 = s0 >> 21;
          744     s1 += carry0;
          745     s0 -= carry0 << 21;
          746     carry1 = s1 >> 21;
          747     s2 += carry1;
          748     s1 -= carry1 << 21;
          749     carry2 = s2 >> 21;
          750     s3 += carry2;
          751     s2 -= carry2 << 21;
          752     carry3 = s3 >> 21;
          753     s4 += carry3;
          754     s3 -= carry3 << 21;
          755     carry4 = s4 >> 21;
          756     s5 += carry4;
          757     s4 -= carry4 << 21;
          758     carry5 = s5 >> 21;
          759     s6 += carry5;
          760     s5 -= carry5 << 21;
          761     carry6 = s6 >> 21;
          762     s7 += carry6;
          763     s6 -= carry6 << 21;
          764     carry7 = s7 >> 21;
          765     s8 += carry7;
          766     s7 -= carry7 << 21;
          767     carry8 = s8 >> 21;
          768     s9 += carry8;
          769     s8 -= carry8 << 21;
          770     carry9 = s9 >> 21;
          771     s10 += carry9;
          772     s9 -= carry9 << 21;
          773     carry10 = s10 >> 21;
          774     s11 += carry10;
          775     s10 -= carry10 << 21;
          776     
          777     s[0] = (unsigned char) (s0 >> 0);
          778     s[1] = (unsigned char) (s0 >> 8);
          779     s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5));
          780     s[3] = (unsigned char) (s1 >> 3);
          781     s[4] = (unsigned char) (s1 >> 11);
          782     s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2));
          783     s[6] = (unsigned char) (s2 >> 6);
          784     s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7));
          785     s[8] = (unsigned char) (s3 >> 1);
          786     s[9] = (unsigned char) (s3 >> 9);
          787     s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4));
          788     s[11] = (unsigned char) (s4 >> 4);
          789     s[12] = (unsigned char) (s4 >> 12);
          790     s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1));
          791     s[14] = (unsigned char) (s5 >> 7);
          792     s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6));
          793     s[16] = (unsigned char) (s6 >> 2);
          794     s[17] = (unsigned char) (s6 >> 10);
          795     s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3));
          796     s[19] = (unsigned char) (s7 >> 5);
          797     s[20] = (unsigned char) (s7 >> 13);
          798     s[21] = (unsigned char) (s8 >> 0);
          799     s[22] = (unsigned char) (s8 >> 8);
          800     s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5));
          801     s[24] = (unsigned char) (s9 >> 3);
          802     s[25] = (unsigned char) (s9 >> 11);
          803     s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2));
          804     s[27] = (unsigned char) (s10 >> 6);
          805     s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7));
          806     s[29] = (unsigned char) (s11 >> 1);
          807     s[30] = (unsigned char) (s11 >> 9);
          808     s[31] = (unsigned char) (s11 >> 17);
          809 }