7 #include "crypto_onetimeauth.h"
9 typedef unsigned char uchar
;
11 typedef unsigned int uint32
;
12 typedef long long int64
;
13 typedef unsigned long long uint64
;
15 static const double poly1305_53_constants
[] = {
16 0.00000000558793544769287109375 /* alpham80 = 3 2^(-29) */
17 , 24.0 /* alpham48 = 3 2^3 */
18 , 103079215104.0 /* alpham16 = 3 2^35 */
19 , 6755399441055744.0 /* alpha0 = 3 2^51 */
20 , 1770887431076116955136.0 /* alpha18 = 3 2^69 */
21 , 29014219670751100192948224.0 /* alpha32 = 3 2^83 */
22 , 7605903601369376408980219232256.0 /* alpha50 = 3 2^101 */
23 , 124615124604835863084731911901282304.0 /* alpha64 = 3 2^115 */
24 , 32667107224410092492483962313449748299776.0 /* alpha82 = 3 2^133 */
25 , 535217884764734955396857238543560676143529984.0 /* alpha96 = 3 2^147 */
26 , 35076039295941670036888435985190792471742381031424.0 /* alpha112 = 3 2^163 */
27 , 9194973245195333150150082162901855101712434733101613056.0 /* alpha130 = 3 2^181 */
28 , 0.0000000000000000000000000000000000000036734198463196484624023016788195177431833298649127735047148490821200539357960224151611328125 /* scale = 5 2^(-130) */
29 , 6755408030990331.0 /* offset0 = alpha0 + 2^33 - 5 */
30 , 29014256564239239022116864.0 /* offset1 = alpha32 + 2^65 - 2^33 */
31 , 124615283061160854719918951570079744.0 /* offset2 = alpha64 + 2^97 - 2^65 */
32 , 535219245894202480694386063513315216128475136.0 /* offset3 = alpha96 + 2^130 - 2^97 */
35 int crypto_onetimeauth(unsigned char *out
,const unsigned char *m
,unsigned long long l
,const unsigned char *k
)
37 register const unsigned char *r
= k
;
38 register const unsigned char *s
= k
+ 16;
57 register double scale
;
58 register double alpha0
;
59 register double alpha32
;
60 register double alpha64
;
61 register double alpha96
;
62 register double alpha130
;
83 register double r3low
;
84 register double r0low
;
85 register double r3high
;
86 register double r0high
;
87 register double sr1low
;
89 register double r3lowx0
;
90 register double sr1high
;
92 register double r0lowx6
;
93 register double r1low
;
95 register double r3highx0
;
96 register double r1high
;
98 register double r0highx6
;
99 register double sr2low
;
100 register double r0lowx0
;
101 register double sr2high
;
102 register double sr1lowx6
;
103 register double r2low
;
104 register double r0highx0
;
105 register double r2high
;
106 register double sr1highx6
;
107 register double sr3low
;
108 register double r1lowx0
;
109 register double sr3high
;
110 register double sr2lowx6
;
111 register double r1highx0
;
112 register double sr2highx6
;
113 register double r2lowx0
;
114 register double sr3lowx6
;
115 register double r2highx0
;
116 register double sr3highx6
;
117 register double r1highx4
;
118 register double r1lowx4
;
119 register double r0highx4
;
120 register double r0lowx4
;
121 register double sr3highx4
;
122 register double sr3lowx4
;
123 register double sr2highx4
;
124 register double sr2lowx4
;
125 register double r0lowx2
;
126 register double r0highx2
;
127 register double r1lowx2
;
128 register double r1highx2
;
129 register double r2lowx2
;
130 register double r2highx2
;
131 register double sr3lowx2
;
132 register double sr3highx2
;
177 register char *constants
;
178 register int32 lbelow2
;
179 register int32 lbelow3
;
180 register int32 lbelow4
;
181 register int32 lbelow5
;
182 register int32 lbelow6
;
183 register int32 lbelow7
;
184 register int32 lbelow8
;
185 register int32 lbelow9
;
186 register int32 lbelow10
;
187 register int32 lbelow11
;
188 register int32 lbelow12
;
189 register int32 lbelow13
;
190 register int32 lbelow14
;
191 register int32 lbelow15
;
192 register double alpham80
;
193 register double alpham48
;
194 register double alpham16
;
195 register double alpha18
;
196 register double alpha50
;
197 register double alpha82
;
198 register double alpha112
;
199 register double offset0
;
200 register double offset1
;
201 register double offset2
;
202 register double offset3
;
219 register uint64 bits32
;
233 r00
= *(uchar
*) (r
+ 0);
234 constants
= (char *) &poly1305_53_constants
;
236 r01
= *(uchar
*) (r
+ 1);
238 r02
= *(uchar
*) (r
+ 2);
241 r03
= *(uchar
*) (r
+ 3); r03
&= 15;
244 r10
= *(uchar
*) (r
+ 4); r10
&= 252;
248 r11
= *(uchar
*) (r
+ 5);
252 r12
= *(uchar
*) (r
+ 6);
256 r13
= *(uchar
*) (r
+ 7); r13
&= 15;
264 r20
= *(uchar
*) (r
+ 8); r20
&= 252;
268 r21
= *(uchar
*) (r
+ 9);
272 r22
= *(uchar
*) (r
+ 10);
276 r23
= *(uchar
*) (r
+ 11); r23
&= 15;
284 r30
= *(uchar
*) (r
+ 12); r30
&= 252;
288 r31
= *(uchar
*) (r
+ 13);
292 r32
= *(uchar
*) (r
+ 14);
298 alpha32
= *(double *) (constants
+ 40);
300 r33
= *(uchar
*) (r
+ 15); r33
&= 15;
311 h0
= alpha32
- alpha32
;
314 h1
= alpha32
- alpha32
;
316 alpha0
= *(double *) (constants
+ 24);
317 h2
= alpha32
- alpha32
;
319 alpha64
= *(double *) (constants
+ 56);
320 h3
= alpha32
- alpha32
;
322 alpha18
= *(double *) (constants
+ 32);
323 h4
= alpha32
- alpha32
;
325 r0low
= *(double *) &d0
;
326 h5
= alpha32
- alpha32
;
328 r1low
= *(double *) &d1
;
329 h6
= alpha32
- alpha32
;
331 r2low
= *(double *) &d2
;
332 h7
= alpha32
- alpha32
;
334 alpha50
= *(double *) (constants
+ 48);
337 alpha82
= *(double *) (constants
+ 64);
340 scale
= *(double *) (constants
+ 96);
343 alpha96
= *(double *) (constants
+ 72);
344 r0high
= r0low
+ alpha18
;
346 r3low
= *(double *) &d3
;
348 alpham80
= *(double *) (constants
+ 0);
349 r1high
= r1low
+ alpha50
;
350 sr1low
= scale
* r1low
;
352 alpham48
= *(double *) (constants
+ 8);
353 r2high
= r2low
+ alpha82
;
354 sr2low
= scale
* r2low
;
357 r0high_stack
= r0high
;
362 r1high_stack
= r1high
;
364 sr1high
= sr1low
+ alpham80
;
366 alpha112
= *(double *) (constants
+ 80);
369 alpham16
= *(double *) (constants
+ 16);
371 sr3low
= scale
* r3low
;
373 alpha130
= *(double *) (constants
+ 88);
374 sr2high
= sr2low
+ alpham48
;
380 sr1high_stack
= sr1high
;
386 sr2high_stack
= sr2high
;
388 r3high
= r3low
+ alpha112
;
392 sr1low_stack
= sr1low
;
394 sr3high
= sr3low
+ alpham16
;
395 r2high_stack
= r2high
;
398 sr2low_stack
= sr2low
;
401 r3high_stack
= r3high
;
405 sr3high_stack
= sr3high
;
413 sr3low_stack
= sr3low
;
415 if (l
< 16) goto addatmost15bytes
;
417 m00
= *(uchar
*) (m
+ 0);
422 m01
= *(uchar
*) (m
+ 1);
426 m02
= *(uchar
*) (m
+ 2);
430 m03
= *(uchar
*) (m
+ 3);
432 m10
= *(uchar
*) (m
+ 4);
436 m11
= *(uchar
*) (m
+ 5);
440 m12
= *(uchar
*) (m
+ 6);
444 m13
= *(uchar
*) (m
+ 7);
448 m20
= *(uchar
*) (m
+ 8);
452 m21
= *(uchar
*) (m
+ 9);
456 m22
= *(uchar
*) (m
+ 10);
460 m23
= *(uchar
*) (m
+ 11);
463 m30
= *(uchar
*) (m
+ 12);
467 m31
= *(uchar
*) (m
+ 13);
471 m32
= *(uchar
*) (m
+ 14);
475 m33
= *(uchar
*) (m
+ 15);
498 z0
= *(double *) &d0
;
500 z1
= *(double *) &d1
;
502 z2
= *(double *) &d2
;
504 z3
= *(double *) &d3
;
522 if (l
< 16) goto multiplyaddatmost15bytes
;
524 multiplyaddatleast16bytes
:;
527 m20
= *(uchar
*) (m
+ 8);
532 m21
= *(uchar
*) (m
+ 9);
537 m22
= *(uchar
*) (m
+ 10);
542 m23
= *(uchar
*) (m
+ 11);
546 m30
= *(uchar
*) (m
+ 12);
551 m31
= *(uchar
*) (m
+ 13);
556 m32
= *(uchar
*) (m
+ 14);
561 m33
= *(uchar
*) (m
+ 15);
565 m00
= *(uchar
*) (m
+ 0);
570 m01
= *(uchar
*) (m
+ 1);
574 m02
= *(uchar
*) (m
+ 2);
579 m03
= *(uchar
*) (m
+ 3);
585 m10
= *(uchar
*) (m
+ 4);
590 m11
= *(uchar
*) (m
+ 5);
595 m12
= *(uchar
*) (m
+ 6);
600 m13
= *(uchar
*) (m
+ 7);
640 r3lowx0
= r3low
* x0
;
641 r3high
= r3high_stack
;
644 r0lowx6
= r0low
* x6
;
645 r0high
= r0high_stack
;
648 r3highx0
= r3high
* x0
;
649 sr1low
= sr1low_stack
;
652 r0highx6
= r0high
* x6
;
653 sr1high
= sr1high_stack
;
656 r0lowx0
= r0low
* x0
;
659 h6
= r3lowx0
+ r0lowx6
;
660 sr1lowx6
= sr1low
* x6
;
661 r1high
= r1high_stack
;
664 r0highx0
= r0high
* x0
;
665 sr2low
= sr2low_stack
;
667 h7
= r3highx0
+ r0highx6
;
668 sr1highx6
= sr1high
* x6
;
669 sr2high
= sr2high_stack
;
672 r1lowx0
= r1low
* x0
;
675 h0
= r0lowx0
+ sr1lowx6
;
676 sr2lowx6
= sr2low
* x6
;
677 r2high
= r2high_stack
;
680 r1highx0
= r1high
* x0
;
681 sr3low
= sr3low_stack
;
683 h1
= r0highx0
+ sr1highx6
;
684 sr2highx6
= sr2high
* x6
;
685 sr3high
= sr3high_stack
;
688 r2lowx0
= r2low
* x0
;
689 z2
= *(double *) &d2
;
691 h2
= r1lowx0
+ sr2lowx6
;
692 sr3lowx6
= sr3low
* x6
;
695 r2highx0
= r2high
* x0
;
696 z3
= *(double *) &d3
;
698 h3
= r1highx0
+ sr2highx6
;
699 sr3highx6
= sr3high
* x6
;
701 r1highx4
= r1high
* x4
;
704 h4
= r2lowx0
+ sr3lowx6
;
705 r1lowx4
= r1low
* x4
;
707 r0highx4
= r0high
* x4
;
710 h5
= r2highx0
+ sr3highx6
;
711 r0lowx4
= r0low
* x4
;
714 sr3highx4
= sr3high
* x4
;
717 sr3lowx4
= sr3low
* x4
;
720 sr2highx4
= sr2high
* x4
;
723 sr2lowx4
= sr2low
* x4
;
726 r0lowx2
= r0low
* x2
;
729 r0highx2
= r0high
* x2
;
732 r1lowx2
= r1low
* x2
;
735 r1highx2
= r1high
* x2
;
738 r2lowx2
= r2low
* x2
;
741 r2highx2
= r2high
* x2
;
744 sr3lowx2
= sr3low
* x2
;
747 sr3highx2
= sr3high
* x2
;
748 alpha0
= *(double *) (constants
+ 24);
756 z1
= *(double *) &d1
;
759 z0
= *(double *) &d0
;
774 if (l
>= 16) goto multiplyaddatleast16bytes
;
776 multiplyaddatmost15bytes
:;
835 r3lowx0
= r3low
* x0
;
836 r3high
= r3high_stack
;
839 r0lowx6
= r0low
* x6
;
840 r0high
= r0high_stack
;
843 r3highx0
= r3high
* x0
;
844 sr1low
= sr1low_stack
;
847 r0highx6
= r0high
* x6
;
848 sr1high
= sr1high_stack
;
851 r0lowx0
= r0low
* x0
;
854 h6
= r3lowx0
+ r0lowx6
;
855 sr1lowx6
= sr1low
* x6
;
856 r1high
= r1high_stack
;
859 r0highx0
= r0high
* x0
;
860 sr2low
= sr2low_stack
;
862 h7
= r3highx0
+ r0highx6
;
863 sr1highx6
= sr1high
* x6
;
864 sr2high
= sr2high_stack
;
867 r1lowx0
= r1low
* x0
;
870 h0
= r0lowx0
+ sr1lowx6
;
871 sr2lowx6
= sr2low
* x6
;
872 r2high
= r2high_stack
;
875 r1highx0
= r1high
* x0
;
876 sr3low
= sr3low_stack
;
878 h1
= r0highx0
+ sr1highx6
;
879 sr2highx6
= sr2high
* x6
;
880 sr3high
= sr3high_stack
;
883 r2lowx0
= r2low
* x0
;
885 h2
= r1lowx0
+ sr2lowx6
;
886 sr3lowx6
= sr3low
* x6
;
889 r2highx0
= r2high
* x0
;
891 h3
= r1highx0
+ sr2highx6
;
892 sr3highx6
= sr3high
* x6
;
894 r1highx4
= r1high
* x4
;
896 h4
= r2lowx0
+ sr3lowx6
;
897 r1lowx4
= r1low
* x4
;
899 r0highx4
= r0high
* x4
;
901 h5
= r2highx0
+ sr3highx6
;
902 r0lowx4
= r0low
* x4
;
905 sr3highx4
= sr3high
* x4
;
908 sr3lowx4
= sr3low
* x4
;
911 sr2highx4
= sr2high
* x4
;
914 sr2lowx4
= sr2low
* x4
;
917 r0lowx2
= r0low
* x2
;
920 r0highx2
= r0high
* x2
;
923 r1lowx2
= r1low
* x2
;
926 r1highx2
= r1high
* x2
;
929 r2lowx2
= r2low
* x2
;
932 r2highx2
= r2high
* x2
;
935 sr3lowx2
= sr3low
* x2
;
938 sr3highx2
= sr3high
* x2
;
950 if (l
== 0) goto nomorebytes
;
959 m00
= *(uchar
*) (m
+ 0);
963 m01
= *(uchar
*) (m
+ 1);
967 m02
= *(uchar
*) (m
+ 2);
971 m03
= *(uchar
*) (m
+ 3);
1008 m10
= *(uchar
*) (m
+ 4);
1012 m11
= *(uchar
*) (m
+ 5);
1016 m12
= *(uchar
*) (m
+ 6);
1020 m13
= *(uchar
*) (m
+ 7);
1063 m20
= *(uchar
*) (m
+ 8);
1067 m21
= *(uchar
*) (m
+ 9);
1071 m22
= *(uchar
*) (m
+ 10);
1075 m23
= *(uchar
*) (m
+ 11);
1080 lbelow9
-= lbelow10
;
1091 lbelow10
-= lbelow11
;
1095 lbelow11
-= lbelow12
;
1113 m30
= *(uchar
*) (m
+ 12);
1117 m31
= *(uchar
*) (m
+ 13);
1121 m32
= *(uchar
*) (m
+ 14);
1123 lbelow12
-= lbelow13
;
1126 lbelow13
-= lbelow14
;
1135 lbelow14
-= lbelow15
;
1152 alpha0
= *(double *) (constants
+ 24);
1154 z3
= *(double *) &d3
;
1156 z2
= *(double *) &d2
;
1158 z1
= *(double *) &d1
;
1160 z0
= *(double *) &d0
;
1229 r3low
= r3low_stack
;
1232 r0low
= r0low_stack
;
1235 r3lowx0
= r3low
* x0
;
1236 r3high
= r3high_stack
;
1239 r0lowx6
= r0low
* x6
;
1240 r0high
= r0high_stack
;
1243 r3highx0
= r3high
* x0
;
1244 sr1low
= sr1low_stack
;
1247 r0highx6
= r0high
* x6
;
1248 sr1high
= sr1high_stack
;
1251 r0lowx0
= r0low
* x0
;
1252 r1low
= r1low_stack
;
1254 h6
= r3lowx0
+ r0lowx6
;
1255 sr1lowx6
= sr1low
* x6
;
1256 r1high
= r1high_stack
;
1259 r0highx0
= r0high
* x0
;
1260 sr2low
= sr2low_stack
;
1262 h7
= r3highx0
+ r0highx6
;
1263 sr1highx6
= sr1high
* x6
;
1264 sr2high
= sr2high_stack
;
1267 r1lowx0
= r1low
* x0
;
1268 r2low
= r2low_stack
;
1270 h0
= r0lowx0
+ sr1lowx6
;
1271 sr2lowx6
= sr2low
* x6
;
1272 r2high
= r2high_stack
;
1275 r1highx0
= r1high
* x0
;
1276 sr3low
= sr3low_stack
;
1278 h1
= r0highx0
+ sr1highx6
;
1279 sr2highx6
= sr2high
* x6
;
1280 sr3high
= sr3high_stack
;
1283 r2lowx0
= r2low
* x0
;
1285 h2
= r1lowx0
+ sr2lowx6
;
1286 sr3lowx6
= sr3low
* x6
;
1289 r2highx0
= r2high
* x0
;
1291 h3
= r1highx0
+ sr2highx6
;
1292 sr3highx6
= sr3high
* x6
;
1294 r1highx4
= r1high
* x4
;
1296 h4
= r2lowx0
+ sr3lowx6
;
1297 r1lowx4
= r1low
* x4
;
1299 r0highx4
= r0high
* x4
;
1301 h5
= r2highx0
+ sr3highx6
;
1302 r0lowx4
= r0low
* x4
;
1305 sr3highx4
= sr3high
* x4
;
1308 sr3lowx4
= sr3low
* x4
;
1311 sr2highx4
= sr2high
* x4
;
1314 sr2lowx4
= sr2low
* x4
;
1317 r0lowx2
= r0low
* x2
;
1320 r0highx2
= r0high
* x2
;
1323 r1lowx2
= r1low
* x2
;
1326 r1highx2
= r1high
* x2
;
1329 r2lowx2
= r2low
* x2
;
1332 r2highx2
= r2high
* x2
;
1335 sr3lowx2
= sr3low
* x2
;
1338 sr3highx2
= sr3high
* x2
;
1351 offset0
= *(double *) (constants
+ 104);
1354 offset1
= *(double *) (constants
+ 112);
1357 offset2
= *(double *) (constants
+ 120);
1360 offset3
= *(double *) (constants
+ 128);
1431 *(double *) &d1
= x2
;
1434 *(double *) &d0
= x0
;
1437 *(double *) &d2
= x4
;
1440 *(double *) &d3
= x6
;
1498 s00
= *(uchar
*) (s
+ 0);
1500 f
= (int64
) g4
>> 63;
1501 s01
= *(uchar
*) (s
+ 1);
1505 s02
= *(uchar
*) (s
+ 2);
1509 s03
= *(uchar
*) (s
+ 3);
1513 s10
= *(uchar
*) (s
+ 4);
1517 s11
= *(uchar
*) (s
+ 5);
1521 s12
= *(uchar
*) (s
+ 6);
1525 s13
= *(uchar
*) (s
+ 7);
1529 s20
= *(uchar
*) (s
+ 8);
1533 s21
= *(uchar
*) (s
+ 9);
1537 s22
= *(uchar
*) (s
+ 10);
1541 s23
= *(uchar
*) (s
+ 11);
1545 s30
= *(uchar
*) (s
+ 12);
1549 s31
= *(uchar
*) (s
+ 13);
1553 s32
= *(uchar
*) (s
+ 14);
1557 s33
= *(uchar
*) (s
+ 15);
1577 *(uchar
*) (out
+ 0) = f0
;
1579 *(uchar
*) (out
+ 1) = f0
;
1581 *(uchar
*) (out
+ 2) = f0
;
1583 *(uchar
*) (out
+ 3) = f0
;
1587 *(uchar
*) (out
+ 4) = f1
;
1589 *(uchar
*) (out
+ 5) = f1
;
1591 *(uchar
*) (out
+ 6) = f1
;
1593 *(uchar
*) (out
+ 7) = f1
;
1597 *(uchar
*) (out
+ 8) = f2
;
1599 *(uchar
*) (out
+ 9) = f2
;
1601 *(uchar
*) (out
+ 10) = f2
;
1603 *(uchar
*) (out
+ 11) = f2
;
1607 *(uchar
*) (out
+ 12) = f3
;
1609 *(uchar
*) (out
+ 13) = f3
;
1611 *(uchar
*) (out
+ 14) = f3
;
1613 *(uchar
*) (out
+ 15) = f3
;