summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/Makefile6
-rw-r--r--src/lib/libcrypto/arch/amd64/Makefile.inc6
-rw-r--r--src/lib/libcrypto/arch/arm/Makefile.inc4
-rw-r--r--src/lib/libcrypto/arch/i386/Makefile.inc6
-rw-r--r--src/lib/libcrypto/arch/sparc64/Makefile.inc6
-rw-r--r--src/lib/libcrypto/ec/asm/ecp_nistz256-armv4.pl1733
-rw-r--r--src/lib/libcrypto/ec/asm/ecp_nistz256-sparcv9.pl2890
-rw-r--r--src/lib/libcrypto/ec/asm/ecp_nistz256-x86.pl1740
-rw-r--r--src/lib/libcrypto/ec/asm/ecp_nistz256-x86_64.pl1971
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp224.c1690
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp256.c2236
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp521.c2112
-rw-r--r--src/lib/libcrypto/ec/ecp_nistputil.c209
-rw-r--r--src/lib/libcrypto/ec/ecp_nistz256.c1191
-rw-r--r--src/lib/libcrypto/ec/ecp_nistz256_table.h9557
15 files changed, 4 insertions, 25353 deletions
diff --git a/src/lib/libcrypto/Makefile b/src/lib/libcrypto/Makefile
index 302ddd62c5..220cfaa410 100644
--- a/src/lib/libcrypto/Makefile
+++ b/src/lib/libcrypto/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.90 2022/12/17 22:01:29 tb Exp $ 1# $OpenBSD: Makefile,v 1.91 2023/01/14 15:45:43 jsing Exp $
2 2
3LIB= crypto 3LIB= crypto
4LIBREBUILD=y 4LIBREBUILD=y
@@ -361,10 +361,6 @@ SRCS+= ec_print.c
361SRCS+= eck_prn.c 361SRCS+= eck_prn.c
362SRCS+= ecp_mont.c 362SRCS+= ecp_mont.c
363SRCS+= ecp_nist.c 363SRCS+= ecp_nist.c
364SRCS+= ecp_nistp224.c
365SRCS+= ecp_nistp256.c
366SRCS+= ecp_nistp521.c
367SRCS+= ecp_nistputil.c
368SRCS+= ecp_oct.c 364SRCS+= ecp_oct.c
369SRCS+= ecp_smpl.c 365SRCS+= ecp_smpl.c
370SRCS+= ecx_methods.c 366SRCS+= ecx_methods.c
diff --git a/src/lib/libcrypto/arch/amd64/Makefile.inc b/src/lib/libcrypto/arch/amd64/Makefile.inc
index 8b87562500..dc615ece1c 100644
--- a/src/lib/libcrypto/arch/amd64/Makefile.inc
+++ b/src/lib/libcrypto/arch/amd64/Makefile.inc
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile.inc,v 1.8 2017/08/20 17:53:13 espie Exp $ 1# $OpenBSD: Makefile.inc,v 1.9 2023/01/14 15:45:43 jsing Exp $
2 2
3# amd64-specific libcrypto build rules 3# amd64-specific libcrypto build rules
4 4
@@ -31,10 +31,6 @@ SRCS+= cmll_misc.c
31SSLASM+= camellia cmll-x86_64 31SSLASM+= camellia cmll-x86_64
32# des 32# des
33SRCS+= des_enc.c fcrypt_b.c 33SRCS+= des_enc.c fcrypt_b.c
34# ec
35#CFLAGS+= -DECP_NISTZ256_ASM
36#SRCS+= ecp_nistz256.c
37#SSLASM+= ec ecp_nistz256-x86_64
38# md5 34# md5
39CFLAGS+= -DMD5_ASM 35CFLAGS+= -DMD5_ASM
40SSLASM+= md5 md5-x86_64 36SSLASM+= md5 md5-x86_64
diff --git a/src/lib/libcrypto/arch/arm/Makefile.inc b/src/lib/libcrypto/arch/arm/Makefile.inc
index b0e499db7b..18772332be 100644
--- a/src/lib/libcrypto/arch/arm/Makefile.inc
+++ b/src/lib/libcrypto/arch/arm/Makefile.inc
@@ -18,10 +18,6 @@ SSLASM+= bn armv4-gf2m
18SRCS+= camellia.c cmll_cbc.c cmll_misc.c 18SRCS+= camellia.c cmll_cbc.c cmll_misc.c
19# des 19# des
20SRCS+= des_enc.c fcrypt_b.c 20SRCS+= des_enc.c fcrypt_b.c
21# # ec
22# CFLAGS+= -DECP_NISTZ256_ASM
23# SRCS+= ecp_nistz256.c
24# SSLASM+= ec ecp_nistz256-armv4
25# modes 21# modes
26CFLAGS+= -DGHASH_ASM 22CFLAGS+= -DGHASH_ASM
27SSLASM+= modes ghash-armv4 23SSLASM+= modes ghash-armv4
diff --git a/src/lib/libcrypto/arch/i386/Makefile.inc b/src/lib/libcrypto/arch/i386/Makefile.inc
index 7986a0f54e..67c22262e6 100644
--- a/src/lib/libcrypto/arch/i386/Makefile.inc
+++ b/src/lib/libcrypto/arch/i386/Makefile.inc
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile.inc,v 1.6 2017/08/20 17:53:13 espie Exp $ 1# $OpenBSD: Makefile.inc,v 1.7 2023/01/14 15:45:43 jsing Exp $
2 2
3# i386-specific libcrypto build rules 3# i386-specific libcrypto build rules
4 4
@@ -28,10 +28,6 @@ SSLASM+= camellia cmll-x86
28# des 28# des
29SRCS+= fcrypt_b.c 29SRCS+= fcrypt_b.c
30SSLASM+= des des-586 30SSLASM+= des des-586
31# # ec
32# CFLAGS+= -DECP_NISTZ256_ASM
33# SRCS+= ecp_nistz256.c
34# SSLASM+= ec ecp_nistz256-x86
35# md5 31# md5
36CFLAGS+= -DMD5_ASM 32CFLAGS+= -DMD5_ASM
37SSLASM+= md5 md5-586 33SSLASM+= md5 md5-586
diff --git a/src/lib/libcrypto/arch/sparc64/Makefile.inc b/src/lib/libcrypto/arch/sparc64/Makefile.inc
index 223c941f77..6ea1409c44 100644
--- a/src/lib/libcrypto/arch/sparc64/Makefile.inc
+++ b/src/lib/libcrypto/arch/sparc64/Makefile.inc
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile.inc,v 1.6 2023/01/13 17:27:26 miod Exp $ 1# $OpenBSD: Makefile.inc,v 1.7 2023/01/14 15:45:43 jsing Exp $
2 2
3# sparc64-specific libcrypto build rules 3# sparc64-specific libcrypto build rules
4 4
@@ -18,10 +18,6 @@ SRCS+= des_enc-sparc.S
18GENERATED+= des_enc-sparc.S 18GENERATED+= des_enc-sparc.S
19des_enc-sparc.S: ${LCRYPTO_SRC}/des/asm/des_enc.m4 19des_enc-sparc.S: ${LCRYPTO_SRC}/des/asm/des_enc.m4
20 m4 ${LCRYPTO_SRC}/des/asm/des_enc.m4 > ${.TARGET} 20 m4 ${LCRYPTO_SRC}/des/asm/des_enc.m4 > ${.TARGET}
21# # ec
22# CFLAGS+= -DECP_NISTZ256_ASM
23# SRCS+= ecp_nistz256.c
24# SSLASM+= ec ecp_nistz256-sparcv9
25# modes 21# modes
26CFLAGS+= -DGHASH_ASM 22CFLAGS+= -DGHASH_ASM
27SSLASM+= modes ghash-sparcv9 ghash-sparcv9 23SSLASM+= modes ghash-sparcv9 ghash-sparcv9
diff --git a/src/lib/libcrypto/ec/asm/ecp_nistz256-armv4.pl b/src/lib/libcrypto/ec/asm/ecp_nistz256-armv4.pl
deleted file mode 100644
index 9e6c65905f..0000000000
--- a/src/lib/libcrypto/ec/asm/ecp_nistz256-armv4.pl
+++ /dev/null
@@ -1,1733 +0,0 @@
1#! /usr/bin/env perl
2# $OpenBSD: ecp_nistz256-armv4.pl,v 1.2 2022/12/26 07:18:51 jmc Exp $
3#
4# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
5#
6# Licensed under the OpenSSL license (the "License"). You may not use
7# this file except in compliance with the License. You can obtain a copy
8# in the file LICENSE in the source distribution or at
9# https://www.openssl.org/source/license.html
10
11
12# ====================================================================
13# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
14# project. The module is, however, dual licensed under OpenSSL and
15# CRYPTOGAMS licenses depending on where you obtain it. For further
16# details see http://www.openssl.org/~appro/cryptogams/.
17# ====================================================================
18#
19# ECP_NISTZ256 module for ARMv4.
20#
21# October 2014.
22#
23# Original ECP_NISTZ256 submission targeting x86_64 is detailed in
24# http://eprint.iacr.org/2013/816. In the process of adaptation
25# original .c module was made 32-bit savvy in order to make this
26# implementation possible.
27#
28# with/without -DECP_NISTZ256_ASM
29# Cortex-A8 +53-170%
30# Cortex-A9 +76-205%
31# Cortex-A15 +100-316%
32# Snapdragon S4 +66-187%
33#
34# Ranges denote minimum and maximum improvement coefficients depending
35# on benchmark. Lower coefficients are for ECDSA sign, server-side
36# operation. Keep in mind that +200% means 3x improvement.
37
38$flavour = shift;
39if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; }
40else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} }
41
42if ($flavour && $flavour ne "void") {
43 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
44 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
45 ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
46 die "can't locate arm-xlate.pl";
47
48 open STDOUT,"| \"$^X\" $xlate $flavour $output";
49} else {
50 open STDOUT,">$output";
51}
52
53$code.=<<___;
54#include "arm_arch.h"
55
56.text
57#if defined(__thumb2__)
58.syntax unified
59.thumb
60#else
61.code 32
62#endif
63___
64
65$code.=<<___;
66.Lone:
67.long 1,0,0,0,0,0,0,0
68.align 6
69___
70
71########################################################################
72# common register layout, note that $t2 is link register, so that if
73# internal subroutine uses $t2, then it has to offload lr...
74
75($r_ptr,$a_ptr,$b_ptr,$ff,$a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$t1,$t2)=
76 map("r$_",(0..12,14));
77($t0,$t3)=($ff,$a_ptr);
78
79$code.=<<___;
80@ void ecp_nistz256_from_mont(BN_ULONG r0[8],const BN_ULONG r1[8]);
81.globl ecp_nistz256_from_mont
82.type ecp_nistz256_from_mont,%function
83ecp_nistz256_from_mont:
84 adr $b_ptr,.Lone
85 b .Lecp_nistz256_mul_mont
86.size ecp_nistz256_from_mont,.-ecp_nistz256_from_mont
87
88@ void ecp_nistz256_mul_by_2(BN_ULONG r0[8],const BN_ULONG r1[8]);
89.globl ecp_nistz256_mul_by_2
90.type ecp_nistz256_mul_by_2,%function
91.align 4
92ecp_nistz256_mul_by_2:
93 stmdb sp!,{r4-r12,lr}
94 bl __ecp_nistz256_mul_by_2
95#if __ARM_ARCH__>=5 || !defined(__thumb__)
96 ldmia sp!,{r4-r12,pc}
97#else
98 ldmia sp!,{r4-r12,lr}
99 bx lr @ interoperable with Thumb ISA:-)
100#endif
101.size ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
102
103.type __ecp_nistz256_mul_by_2,%function
104.align 4
105__ecp_nistz256_mul_by_2:
106 ldr $a0,[$a_ptr,#0]
107 ldr $a1,[$a_ptr,#4]
108 ldr $a2,[$a_ptr,#8]
109 adds $a0,$a0,$a0 @ a[0:7]+=a[0:7], i.e. add with itself
110 ldr $a3,[$a_ptr,#12]
111 adcs $a1,$a1,$a1
112 ldr $a4,[$a_ptr,#16]
113 adcs $a2,$a2,$a2
114 ldr $a5,[$a_ptr,#20]
115 adcs $a3,$a3,$a3
116 ldr $a6,[$a_ptr,#24]
117 adcs $a4,$a4,$a4
118 ldr $a7,[$a_ptr,#28]
119 adcs $a5,$a5,$a5
120 adcs $a6,$a6,$a6
121 mov $ff,#0
122 adcs $a7,$a7,$a7
123 adc $ff,$ff,#0
124
125 b .Lreduce_by_sub
126.size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2
127
128@ void ecp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8],
129@ const BN_ULONG r2[8]);
130.globl ecp_nistz256_add
131.type ecp_nistz256_add,%function
132.align 4
133ecp_nistz256_add:
134 stmdb sp!,{r4-r12,lr}
135 bl __ecp_nistz256_add
136#if __ARM_ARCH__>=5 || !defined(__thumb__)
137 ldmia sp!,{r4-r12,pc}
138#else
139 ldmia sp!,{r4-r12,lr}
140 bx lr @ interoperable with Thumb ISA:-)
141#endif
142.size ecp_nistz256_add,.-ecp_nistz256_add
143
144.type __ecp_nistz256_add,%function
145.align 4
146__ecp_nistz256_add:
147 str lr,[sp,#-4]! @ push lr
148
149 ldr $a0,[$a_ptr,#0]
150 ldr $a1,[$a_ptr,#4]
151 ldr $a2,[$a_ptr,#8]
152 ldr $a3,[$a_ptr,#12]
153 ldr $a4,[$a_ptr,#16]
154 ldr $t0,[$b_ptr,#0]
155 ldr $a5,[$a_ptr,#20]
156 ldr $t1,[$b_ptr,#4]
157 ldr $a6,[$a_ptr,#24]
158 ldr $t2,[$b_ptr,#8]
159 ldr $a7,[$a_ptr,#28]
160 ldr $t3,[$b_ptr,#12]
161 adds $a0,$a0,$t0
162 ldr $t0,[$b_ptr,#16]
163 adcs $a1,$a1,$t1
164 ldr $t1,[$b_ptr,#20]
165 adcs $a2,$a2,$t2
166 ldr $t2,[$b_ptr,#24]
167 adcs $a3,$a3,$t3
168 ldr $t3,[$b_ptr,#28]
169 adcs $a4,$a4,$t0
170 adcs $a5,$a5,$t1
171 adcs $a6,$a6,$t2
172 mov $ff,#0
173 adcs $a7,$a7,$t3
174 adc $ff,$ff,#0
175 ldr lr,[sp],#4 @ pop lr
176
177.Lreduce_by_sub:
178
179 @ if a+b >= modulus, subtract modulus.
180 @
181 @ But since comparison implies subtraction, we subtract
182 @ modulus and then add it back if subtraction borrowed.
183
184 subs $a0,$a0,#-1
185 sbcs $a1,$a1,#-1
186 sbcs $a2,$a2,#-1
187 sbcs $a3,$a3,#0
188 sbcs $a4,$a4,#0
189 sbcs $a5,$a5,#0
190 sbcs $a6,$a6,#1
191 sbcs $a7,$a7,#-1
192 sbc $ff,$ff,#0
193
194 @ Note that because mod has special form, i.e. consists of
195 @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by
196 @ using value of borrow as a whole or extracting single bit.
197 @ Follow $ff register...
198
199 adds $a0,$a0,$ff @ add synthesized modulus
200 adcs $a1,$a1,$ff
201 str $a0,[$r_ptr,#0]
202 adcs $a2,$a2,$ff
203 str $a1,[$r_ptr,#4]
204 adcs $a3,$a3,#0
205 str $a2,[$r_ptr,#8]
206 adcs $a4,$a4,#0
207 str $a3,[$r_ptr,#12]
208 adcs $a5,$a5,#0
209 str $a4,[$r_ptr,#16]
210 adcs $a6,$a6,$ff,lsr#31
211 str $a5,[$r_ptr,#20]
212 adcs $a7,$a7,$ff
213 str $a6,[$r_ptr,#24]
214 str $a7,[$r_ptr,#28]
215
216 mov pc,lr
217.size __ecp_nistz256_add,.-__ecp_nistz256_add
218
219@ void ecp_nistz256_mul_by_3(BN_ULONG r0[8],const BN_ULONG r1[8]);
220.globl ecp_nistz256_mul_by_3
221.type ecp_nistz256_mul_by_3,%function
222.align 4
223ecp_nistz256_mul_by_3:
224 stmdb sp!,{r4-r12,lr}
225 bl __ecp_nistz256_mul_by_3
226#if __ARM_ARCH__>=5 || !defined(__thumb__)
227 ldmia sp!,{r4-r12,pc}
228#else
229 ldmia sp!,{r4-r12,lr}
230 bx lr @ interoperable with Thumb ISA:-)
231#endif
232.size ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
233
234.type __ecp_nistz256_mul_by_3,%function
235.align 4
236__ecp_nistz256_mul_by_3:
237 str lr,[sp,#-4]! @ push lr
238
239 @ As multiplication by 3 is performed as 2*n+n, below are inline
240 @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see
241 @ corresponding subroutines for details.
242
243 ldr $a0,[$a_ptr,#0]
244 ldr $a1,[$a_ptr,#4]
245 ldr $a2,[$a_ptr,#8]
246 adds $a0,$a0,$a0 @ a[0:7]+=a[0:7]
247 ldr $a3,[$a_ptr,#12]
248 adcs $a1,$a1,$a1
249 ldr $a4,[$a_ptr,#16]
250 adcs $a2,$a2,$a2
251 ldr $a5,[$a_ptr,#20]
252 adcs $a3,$a3,$a3
253 ldr $a6,[$a_ptr,#24]
254 adcs $a4,$a4,$a4
255 ldr $a7,[$a_ptr,#28]
256 adcs $a5,$a5,$a5
257 adcs $a6,$a6,$a6
258 mov $ff,#0
259 adcs $a7,$a7,$a7
260 adc $ff,$ff,#0
261
262 subs $a0,$a0,#-1 @ .Lreduce_by_sub but without stores
263 sbcs $a1,$a1,#-1
264 sbcs $a2,$a2,#-1
265 sbcs $a3,$a3,#0
266 sbcs $a4,$a4,#0
267 sbcs $a5,$a5,#0
268 sbcs $a6,$a6,#1
269 sbcs $a7,$a7,#-1
270 sbc $ff,$ff,#0
271
272 adds $a0,$a0,$ff @ add synthesized modulus
273 adcs $a1,$a1,$ff
274 adcs $a2,$a2,$ff
275 adcs $a3,$a3,#0
276 adcs $a4,$a4,#0
277 ldr $b_ptr,[$a_ptr,#0]
278 adcs $a5,$a5,#0
279 ldr $t1,[$a_ptr,#4]
280 adcs $a6,$a6,$ff,lsr#31
281 ldr $t2,[$a_ptr,#8]
282 adc $a7,$a7,$ff
283
284 ldr $t0,[$a_ptr,#12]
285 adds $a0,$a0,$b_ptr @ 2*a[0:7]+=a[0:7]
286 ldr $b_ptr,[$a_ptr,#16]
287 adcs $a1,$a1,$t1
288 ldr $t1,[$a_ptr,#20]
289 adcs $a2,$a2,$t2
290 ldr $t2,[$a_ptr,#24]
291 adcs $a3,$a3,$t0
292 ldr $t3,[$a_ptr,#28]
293 adcs $a4,$a4,$b_ptr
294 adcs $a5,$a5,$t1
295 adcs $a6,$a6,$t2
296 mov $ff,#0
297 adcs $a7,$a7,$t3
298 adc $ff,$ff,#0
299 ldr lr,[sp],#4 @ pop lr
300
301 b .Lreduce_by_sub
302.size ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
303
304@ void ecp_nistz256_div_by_2(BN_ULONG r0[8],const BN_ULONG r1[8]);
305.globl ecp_nistz256_div_by_2
306.type ecp_nistz256_div_by_2,%function
307.align 4
308ecp_nistz256_div_by_2:
309 stmdb sp!,{r4-r12,lr}
310 bl __ecp_nistz256_div_by_2
311#if __ARM_ARCH__>=5 || !defined(__thumb__)
312 ldmia sp!,{r4-r12,pc}
313#else
314 ldmia sp!,{r4-r12,lr}
315 bx lr @ interoperable with Thumb ISA:-)
316#endif
317.size ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
318
319.type __ecp_nistz256_div_by_2,%function
320.align 4
321__ecp_nistz256_div_by_2:
322 @ ret = (a is odd ? a+mod : a) >> 1
323
324 ldr $a0,[$a_ptr,#0]
325 ldr $a1,[$a_ptr,#4]
326 ldr $a2,[$a_ptr,#8]
327 mov $ff,$a0,lsl#31 @ place least significant bit to most
328 @ significant position, now arithmetic
329 @ right shift by 31 will produce -1 or
330 @ 0, while logical right shift 1 or 0,
331 @ this is how modulus is conditionally
332 @ synthesized in this case...
333 ldr $a3,[$a_ptr,#12]
334 adds $a0,$a0,$ff,asr#31
335 ldr $a4,[$a_ptr,#16]
336 adcs $a1,$a1,$ff,asr#31
337 ldr $a5,[$a_ptr,#20]
338 adcs $a2,$a2,$ff,asr#31
339 ldr $a6,[$a_ptr,#24]
340 adcs $a3,$a3,#0
341 ldr $a7,[$a_ptr,#28]
342 adcs $a4,$a4,#0
343 mov $a0,$a0,lsr#1 @ a[0:7]>>=1, we can start early
344 @ because it doesn't affect flags
345 adcs $a5,$a5,#0
346 orr $a0,$a0,$a1,lsl#31
347 adcs $a6,$a6,$ff,lsr#31
348 mov $b_ptr,#0
349 adcs $a7,$a7,$ff,asr#31
350 mov $a1,$a1,lsr#1
351 adc $b_ptr,$b_ptr,#0 @ top-most carry bit from addition
352
353 orr $a1,$a1,$a2,lsl#31
354 mov $a2,$a2,lsr#1
355 str $a0,[$r_ptr,#0]
356 orr $a2,$a2,$a3,lsl#31
357 mov $a3,$a3,lsr#1
358 str $a1,[$r_ptr,#4]
359 orr $a3,$a3,$a4,lsl#31
360 mov $a4,$a4,lsr#1
361 str $a2,[$r_ptr,#8]
362 orr $a4,$a4,$a5,lsl#31
363 mov $a5,$a5,lsr#1
364 str $a3,[$r_ptr,#12]
365 orr $a5,$a5,$a6,lsl#31
366 mov $a6,$a6,lsr#1
367 str $a4,[$r_ptr,#16]
368 orr $a6,$a6,$a7,lsl#31
369 mov $a7,$a7,lsr#1
370 str $a5,[$r_ptr,#20]
371 orr $a7,$a7,$b_ptr,lsl#31 @ don't forget the top-most carry bit
372 str $a6,[$r_ptr,#24]
373 str $a7,[$r_ptr,#28]
374
375 mov pc,lr
376.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2
377
378@ void ecp_nistz256_sub(BN_ULONG r0[8],const BN_ULONG r1[8],
379@ const BN_ULONG r2[8]);
380.globl ecp_nistz256_sub
381.type ecp_nistz256_sub,%function
382.align 4
383ecp_nistz256_sub:
384 stmdb sp!,{r4-r12,lr}
385 bl __ecp_nistz256_sub
386#if __ARM_ARCH__>=5 || !defined(__thumb__)
387 ldmia sp!,{r4-r12,pc}
388#else
389 ldmia sp!,{r4-r12,lr}
390 bx lr @ interoperable with Thumb ISA:-)
391#endif
392.size ecp_nistz256_sub,.-ecp_nistz256_sub
393
394.type __ecp_nistz256_sub,%function
395.align 4
396__ecp_nistz256_sub:
397 str lr,[sp,#-4]! @ push lr
398
399 ldr $a0,[$a_ptr,#0]
400 ldr $a1,[$a_ptr,#4]
401 ldr $a2,[$a_ptr,#8]
402 ldr $a3,[$a_ptr,#12]
403 ldr $a4,[$a_ptr,#16]
404 ldr $t0,[$b_ptr,#0]
405 ldr $a5,[$a_ptr,#20]
406 ldr $t1,[$b_ptr,#4]
407 ldr $a6,[$a_ptr,#24]
408 ldr $t2,[$b_ptr,#8]
409 ldr $a7,[$a_ptr,#28]
410 ldr $t3,[$b_ptr,#12]
411 subs $a0,$a0,$t0
412 ldr $t0,[$b_ptr,#16]
413 sbcs $a1,$a1,$t1
414 ldr $t1,[$b_ptr,#20]
415 sbcs $a2,$a2,$t2
416 ldr $t2,[$b_ptr,#24]
417 sbcs $a3,$a3,$t3
418 ldr $t3,[$b_ptr,#28]
419 sbcs $a4,$a4,$t0
420 sbcs $a5,$a5,$t1
421 sbcs $a6,$a6,$t2
422 sbcs $a7,$a7,$t3
423 sbc $ff,$ff,$ff @ broadcast borrow bit
424 ldr lr,[sp],#4 @ pop lr
425
426.Lreduce_by_add:
427
428 @ if a-b borrows, add modulus.
429 @
430 @ Note that because mod has special form, i.e. consists of
431 @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by
432 @ broadcasting borrow bit to a register, $ff, and using it as
433 @ a whole or extracting single bit.
434
435 adds $a0,$a0,$ff @ add synthesized modulus
436 adcs $a1,$a1,$ff
437 str $a0,[$r_ptr,#0]
438 adcs $a2,$a2,$ff
439 str $a1,[$r_ptr,#4]
440 adcs $a3,$a3,#0
441 str $a2,[$r_ptr,#8]
442 adcs $a4,$a4,#0
443 str $a3,[$r_ptr,#12]
444 adcs $a5,$a5,#0
445 str $a4,[$r_ptr,#16]
446 adcs $a6,$a6,$ff,lsr#31
447 str $a5,[$r_ptr,#20]
448 adcs $a7,$a7,$ff
449 str $a6,[$r_ptr,#24]
450 str $a7,[$r_ptr,#28]
451
452 mov pc,lr
453.size __ecp_nistz256_sub,.-__ecp_nistz256_sub
454
455@ void ecp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]);
456.globl ecp_nistz256_neg
457.type ecp_nistz256_neg,%function
458.align 4
459ecp_nistz256_neg:
460 stmdb sp!,{r4-r12,lr}
461 bl __ecp_nistz256_neg
462#if __ARM_ARCH__>=5 || !defined(__thumb__)
463 ldmia sp!,{r4-r12,pc}
464#else
465 ldmia sp!,{r4-r12,lr}
466 bx lr @ interoperable with Thumb ISA:-)
467#endif
468.size ecp_nistz256_neg,.-ecp_nistz256_neg
469
470.type __ecp_nistz256_neg,%function
471.align 4
472__ecp_nistz256_neg:
473 ldr $a0,[$a_ptr,#0]
474 eor $ff,$ff,$ff
475 ldr $a1,[$a_ptr,#4]
476 ldr $a2,[$a_ptr,#8]
477 subs $a0,$ff,$a0
478 ldr $a3,[$a_ptr,#12]
479 sbcs $a1,$ff,$a1
480 ldr $a4,[$a_ptr,#16]
481 sbcs $a2,$ff,$a2
482 ldr $a5,[$a_ptr,#20]
483 sbcs $a3,$ff,$a3
484 ldr $a6,[$a_ptr,#24]
485 sbcs $a4,$ff,$a4
486 ldr $a7,[$a_ptr,#28]
487 sbcs $a5,$ff,$a5
488 sbcs $a6,$ff,$a6
489 sbcs $a7,$ff,$a7
490 sbc $ff,$ff,$ff
491
492 b .Lreduce_by_add
493.size __ecp_nistz256_neg,.-__ecp_nistz256_neg
494___
495{
496my @acc=map("r$_",(3..11));
497my ($t0,$t1,$bj,$t2,$t3)=map("r$_",(0,1,2,12,14));
498
499$code.=<<___;
500@ void ecp_nistz256_sqr_mont(BN_ULONG r0[8],const BN_ULONG r1[8]);
501.globl ecp_nistz256_sqr_mont
502.type ecp_nistz256_sqr_mont,%function
503.align 4
504ecp_nistz256_sqr_mont:
505 mov $b_ptr,$a_ptr
506 b .Lecp_nistz256_mul_mont
507.size ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
508
509@ void ecp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8],
510@ const BN_ULONG r2[8]);
511.globl ecp_nistz256_mul_mont
512.type ecp_nistz256_mul_mont,%function
513.align 4
514ecp_nistz256_mul_mont:
515.Lecp_nistz256_mul_mont:
516 stmdb sp!,{r4-r12,lr}
517 bl __ecp_nistz256_mul_mont
518#if __ARM_ARCH__>=5 || !defined(__thumb__)
519 ldmia sp!,{r4-r12,pc}
520#else
521 ldmia sp!,{r4-r12,lr}
522 bx lr @ interoperable with Thumb ISA:-)
523#endif
524.size ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
525
526.type __ecp_nistz256_mul_mont,%function
527.align 4
528__ecp_nistz256_mul_mont:
529 stmdb sp!,{r0-r2,lr} @ make a copy of arguments too
530
531 ldr $bj,[$b_ptr,#0] @ b[0]
532 ldmia $a_ptr,{@acc[1]-@acc[8]}
533
534 umull @acc[0],$t3,@acc[1],$bj @ r[0]=a[0]*b[0]
535 stmdb sp!,{$acc[1]-@acc[8]} @ copy a[0-7] to stack, so
536 @ that it can be addressed
537 @ without spending register
538 @ on address
539 umull @acc[1],$t0,@acc[2],$bj @ r[1]=a[1]*b[0]
540 umull @acc[2],$t1,@acc[3],$bj
541 adds @acc[1],@acc[1],$t3 @ accumulate high part of mult
542 umull @acc[3],$t2,@acc[4],$bj
543 adcs @acc[2],@acc[2],$t0
544 umull @acc[4],$t3,@acc[5],$bj
545 adcs @acc[3],@acc[3],$t1
546 umull @acc[5],$t0,@acc[6],$bj
547 adcs @acc[4],@acc[4],$t2
548 umull @acc[6],$t1,@acc[7],$bj
549 adcs @acc[5],@acc[5],$t3
550 umull @acc[7],$t2,@acc[8],$bj
551 adcs @acc[6],@acc[6],$t0
552 adcs @acc[7],@acc[7],$t1
553 eor $t3,$t3,$t3 @ first overflow bit is zero
554 adc @acc[8],$t2,#0
555___
556for(my $i=1;$i<8;$i++) {
557my $t4=@acc[0];
558
559 # Reduction iteration is normally performed by accumulating
560 # result of multiplication of modulus by "magic" digit [and
561 # omitting least significant word, which is guaranteed to
562 # be 0], but thanks to special form of modulus and "magic"
563 # digit being equal to least significant word, it can be
564 # performed with additions and subtractions alone. Indeed:
565 #
566 # ffff.0001.0000.0000.0000.ffff.ffff.ffff
567 # * abcd
568 # + xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
569 #
570 # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
571 # rewrite above as:
572 #
573 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
574 # + abcd.0000.abcd.0000.0000.abcd.0000.0000.0000
575 # - abcd.0000.0000.0000.0000.0000.0000.abcd
576 #
577 # or marking redundant operations:
578 #
579 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.----
580 # + abcd.0000.abcd.0000.0000.abcd.----.----.----
581 # - abcd.----.----.----.----.----.----.----
582
583$code.=<<___;
584 @ multiplication-less reduction $i
585 adds @acc[3],@acc[3],@acc[0] @ r[3]+=r[0]
586 ldr $bj,[sp,#40] @ restore b_ptr
587 adcs @acc[4],@acc[4],#0 @ r[4]+=0
588 adcs @acc[5],@acc[5],#0 @ r[5]+=0
589 adcs @acc[6],@acc[6],@acc[0] @ r[6]+=r[0]
590 ldr $t1,[sp,#0] @ load a[0]
591 adcs @acc[7],@acc[7],#0 @ r[7]+=0
592 ldr $bj,[$bj,#4*$i] @ load b[i]
593 adcs @acc[8],@acc[8],@acc[0] @ r[8]+=r[0]
594 eor $t0,$t0,$t0
595 adc $t3,$t3,#0 @ overflow bit
596 subs @acc[7],@acc[7],@acc[0] @ r[7]-=r[0]
597 ldr $t2,[sp,#4] @ a[1]
598 sbcs @acc[8],@acc[8],#0 @ r[8]-=0
599 umlal @acc[1],$t0,$t1,$bj @ "r[0]"+=a[0]*b[i]
600 eor $t1,$t1,$t1
601 sbc @acc[0],$t3,#0 @ overflow bit, keep in mind
602 @ that netto result is
603 @ addition of a value which
604 @ makes underflow impossible
605
606 ldr $t3,[sp,#8] @ a[2]
607 umlal @acc[2],$t1,$t2,$bj @ "r[1]"+=a[1]*b[i]
608 str @acc[0],[sp,#36] @ temporarily offload overflow
609 eor $t2,$t2,$t2
610 ldr $t4,[sp,#12] @ a[3], $t4 is alias @acc[0]
611 umlal @acc[3],$t2,$t3,$bj @ "r[2]"+=a[2]*b[i]
612 eor $t3,$t3,$t3
613 adds @acc[2],@acc[2],$t0 @ accumulate high part of mult
614 ldr $t0,[sp,#16] @ a[4]
615 umlal @acc[4],$t3,$t4,$bj @ "r[3]"+=a[3]*b[i]
616 eor $t4,$t4,$t4
617 adcs @acc[3],@acc[3],$t1
618 ldr $t1,[sp,#20] @ a[5]
619 umlal @acc[5],$t4,$t0,$bj @ "r[4]"+=a[4]*b[i]
620 eor $t0,$t0,$t0
621 adcs @acc[4],@acc[4],$t2
622 ldr $t2,[sp,#24] @ a[6]
623 umlal @acc[6],$t0,$t1,$bj @ "r[5]"+=a[5]*b[i]
624 eor $t1,$t1,$t1
625 adcs @acc[5],@acc[5],$t3
626 ldr $t3,[sp,#28] @ a[7]
627 umlal @acc[7],$t1,$t2,$bj @ "r[6]"+=a[6]*b[i]
628 eor $t2,$t2,$t2
629 adcs @acc[6],@acc[6],$t4
630 ldr @acc[0],[sp,#36] @ restore overflow bit
631 umlal @acc[8],$t2,$t3,$bj @ "r[7]"+=a[7]*b[i]
632 eor $t3,$t3,$t3
633 adcs @acc[7],@acc[7],$t0
634 adcs @acc[8],@acc[8],$t1
635 adcs @acc[0],$acc[0],$t2
636 adc $t3,$t3,#0 @ new overflow bit
637___
638 push(@acc,shift(@acc)); # rotate registers, so that
639 # "r[i]" becomes r[i]
640}
641$code.=<<___;
642 @ last multiplication-less reduction
643 adds @acc[3],@acc[3],@acc[0]
644 ldr $r_ptr,[sp,#32] @ restore r_ptr
645 adcs @acc[4],@acc[4],#0
646 adcs @acc[5],@acc[5],#0
647 adcs @acc[6],@acc[6],@acc[0]
648 adcs @acc[7],@acc[7],#0
649 adcs @acc[8],@acc[8],@acc[0]
650 adc $t3,$t3,#0
651 subs @acc[7],@acc[7],@acc[0]
652 sbcs @acc[8],@acc[8],#0
653 sbc @acc[0],$t3,#0 @ overflow bit
654
655 @ Final step is "if result > mod, subtract mod", but we do it
656 @ "other way around", namely subtract modulus from result
657 @ and if it borrowed, add modulus back.
658
659 adds @acc[1],@acc[1],#1 @ subs @acc[1],@acc[1],#-1
660 adcs @acc[2],@acc[2],#0 @ sbcs @acc[2],@acc[2],#-1
661 adcs @acc[3],@acc[3],#0 @ sbcs @acc[3],@acc[3],#-1
662 sbcs @acc[4],@acc[4],#0
663 sbcs @acc[5],@acc[5],#0
664 sbcs @acc[6],@acc[6],#0
665 sbcs @acc[7],@acc[7],#1
666 adcs @acc[8],@acc[8],#0 @ sbcs @acc[8],@acc[8],#-1
667 ldr lr,[sp,#44] @ restore lr
668 sbc @acc[0],@acc[0],#0 @ broadcast borrow bit
669 add sp,sp,#48
670
671 @ Note that because mod has special form, i.e. consists of
672 @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by
673 @ broadcasting borrow bit to a register, @acc[0], and using it as
674 @ a whole or extracting single bit.
675
676 adds @acc[1],@acc[1],@acc[0] @ add modulus or zero
677 adcs @acc[2],@acc[2],@acc[0]
678 str @acc[1],[$r_ptr,#0]
679 adcs @acc[3],@acc[3],@acc[0]
680 str @acc[2],[$r_ptr,#4]
681 adcs @acc[4],@acc[4],#0
682 str @acc[3],[$r_ptr,#8]
683 adcs @acc[5],@acc[5],#0
684 str @acc[4],[$r_ptr,#12]
685 adcs @acc[6],@acc[6],#0
686 str @acc[5],[$r_ptr,#16]
687 adcs @acc[7],@acc[7],@acc[0],lsr#31
688 str @acc[6],[$r_ptr,#20]
689 adc @acc[8],@acc[8],@acc[0]
690 str @acc[7],[$r_ptr,#24]
691 str @acc[8],[$r_ptr,#28]
692
693 mov pc,lr
694.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont
695___
696}
697
698{
699my ($out,$inp,$index,$mask)=map("r$_",(0..3));
700$code.=<<___;
701@ void ecp_nistz256_select_w5(P256_POINT *r0,const void *r1,
702@ int r2);
703.globl ecp_nistz256_select_w5
704.type ecp_nistz256_select_w5,%function
705.align 5
706ecp_nistz256_select_w5:
707 stmdb sp!,{r4-r11}
708
709 cmp $index,#0
710 mov $mask,#0
711#ifdef __thumb2__
712 itt ne
713#endif
714 subne $index,$index,#1
715 movne $mask,#-1
716 add $inp,$inp,$index,lsl#2
717
718 ldr r4,[$inp,#64*0]
719 ldr r5,[$inp,#64*1]
720 ldr r6,[$inp,#64*2]
721 and r4,r4,$mask
722 ldr r7,[$inp,#64*3]
723 and r5,r5,$mask
724 ldr r8,[$inp,#64*4]
725 and r6,r6,$mask
726 ldr r9,[$inp,#64*5]
727 and r7,r7,$mask
728 ldr r10,[$inp,#64*6]
729 and r8,r8,$mask
730 ldr r11,[$inp,#64*7]
731 add $inp,$inp,#64*8
732 and r9,r9,$mask
733 and r10,r10,$mask
734 and r11,r11,$mask
735 stmia $out!,{r4-r11} @ X
736
737 ldr r4,[$inp,#64*0]
738 ldr r5,[$inp,#64*1]
739 ldr r6,[$inp,#64*2]
740 and r4,r4,$mask
741 ldr r7,[$inp,#64*3]
742 and r5,r5,$mask
743 ldr r8,[$inp,#64*4]
744 and r6,r6,$mask
745 ldr r9,[$inp,#64*5]
746 and r7,r7,$mask
747 ldr r10,[$inp,#64*6]
748 and r8,r8,$mask
749 ldr r11,[$inp,#64*7]
750 add $inp,$inp,#64*8
751 and r9,r9,$mask
752 and r10,r10,$mask
753 and r11,r11,$mask
754 stmia $out!,{r4-r11} @ Y
755
756 ldr r4,[$inp,#64*0]
757 ldr r5,[$inp,#64*1]
758 ldr r6,[$inp,#64*2]
759 and r4,r4,$mask
760 ldr r7,[$inp,#64*3]
761 and r5,r5,$mask
762 ldr r8,[$inp,#64*4]
763 and r6,r6,$mask
764 ldr r9,[$inp,#64*5]
765 and r7,r7,$mask
766 ldr r10,[$inp,#64*6]
767 and r8,r8,$mask
768 ldr r11,[$inp,#64*7]
769 and r9,r9,$mask
770 and r10,r10,$mask
771 and r11,r11,$mask
772 stmia $out,{r4-r11} @ Z
773
774 ldmia sp!,{r4-r11}
775#if __ARM_ARCH__>=5 || defined(__thumb__)
776 bx lr
777#else
778 mov pc,lr
779#endif
780.size ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
781
782@ void ecp_nistz256_select_w7(P256_POINT_AFFINE *r0,const void *r1,
783@ int r2);
784.globl ecp_nistz256_select_w7
785.type ecp_nistz256_select_w7,%function
786.align 5
787ecp_nistz256_select_w7:
788 stmdb sp!,{r4-r7}
789
790 cmp $index,#0
791 mov $mask,#0
792#ifdef __thumb2__
793 itt ne
794#endif
795 subne $index,$index,#1
796 movne $mask,#-1
797 add $inp,$inp,$index
798 mov $index,#64/4
799 nop
800.Loop_select_w7:
801 ldrb r4,[$inp,#64*0]
802 subs $index,$index,#1
803 ldrb r5,[$inp,#64*1]
804 ldrb r6,[$inp,#64*2]
805 ldrb r7,[$inp,#64*3]
806 add $inp,$inp,#64*4
807 orr r4,r4,r5,lsl#8
808 orr r4,r4,r6,lsl#16
809 orr r4,r4,r7,lsl#24
810 and r4,r4,$mask
811 str r4,[$out],#4
812 bne .Loop_select_w7
813
814 ldmia sp!,{r4-r7}
815#if __ARM_ARCH__>=5 || defined(__thumb__)
816 bx lr
817#else
818 mov pc,lr
819#endif
820.size ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
821___
822}
823if (0) {
824# In comparison to integer-only equivalent of below subroutine:
825#
826# Cortex-A8 +10%
827# Cortex-A9 -10%
828# Snapdragon S4 +5%
829#
830# As not all time is spent in multiplication, overall impact is deemed
831# too low to care about.
832
833my ($A0,$A1,$A2,$A3,$Bi,$zero,$temp)=map("d$_",(0..7));
834my $mask="q4";
835my $mult="q5";
836my @AxB=map("q$_",(8..15));
837
838my ($rptr,$aptr,$bptr,$toutptr)=map("r$_",(0..3));
839
840$code.=<<___;
841#if __ARM_ARCH__>=7
842.fpu neon
843
844.globl ecp_nistz256_mul_mont_neon
845.type ecp_nistz256_mul_mont_neon,%function
846.align 5
847ecp_nistz256_mul_mont_neon:
848 mov ip,sp
849 stmdb sp!,{r4-r9}
850 vstmdb sp!,{q4-q5} @ ABI specification says so
851
852 sub $toutptr,sp,#40
853 vld1.32 {${Bi}[0]},[$bptr,:32]!
854 veor $zero,$zero,$zero
855 vld1.32 {$A0-$A3}, [$aptr] @ can't specify :32 :-(
856 vzip.16 $Bi,$zero
857 mov sp,$toutptr @ alloca
858 vmov.i64 $mask,#0xffff
859
860 vmull.u32 @AxB[0],$Bi,${A0}[0]
861 vmull.u32 @AxB[1],$Bi,${A0}[1]
862 vmull.u32 @AxB[2],$Bi,${A1}[0]
863 vmull.u32 @AxB[3],$Bi,${A1}[1]
864 vshr.u64 $temp,@AxB[0]#lo,#16
865 vmull.u32 @AxB[4],$Bi,${A2}[0]
866 vadd.u64 @AxB[0]#hi,@AxB[0]#hi,$temp
867 vmull.u32 @AxB[5],$Bi,${A2}[1]
868 vshr.u64 $temp,@AxB[0]#hi,#16 @ upper 32 bits of a[0]*b[0]
869 vmull.u32 @AxB[6],$Bi,${A3}[0]
870 vand.u64 @AxB[0],@AxB[0],$mask @ lower 32 bits of a[0]*b[0]
871 vmull.u32 @AxB[7],$Bi,${A3}[1]
872___
873for($i=1;$i<8;$i++) {
874$code.=<<___;
875 vld1.32 {${Bi}[0]},[$bptr,:32]!
876 veor $zero,$zero,$zero
877 vadd.u64 @AxB[1]#lo,@AxB[1]#lo,$temp @ reduction
878 vshl.u64 $mult,@AxB[0],#32
879 vadd.u64 @AxB[3],@AxB[3],@AxB[0]
880 vsub.u64 $mult,$mult,@AxB[0]
881 vzip.16 $Bi,$zero
882 vadd.u64 @AxB[6],@AxB[6],@AxB[0]
883 vadd.u64 @AxB[7],@AxB[7],$mult
884___
885 push(@AxB,shift(@AxB));
886$code.=<<___;
887 vmlal.u32 @AxB[0],$Bi,${A0}[0]
888 vmlal.u32 @AxB[1],$Bi,${A0}[1]
889 vmlal.u32 @AxB[2],$Bi,${A1}[0]
890 vmlal.u32 @AxB[3],$Bi,${A1}[1]
891 vshr.u64 $temp,@AxB[0]#lo,#16
892 vmlal.u32 @AxB[4],$Bi,${A2}[0]
893 vadd.u64 @AxB[0]#hi,@AxB[0]#hi,$temp
894 vmlal.u32 @AxB[5],$Bi,${A2}[1]
895 vshr.u64 $temp,@AxB[0]#hi,#16 @ upper 33 bits of a[0]*b[i]+t[0]
896 vmlal.u32 @AxB[6],$Bi,${A3}[0]
897 vand.u64 @AxB[0],@AxB[0],$mask @ lower 32 bits of a[0]*b[0]
898 vmull.u32 @AxB[7],$Bi,${A3}[1]
899___
900}
901$code.=<<___;
902 vadd.u64 @AxB[1]#lo,@AxB[1]#lo,$temp @ last reduction
903 vshl.u64 $mult,@AxB[0],#32
904 vadd.u64 @AxB[3],@AxB[3],@AxB[0]
905 vsub.u64 $mult,$mult,@AxB[0]
906 vadd.u64 @AxB[6],@AxB[6],@AxB[0]
907 vadd.u64 @AxB[7],@AxB[7],$mult
908
909 vshr.u64 $temp,@AxB[1]#lo,#16 @ convert
910 vadd.u64 @AxB[1]#hi,@AxB[1]#hi,$temp
911 vshr.u64 $temp,@AxB[1]#hi,#16
912 vzip.16 @AxB[1]#lo,@AxB[1]#hi
913___
914foreach (2..7) {
915$code.=<<___;
916 vadd.u64 @AxB[$_]#lo,@AxB[$_]#lo,$temp
917 vst1.32 {@AxB[$_-1]#lo[0]},[$toutptr,:32]!
918 vshr.u64 $temp,@AxB[$_]#lo,#16
919 vadd.u64 @AxB[$_]#hi,@AxB[$_]#hi,$temp
920 vshr.u64 $temp,@AxB[$_]#hi,#16
921 vzip.16 @AxB[$_]#lo,@AxB[$_]#hi
922___
923}
924$code.=<<___;
925 vst1.32 {@AxB[7]#lo[0]},[$toutptr,:32]!
926 vst1.32 {$temp},[$toutptr] @ upper 33 bits
927
928 ldr r1,[sp,#0]
929 ldr r2,[sp,#4]
930 ldr r3,[sp,#8]
931 subs r1,r1,#-1
932 ldr r4,[sp,#12]
933 sbcs r2,r2,#-1
934 ldr r5,[sp,#16]
935 sbcs r3,r3,#-1
936 ldr r6,[sp,#20]
937 sbcs r4,r4,#0
938 ldr r7,[sp,#24]
939 sbcs r5,r5,#0
940 ldr r8,[sp,#28]
941 sbcs r6,r6,#0
942 ldr r9,[sp,#32] @ top-most bit
943 sbcs r7,r7,#1
944 sub sp,ip,#40+16
945 sbcs r8,r8,#-1
946 sbc r9,r9,#0
947 vldmia sp!,{q4-q5}
948
949 adds r1,r1,r9
950 adcs r2,r2,r9
951 str r1,[$rptr,#0]
952 adcs r3,r3,r9
953 str r2,[$rptr,#4]
954 adcs r4,r4,#0
955 str r3,[$rptr,#8]
956 adcs r5,r5,#0
957 str r4,[$rptr,#12]
958 adcs r6,r6,#0
959 str r5,[$rptr,#16]
960 adcs r7,r7,r9,lsr#31
961 str r6,[$rptr,#20]
962 adcs r8,r8,r9
963 str r7,[$rptr,#24]
964 str r8,[$rptr,#28]
965
966 ldmia sp!,{r4-r9}
967 bx lr
968.size ecp_nistz256_mul_mont_neon,.-ecp_nistz256_mul_mont_neon
969#endif
970___
971}
972
973{{{
974########################################################################
975# Below $aN assignment matches order in which 256-bit result appears in
976# register bank at return from __ecp_nistz256_mul_mont, so that we can
977# skip over reloading it from memory. This means that below functions
978# use custom calling sequence accepting 256-bit input in registers,
979# output pointer in r0, $r_ptr, and optional pointer in r2, $b_ptr.
980#
981# See their "normal" counterparts for insights on calculations.
982
983my ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,
984 $t0,$t1,$t2,$t3)=map("r$_",(11,3..10,12,14,1));
985my $ff=$b_ptr;
986
987$code.=<<___;
988.type __ecp_nistz256_sub_from,%function
989.align 5
990__ecp_nistz256_sub_from:
991 str lr,[sp,#-4]! @ push lr
992
993 ldr $t0,[$b_ptr,#0]
994 ldr $t1,[$b_ptr,#4]
995 ldr $t2,[$b_ptr,#8]
996 ldr $t3,[$b_ptr,#12]
997 subs $a0,$a0,$t0
998 ldr $t0,[$b_ptr,#16]
999 sbcs $a1,$a1,$t1
1000 ldr $t1,[$b_ptr,#20]
1001 sbcs $a2,$a2,$t2
1002 ldr $t2,[$b_ptr,#24]
1003 sbcs $a3,$a3,$t3
1004 ldr $t3,[$b_ptr,#28]
1005 sbcs $a4,$a4,$t0
1006 sbcs $a5,$a5,$t1
1007 sbcs $a6,$a6,$t2
1008 sbcs $a7,$a7,$t3
1009 sbc $ff,$ff,$ff @ broadcast borrow bit
1010 ldr lr,[sp],#4 @ pop lr
1011
1012 adds $a0,$a0,$ff @ add synthesized modulus
1013 adcs $a1,$a1,$ff
1014 str $a0,[$r_ptr,#0]
1015 adcs $a2,$a2,$ff
1016 str $a1,[$r_ptr,#4]
1017 adcs $a3,$a3,#0
1018 str $a2,[$r_ptr,#8]
1019 adcs $a4,$a4,#0
1020 str $a3,[$r_ptr,#12]
1021 adcs $a5,$a5,#0
1022 str $a4,[$r_ptr,#16]
1023 adcs $a6,$a6,$ff,lsr#31
1024 str $a5,[$r_ptr,#20]
1025 adcs $a7,$a7,$ff
1026 str $a6,[$r_ptr,#24]
1027 str $a7,[$r_ptr,#28]
1028
1029 mov pc,lr
1030.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from
1031
1032.type __ecp_nistz256_sub_morf,%function
1033.align 5
1034__ecp_nistz256_sub_morf:
1035 str lr,[sp,#-4]! @ push lr
1036
1037 ldr $t0,[$b_ptr,#0]
1038 ldr $t1,[$b_ptr,#4]
1039 ldr $t2,[$b_ptr,#8]
1040 ldr $t3,[$b_ptr,#12]
1041 subs $a0,$t0,$a0
1042 ldr $t0,[$b_ptr,#16]
1043 sbcs $a1,$t1,$a1
1044 ldr $t1,[$b_ptr,#20]
1045 sbcs $a2,$t2,$a2
1046 ldr $t2,[$b_ptr,#24]
1047 sbcs $a3,$t3,$a3
1048 ldr $t3,[$b_ptr,#28]
1049 sbcs $a4,$t0,$a4
1050 sbcs $a5,$t1,$a5
1051 sbcs $a6,$t2,$a6
1052 sbcs $a7,$t3,$a7
1053 sbc $ff,$ff,$ff @ broadcast borrow bit
1054 ldr lr,[sp],#4 @ pop lr
1055
1056 adds $a0,$a0,$ff @ add synthesized modulus
1057 adcs $a1,$a1,$ff
1058 str $a0,[$r_ptr,#0]
1059 adcs $a2,$a2,$ff
1060 str $a1,[$r_ptr,#4]
1061 adcs $a3,$a3,#0
1062 str $a2,[$r_ptr,#8]
1063 adcs $a4,$a4,#0
1064 str $a3,[$r_ptr,#12]
1065 adcs $a5,$a5,#0
1066 str $a4,[$r_ptr,#16]
1067 adcs $a6,$a6,$ff,lsr#31
1068 str $a5,[$r_ptr,#20]
1069 adcs $a7,$a7,$ff
1070 str $a6,[$r_ptr,#24]
1071 str $a7,[$r_ptr,#28]
1072
1073 mov pc,lr
1074.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf
1075
1076.type __ecp_nistz256_add_self,%function
1077.align 4
1078__ecp_nistz256_add_self:
1079 adds $a0,$a0,$a0 @ a[0:7]+=a[0:7]
1080 adcs $a1,$a1,$a1
1081 adcs $a2,$a2,$a2
1082 adcs $a3,$a3,$a3
1083 adcs $a4,$a4,$a4
1084 adcs $a5,$a5,$a5
1085 adcs $a6,$a6,$a6
1086 mov $ff,#0
1087 adcs $a7,$a7,$a7
1088 adc $ff,$ff,#0
1089
1090 @ if a+b >= modulus, subtract modulus.
1091 @
1092 @ But since comparison implies subtraction, we subtract
1093 @ modulus and then add it back if subtraction borrowed.
1094
1095 subs $a0,$a0,#-1
1096 sbcs $a1,$a1,#-1
1097 sbcs $a2,$a2,#-1
1098 sbcs $a3,$a3,#0
1099 sbcs $a4,$a4,#0
1100 sbcs $a5,$a5,#0
1101 sbcs $a6,$a6,#1
1102 sbcs $a7,$a7,#-1
1103 sbc $ff,$ff,#0
1104
1105 @ Note that because mod has special form, i.e. consists of
1106 @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by
1107 @ using value of borrow as a whole or extracting single bit.
1108 @ Follow $ff register...
1109
1110 adds $a0,$a0,$ff @ add synthesized modulus
1111 adcs $a1,$a1,$ff
1112 str $a0,[$r_ptr,#0]
1113 adcs $a2,$a2,$ff
1114 str $a1,[$r_ptr,#4]
1115 adcs $a3,$a3,#0
1116 str $a2,[$r_ptr,#8]
1117 adcs $a4,$a4,#0
1118 str $a3,[$r_ptr,#12]
1119 adcs $a5,$a5,#0
1120 str $a4,[$r_ptr,#16]
1121 adcs $a6,$a6,$ff,lsr#31
1122 str $a5,[$r_ptr,#20]
1123 adcs $a7,$a7,$ff
1124 str $a6,[$r_ptr,#24]
1125 str $a7,[$r_ptr,#28]
1126
1127 mov pc,lr
1128.size __ecp_nistz256_add_self,.-__ecp_nistz256_add_self
1129
1130___
1131
1132########################################################################
1133# following subroutines are "literal" implementation of those found in
1134# ecp_nistz256.c
1135#
1136########################################################################
1137# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp);
1138#
1139{
1140my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4));
1141# above map() describes stack layout with 5 temporary
1142# 256-bit vectors on top. Then note that we push
1143# starting from r0, which means that we have copy of
1144# input arguments just below these temporary vectors.
1145
1146$code.=<<___;
1147.globl ecp_nistz256_point_double
1148.type ecp_nistz256_point_double,%function
1149.align 5
1150ecp_nistz256_point_double:
1151 stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional
1152 sub sp,sp,#32*5
1153
1154.Lpoint_double_shortcut:
1155 add r3,sp,#$in_x
1156 ldmia $a_ptr!,{r4-r11} @ copy in_x
1157 stmia r3,{r4-r11}
1158
1159 add $r_ptr,sp,#$S
1160 bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y);
1161
1162 add $b_ptr,$a_ptr,#32
1163 add $a_ptr,$a_ptr,#32
1164 add $r_ptr,sp,#$Zsqr
1165 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z);
1166
1167 add $a_ptr,sp,#$S
1168 add $b_ptr,sp,#$S
1169 add $r_ptr,sp,#$S
1170 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S);
1171
1172 ldr $b_ptr,[sp,#32*5+4]
1173 add $a_ptr,$b_ptr,#32
1174 add $b_ptr,$b_ptr,#64
1175 add $r_ptr,sp,#$tmp0
1176 bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y);
1177
1178 ldr $r_ptr,[sp,#32*5]
1179 add $r_ptr,$r_ptr,#64
1180 bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0);
1181
1182 add $a_ptr,sp,#$in_x
1183 add $b_ptr,sp,#$Zsqr
1184 add $r_ptr,sp,#$M
1185 bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr);
1186
1187 add $a_ptr,sp,#$in_x
1188 add $b_ptr,sp,#$Zsqr
1189 add $r_ptr,sp,#$Zsqr
1190 bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr);
1191
1192 add $a_ptr,sp,#$S
1193 add $b_ptr,sp,#$S
1194 add $r_ptr,sp,#$tmp0
1195 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S);
1196
1197 add $a_ptr,sp,#$Zsqr
1198 add $b_ptr,sp,#$M
1199 add $r_ptr,sp,#$M
1200 bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr);
1201
1202 ldr $r_ptr,[sp,#32*5]
1203 add $a_ptr,sp,#$tmp0
1204 add $r_ptr,$r_ptr,#32
1205 bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0);
1206
1207 add $a_ptr,sp,#$M
1208 add $r_ptr,sp,#$M
1209 bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M);
1210
1211 add $a_ptr,sp,#$in_x
1212 add $b_ptr,sp,#$S
1213 add $r_ptr,sp,#$S
1214 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x);
1215
1216 add $r_ptr,sp,#$tmp0
1217 bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S);
1218
1219 ldr $r_ptr,[sp,#32*5]
1220 add $a_ptr,sp,#$M
1221 add $b_ptr,sp,#$M
1222 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M);
1223
1224 add $b_ptr,sp,#$tmp0
1225 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0);
1226
1227 add $b_ptr,sp,#$S
1228 add $r_ptr,sp,#$S
1229 bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x);
1230
1231 add $a_ptr,sp,#$M
1232 add $b_ptr,sp,#$S
1233 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M);
1234
1235 ldr $r_ptr,[sp,#32*5]
1236 add $b_ptr,$r_ptr,#32
1237 add $r_ptr,$r_ptr,#32
1238 bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y);
1239
1240 add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3"
1241#if __ARM_ARCH__>=5 || !defined(__thumb__)
1242 ldmia sp!,{r4-r12,pc}
1243#else
1244 ldmia sp!,{r4-r12,lr}
1245 bx lr @ interoperable with Thumb ISA:-)
1246#endif
1247.size ecp_nistz256_point_double,.-ecp_nistz256_point_double
1248___
1249}
1250
1251########################################################################
1252# void ecp_nistz256_point_add(P256_POINT *out,const P256_POINT *in1,
1253# const P256_POINT *in2);
1254{
1255my ($res_x,$res_y,$res_z,
1256 $in1_x,$in1_y,$in1_z,
1257 $in2_x,$in2_y,$in2_z,
1258 $H,$Hsqr,$R,$Rsqr,$Hcub,
1259 $U1,$U2,$S1,$S2)=map(32*$_,(0..17));
1260my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
1261# above map() describes stack layout with 18 temporary
1262# 256-bit vectors on top. Then note that we push
1263# starting from r0, which means that we have copy of
1264# input arguments just below these temporary vectors.
1265# We use three of them for !in1infty, !in2intfy and
1266# result of check for zero.
1267
1268$code.=<<___;
1269.globl ecp_nistz256_point_add
1270.type ecp_nistz256_point_add,%function
1271.align 5
1272ecp_nistz256_point_add:
1273 stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional
1274 sub sp,sp,#32*18+16
1275
1276 ldmia $b_ptr!,{r4-r11} @ copy in2_x
1277 add r3,sp,#$in2_x
1278 stmia r3!,{r4-r11}
1279 ldmia $b_ptr!,{r4-r11} @ copy in2_y
1280 stmia r3!,{r4-r11}
1281 ldmia $b_ptr,{r4-r11} @ copy in2_z
1282 orr r12,r4,r5
1283 orr r12,r12,r6
1284 orr r12,r12,r7
1285 orr r12,r12,r8
1286 orr r12,r12,r9
1287 orr r12,r12,r10
1288 orr r12,r12,r11
1289 cmp r12,#0
1290#ifdef __thumb2__
1291 it ne
1292#endif
1293 movne r12,#-1
1294 stmia r3,{r4-r11}
1295 str r12,[sp,#32*18+8] @ !in2infty
1296
1297 ldmia $a_ptr!,{r4-r11} @ copy in1_x
1298 add r3,sp,#$in1_x
1299 stmia r3!,{r4-r11}
1300 ldmia $a_ptr!,{r4-r11} @ copy in1_y
1301 stmia r3!,{r4-r11}
1302 ldmia $a_ptr,{r4-r11} @ copy in1_z
1303 orr r12,r4,r5
1304 orr r12,r12,r6
1305 orr r12,r12,r7
1306 orr r12,r12,r8
1307 orr r12,r12,r9
1308 orr r12,r12,r10
1309 orr r12,r12,r11
1310 cmp r12,#0
1311#ifdef __thumb2__
1312 it ne
1313#endif
1314 movne r12,#-1
1315 stmia r3,{r4-r11}
1316 str r12,[sp,#32*18+4] @ !in1infty
1317
1318 add $a_ptr,sp,#$in2_z
1319 add $b_ptr,sp,#$in2_z
1320 add $r_ptr,sp,#$Z2sqr
1321 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z2sqr, in2_z);
1322
1323 add $a_ptr,sp,#$in1_z
1324 add $b_ptr,sp,#$in1_z
1325 add $r_ptr,sp,#$Z1sqr
1326 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z1sqr, in1_z);
1327
1328 add $a_ptr,sp,#$in2_z
1329 add $b_ptr,sp,#$Z2sqr
1330 add $r_ptr,sp,#$S1
1331 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S1, Z2sqr, in2_z);
1332
1333 add $a_ptr,sp,#$in1_z
1334 add $b_ptr,sp,#$Z1sqr
1335 add $r_ptr,sp,#$S2
1336 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, Z1sqr, in1_z);
1337
1338 add $a_ptr,sp,#$in1_y
1339 add $b_ptr,sp,#$S1
1340 add $r_ptr,sp,#$S1
1341 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S1, S1, in1_y);
1342
1343 add $a_ptr,sp,#$in2_y
1344 add $b_ptr,sp,#$S2
1345 add $r_ptr,sp,#$S2
1346 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S2, in2_y);
1347
1348 add $b_ptr,sp,#$S1
1349 add $r_ptr,sp,#$R
1350 bl __ecp_nistz256_sub_from @ p256_sub(R, S2, S1);
1351
1352 orr $a0,$a0,$a1 @ see if result is zero
1353 orr $a2,$a2,$a3
1354 orr $a4,$a4,$a5
1355 orr $a0,$a0,$a2
1356 orr $a4,$a4,$a6
1357 orr $a0,$a0,$a7
1358 add $a_ptr,sp,#$in1_x
1359 orr $a0,$a0,$a4
1360 add $b_ptr,sp,#$Z2sqr
1361 str $a0,[sp,#32*18+12]
1362
1363 add $r_ptr,sp,#$U1
1364 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U1, in1_x, Z2sqr);
1365
1366 add $a_ptr,sp,#$in2_x
1367 add $b_ptr,sp,#$Z1sqr
1368 add $r_ptr,sp,#$U2
1369 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, in2_x, Z1sqr);
1370
1371 add $b_ptr,sp,#$U1
1372 add $r_ptr,sp,#$H
1373 bl __ecp_nistz256_sub_from @ p256_sub(H, U2, U1);
1374
1375 orr $a0,$a0,$a1 @ see if result is zero
1376 orr $a2,$a2,$a3
1377 orr $a4,$a4,$a5
1378 orr $a0,$a0,$a2
1379 orr $a4,$a4,$a6
1380 orr $a0,$a0,$a7
1381 orrs $a0,$a0,$a4
1382
1383 bne .Ladd_proceed @ is_equal(U1,U2)?
1384
1385 ldr $t0,[sp,#32*18+4]
1386 ldr $t1,[sp,#32*18+8]
1387 ldr $t2,[sp,#32*18+12]
1388 tst $t0,$t1
1389 beq .Ladd_proceed @ (in1infty || in2infty)?
1390 tst $t2,$t2
1391 beq .Ladd_double @ is_equal(S1,S2)?
1392
1393 ldr $r_ptr,[sp,#32*18+16]
1394 eor r4,r4,r4
1395 eor r5,r5,r5
1396 eor r6,r6,r6
1397 eor r7,r7,r7
1398 eor r8,r8,r8
1399 eor r9,r9,r9
1400 eor r10,r10,r10
1401 eor r11,r11,r11
1402 stmia $r_ptr!,{r4-r11}
1403 stmia $r_ptr!,{r4-r11}
1404 stmia $r_ptr!,{r4-r11}
1405 b .Ladd_done
1406
1407.align 4
1408.Ladd_double:
1409 ldr $a_ptr,[sp,#32*18+20]
1410 add sp,sp,#32*(18-5)+16 @ difference in frame sizes
1411 b .Lpoint_double_shortcut
1412
1413.align 4
1414.Ladd_proceed:
1415 add $a_ptr,sp,#$R
1416 add $b_ptr,sp,#$R
1417 add $r_ptr,sp,#$Rsqr
1418 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Rsqr, R);
1419
1420 add $a_ptr,sp,#$H
1421 add $b_ptr,sp,#$in1_z
1422 add $r_ptr,sp,#$res_z
1423 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, H, in1_z);
1424
1425 add $a_ptr,sp,#$H
1426 add $b_ptr,sp,#$H
1427 add $r_ptr,sp,#$Hsqr
1428 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Hsqr, H);
1429
1430 add $a_ptr,sp,#$in2_z
1431 add $b_ptr,sp,#$res_z
1432 add $r_ptr,sp,#$res_z
1433 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, res_z, in2_z);
1434
1435 add $a_ptr,sp,#$H
1436 add $b_ptr,sp,#$Hsqr
1437 add $r_ptr,sp,#$Hcub
1438 bl __ecp_nistz256_mul_mont @ p256_mul_mont(Hcub, Hsqr, H);
1439
1440 add $a_ptr,sp,#$Hsqr
1441 add $b_ptr,sp,#$U1
1442 add $r_ptr,sp,#$U2
1443 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, U1, Hsqr);
1444
1445 add $r_ptr,sp,#$Hsqr
1446 bl __ecp_nistz256_add_self @ p256_mul_by_2(Hsqr, U2);
1447
1448 add $b_ptr,sp,#$Rsqr
1449 add $r_ptr,sp,#$res_x
1450 bl __ecp_nistz256_sub_morf @ p256_sub(res_x, Rsqr, Hsqr);
1451
1452 add $b_ptr,sp,#$Hcub
1453 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, Hcub);
1454
1455 add $b_ptr,sp,#$U2
1456 add $r_ptr,sp,#$res_y
1457 bl __ecp_nistz256_sub_morf @ p256_sub(res_y, U2, res_x);
1458
1459 add $a_ptr,sp,#$Hcub
1460 add $b_ptr,sp,#$S1
1461 add $r_ptr,sp,#$S2
1462 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S1, Hcub);
1463
1464 add $a_ptr,sp,#$R
1465 add $b_ptr,sp,#$res_y
1466 add $r_ptr,sp,#$res_y
1467 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_y, res_y, R);
1468
1469 add $b_ptr,sp,#$S2
1470 bl __ecp_nistz256_sub_from @ p256_sub(res_y, res_y, S2);
1471
1472 ldr r11,[sp,#32*18+4] @ !in1intfy
1473 ldr r12,[sp,#32*18+8] @ !in2intfy
1474 add r1,sp,#$res_x
1475 add r2,sp,#$in2_x
1476 and r10,r11,r12
1477 mvn r11,r11
1478 add r3,sp,#$in1_x
1479 and r11,r11,r12
1480 mvn r12,r12
1481 ldr $r_ptr,[sp,#32*18+16]
1482___
1483for($i=0;$i<96;$i+=8) { # conditional moves
1484$code.=<<___;
1485 ldmia r1!,{r4-r5} @ res_x
1486 ldmia r2!,{r6-r7} @ in2_x
1487 ldmia r3!,{r8-r9} @ in1_x
1488 and r4,r4,r10
1489 and r5,r5,r10
1490 and r6,r6,r11
1491 and r7,r7,r11
1492 and r8,r8,r12
1493 and r9,r9,r12
1494 orr r4,r4,r6
1495 orr r5,r5,r7
1496 orr r4,r4,r8
1497 orr r5,r5,r9
1498 stmia $r_ptr!,{r4-r5}
1499___
1500}
1501$code.=<<___;
1502.Ladd_done:
1503 add sp,sp,#32*18+16+16 @ +16 means "skip even over saved r0-r3"
1504#if __ARM_ARCH__>=5 || defined(__thumb__)
1505 ldmia sp!,{r4-r12,pc}
1506#else
1507 ldmia sp!,{r4-r12,lr}
1508 bx lr @ interoperable with Thumb ISA:-)
1509#endif
1510.size ecp_nistz256_point_add,.-ecp_nistz256_point_add
1511___
1512}
1513
1514########################################################################
1515# void ecp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1,
1516# const P256_POINT_AFFINE *in2);
1517{
1518my ($res_x,$res_y,$res_z,
1519 $in1_x,$in1_y,$in1_z,
1520 $in2_x,$in2_y,
1521 $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14));
1522my $Z1sqr = $S2;
1523# above map() describes stack layout with 18 temporary
1524# 256-bit vectors on top. Then note that we push
1525# starting from r0, which means that we have copy of
1526# input arguments just below these temporary vectors.
1527# We use two of them for !in1infty, !in2intfy.
1528
1529my @ONE_mont=(1,0,0,-1,-1,-1,-2,0);
1530
1531$code.=<<___;
1532.globl ecp_nistz256_point_add_affine
1533.type ecp_nistz256_point_add_affine,%function
1534.align 5
1535ecp_nistz256_point_add_affine:
1536 stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional
1537 sub sp,sp,#32*15
1538
1539 ldmia $a_ptr!,{r4-r11} @ copy in1_x
1540 add r3,sp,#$in1_x
1541 stmia r3!,{r4-r11}
1542 ldmia $a_ptr!,{r4-r11} @ copy in1_y
1543 stmia r3!,{r4-r11}
1544 ldmia $a_ptr,{r4-r11} @ copy in1_z
1545 orr r12,r4,r5
1546 orr r12,r12,r6
1547 orr r12,r12,r7
1548 orr r12,r12,r8
1549 orr r12,r12,r9
1550 orr r12,r12,r10
1551 orr r12,r12,r11
1552 cmp r12,#0
1553#ifdef __thumb2__
1554 it ne
1555#endif
1556 movne r12,#-1
1557 stmia r3,{r4-r11}
1558 str r12,[sp,#32*15+4] @ !in1infty
1559
1560 ldmia $b_ptr!,{r4-r11} @ copy in2_x
1561 add r3,sp,#$in2_x
1562 orr r12,r4,r5
1563 orr r12,r12,r6
1564 orr r12,r12,r7
1565 orr r12,r12,r8
1566 orr r12,r12,r9
1567 orr r12,r12,r10
1568 orr r12,r12,r11
1569 stmia r3!,{r4-r11}
1570 ldmia $b_ptr!,{r4-r11} @ copy in2_y
1571 orr r12,r12,r4
1572 orr r12,r12,r5
1573 orr r12,r12,r6
1574 orr r12,r12,r7
1575 orr r12,r12,r8
1576 orr r12,r12,r9
1577 orr r12,r12,r10
1578 orr r12,r12,r11
1579 stmia r3!,{r4-r11}
1580 cmp r12,#0
1581#ifdef __thumb2__
1582 it ne
1583#endif
1584 movne r12,#-1
1585 str r12,[sp,#32*15+8] @ !in2infty
1586
1587 add $a_ptr,sp,#$in1_z
1588 add $b_ptr,sp,#$in1_z
1589 add $r_ptr,sp,#$Z1sqr
1590 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z1sqr, in1_z);
1591
1592 add $a_ptr,sp,#$Z1sqr
1593 add $b_ptr,sp,#$in2_x
1594 add $r_ptr,sp,#$U2
1595 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, Z1sqr, in2_x);
1596
1597 add $b_ptr,sp,#$in1_x
1598 add $r_ptr,sp,#$H
1599 bl __ecp_nistz256_sub_from @ p256_sub(H, U2, in1_x);
1600
1601 add $a_ptr,sp,#$Z1sqr
1602 add $b_ptr,sp,#$in1_z
1603 add $r_ptr,sp,#$S2
1604 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, Z1sqr, in1_z);
1605
1606 add $a_ptr,sp,#$H
1607 add $b_ptr,sp,#$in1_z
1608 add $r_ptr,sp,#$res_z
1609 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, H, in1_z);
1610
1611 add $a_ptr,sp,#$in2_y
1612 add $b_ptr,sp,#$S2
1613 add $r_ptr,sp,#$S2
1614 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S2, in2_y);
1615
1616 add $b_ptr,sp,#$in1_y
1617 add $r_ptr,sp,#$R
1618 bl __ecp_nistz256_sub_from @ p256_sub(R, S2, in1_y);
1619
1620 add $a_ptr,sp,#$H
1621 add $b_ptr,sp,#$H
1622 add $r_ptr,sp,#$Hsqr
1623 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Hsqr, H);
1624
1625 add $a_ptr,sp,#$R
1626 add $b_ptr,sp,#$R
1627 add $r_ptr,sp,#$Rsqr
1628 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Rsqr, R);
1629
1630 add $a_ptr,sp,#$H
1631 add $b_ptr,sp,#$Hsqr
1632 add $r_ptr,sp,#$Hcub
1633 bl __ecp_nistz256_mul_mont @ p256_mul_mont(Hcub, Hsqr, H);
1634
1635 add $a_ptr,sp,#$Hsqr
1636 add $b_ptr,sp,#$in1_x
1637 add $r_ptr,sp,#$U2
1638 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, in1_x, Hsqr);
1639
1640 add $r_ptr,sp,#$Hsqr
1641 bl __ecp_nistz256_add_self @ p256_mul_by_2(Hsqr, U2);
1642
1643 add $b_ptr,sp,#$Rsqr
1644 add $r_ptr,sp,#$res_x
1645 bl __ecp_nistz256_sub_morf @ p256_sub(res_x, Rsqr, Hsqr);
1646
1647 add $b_ptr,sp,#$Hcub
1648 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, Hcub);
1649
1650 add $b_ptr,sp,#$U2
1651 add $r_ptr,sp,#$res_y
1652 bl __ecp_nistz256_sub_morf @ p256_sub(res_y, U2, res_x);
1653
1654 add $a_ptr,sp,#$Hcub
1655 add $b_ptr,sp,#$in1_y
1656 add $r_ptr,sp,#$S2
1657 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, in1_y, Hcub);
1658
1659 add $a_ptr,sp,#$R
1660 add $b_ptr,sp,#$res_y
1661 add $r_ptr,sp,#$res_y
1662 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_y, res_y, R);
1663
1664 add $b_ptr,sp,#$S2
1665 bl __ecp_nistz256_sub_from @ p256_sub(res_y, res_y, S2);
1666
1667 ldr r11,[sp,#32*15+4] @ !in1intfy
1668 ldr r12,[sp,#32*15+8] @ !in2intfy
1669 add r1,sp,#$res_x
1670 add r2,sp,#$in2_x
1671 and r10,r11,r12
1672 mvn r11,r11
1673 add r3,sp,#$in1_x
1674 and r11,r11,r12
1675 mvn r12,r12
1676 ldr $r_ptr,[sp,#32*15]
1677___
1678for($i=0;$i<64;$i+=8) { # conditional moves
1679$code.=<<___;
1680 ldmia r1!,{r4-r5} @ res_x
1681 ldmia r2!,{r6-r7} @ in2_x
1682 ldmia r3!,{r8-r9} @ in1_x
1683 and r4,r4,r10
1684 and r5,r5,r10
1685 and r6,r6,r11
1686 and r7,r7,r11
1687 and r8,r8,r12
1688 and r9,r9,r12
1689 orr r4,r4,r6
1690 orr r5,r5,r7
1691 orr r4,r4,r8
1692 orr r5,r5,r9
1693 stmia $r_ptr!,{r4-r5}
1694___
1695}
1696for(;$i<96;$i+=8) {
1697my $j=($i-64)/4;
1698$code.=<<___;
1699 ldmia r1!,{r4-r5} @ res_z
1700 ldmia r3!,{r8-r9} @ in1_z
1701 and r4,r4,r10
1702 and r5,r5,r10
1703 and r6,r11,#@ONE_mont[$j]
1704 and r7,r11,#@ONE_mont[$j+1]
1705 and r8,r8,r12
1706 and r9,r9,r12
1707 orr r4,r4,r6
1708 orr r5,r5,r7
1709 orr r4,r4,r8
1710 orr r5,r5,r9
1711 stmia $r_ptr!,{r4-r5}
1712___
1713}
1714$code.=<<___;
1715 add sp,sp,#32*15+16 @ +16 means "skip even over saved r0-r3"
1716#if __ARM_ARCH__>=5 || !defined(__thumb__)
1717 ldmia sp!,{r4-r12,pc}
1718#else
1719 ldmia sp!,{r4-r12,lr}
1720 bx lr @ interoperable with Thumb ISA:-)
1721#endif
1722.size ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
1723___
1724} }}}
1725
1726foreach (split("\n",$code)) {
1727 s/\`([^\`]*)\`/eval $1/geo;
1728
1729 s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo;
1730
1731 print $_,"\n";
1732}
1733close STDOUT; # enforce flush
diff --git a/src/lib/libcrypto/ec/asm/ecp_nistz256-sparcv9.pl b/src/lib/libcrypto/ec/asm/ecp_nistz256-sparcv9.pl
deleted file mode 100644
index 49460fefdc..0000000000
--- a/src/lib/libcrypto/ec/asm/ecp_nistz256-sparcv9.pl
+++ /dev/null
@@ -1,2890 +0,0 @@
1#! /usr/bin/env perl
2# $OpenBSD: ecp_nistz256-sparcv9.pl,v 1.2 2022/12/26 07:18:51 jmc Exp $
3#
4# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
5#
6# Licensed under the OpenSSL license (the "License"). You may not use
7# this file except in compliance with the License. You can obtain a copy
8# in the file LICENSE in the source distribution or at
9# https://www.openssl.org/source/license.html
10
11
12# ====================================================================
13# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
14# project. The module is, however, dual licensed under OpenSSL and
15# CRYPTOGAMS licenses depending on where you obtain it. For further
16# details see http://www.openssl.org/~appro/cryptogams/.
17# ====================================================================
18#
19# ECP_NISTZ256 module for SPARCv9.
20#
21# February 2015.
22#
23# Original ECP_NISTZ256 submission targeting x86_64 is detailed in
24# http://eprint.iacr.org/2013/816. In the process of adaptation
25# original .c module was made 32-bit savvy in order to make this
26# implementation possible.
27#
28# with/without -DECP_NISTZ256_ASM
29# UltraSPARC III +12-18%
30# SPARC T4 +99-550% (+66-150% on 32-bit Solaris)
31#
32# Ranges denote minimum and maximum improvement coefficients depending
33# on benchmark. Lower coefficients are for ECDSA sign, server-side
34# operation. Keep in mind that +200% means 3x improvement.
35
36# Uncomment when all sparcv9 assembly generators are updated to take the output
37# file as last argument...
38# $output = pop;
39# open STDOUT,">$output";
40
41$code.=<<___;
42#define STACK_FRAME 192
43#define STACK_BIAS 2047
44
45#define LOCALS (STACK_BIAS+STACK_FRAME)
46.register %g2,#scratch
47.register %g3,#scratch
48# define STACK64_FRAME STACK_FRAME
49# define LOCALS64 LOCALS
50
51.section ".text",#alloc,#execinstr
52___
53
54{{{
55my ($rp,$ap,$bp)=map("%i$_",(0..2));
56my @acc=map("%l$_",(0..7));
57my ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7)=(map("%o$_",(0..5)),"%g4","%g5");
58my ($bi,$a0,$mask,$carry)=(map("%i$_",(3..5)),"%g1");
59my ($rp_real,$ap_real)=("%g2","%g3");
60
61$code.=<<___;
62.align 64
63.Lone:
64.long 1,0,0,0,0,0,0,0
65
66! void ecp_nistz256_from_mont(BN_ULONG %i0[8],const BN_ULONG %i1[8]);
67.globl ecp_nistz256_from_mont
68.align 32
69ecp_nistz256_from_mont:
70 save %sp,-STACK_FRAME,%sp
71 nop
721: call .+8
73 add %o7,.Lone-1b,$bp
74 call __ecp_nistz256_mul_mont
75 nop
76 ret
77 restore
78.type ecp_nistz256_from_mont,#function
79.size ecp_nistz256_from_mont,.-ecp_nistz256_from_mont
80
81! void ecp_nistz256_mul_mont(BN_ULONG %i0[8],const BN_ULONG %i1[8],
82! const BN_ULONG %i2[8]);
83.globl ecp_nistz256_mul_mont
84.align 32
85ecp_nistz256_mul_mont:
86 save %sp,-STACK_FRAME,%sp
87 nop
88 call __ecp_nistz256_mul_mont
89 nop
90 ret
91 restore
92.type ecp_nistz256_mul_mont,#function
93.size ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
94
95! void ecp_nistz256_sqr_mont(BN_ULONG %i0[8],const BN_ULONG %i2[8]);
96.globl ecp_nistz256_sqr_mont
97.align 32
98ecp_nistz256_sqr_mont:
99 save %sp,-STACK_FRAME,%sp
100 mov $ap,$bp
101 call __ecp_nistz256_mul_mont
102 nop
103 ret
104 restore
105.type ecp_nistz256_sqr_mont,#function
106.size ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
107___
108
109########################################################################
110# Special thing to keep in mind is that $t0-$t7 hold 64-bit values,
111# while all others are meant to keep 32. "Meant to" means that additions
112# to @acc[0-7] do "contaminate" upper bits, but they are cleared before
113# they can affect outcome (follow 'and' with $mask). Also keep in mind
114# that addition with carry is addition with 32-bit carry, even though
115# CPU is 64-bit. [Addition with 64-bit carry was introduced in T3, see
116# below for VIS3 code paths.]
117
118$code.=<<___;
119.align 32
120__ecp_nistz256_mul_mont:
121 ld [$bp+0],$bi ! b[0]
122 mov -1,$mask
123 ld [$ap+0],$a0
124 srl $mask,0,$mask ! 0xffffffff
125 ld [$ap+4],$t1
126 ld [$ap+8],$t2
127 ld [$ap+12],$t3
128 ld [$ap+16],$t4
129 ld [$ap+20],$t5
130 ld [$ap+24],$t6
131 ld [$ap+28],$t7
132 mulx $a0,$bi,$t0 ! a[0-7]*b[0], 64-bit results
133 mulx $t1,$bi,$t1
134 mulx $t2,$bi,$t2
135 mulx $t3,$bi,$t3
136 mulx $t4,$bi,$t4
137 mulx $t5,$bi,$t5
138 mulx $t6,$bi,$t6
139 mulx $t7,$bi,$t7
140 srlx $t0,32,@acc[1] ! extract high parts
141 srlx $t1,32,@acc[2]
142 srlx $t2,32,@acc[3]
143 srlx $t3,32,@acc[4]
144 srlx $t4,32,@acc[5]
145 srlx $t5,32,@acc[6]
146 srlx $t6,32,@acc[7]
147 srlx $t7,32,@acc[0] ! "@acc[8]"
148 mov 0,$carry
149___
150for($i=1;$i<8;$i++) {
151$code.=<<___;
152 addcc @acc[1],$t1,@acc[1] ! accumulate high parts
153 ld [$bp+4*$i],$bi ! b[$i]
154 ld [$ap+4],$t1 ! re-load a[1-7]
155 addccc @acc[2],$t2,@acc[2]
156 addccc @acc[3],$t3,@acc[3]
157 ld [$ap+8],$t2
158 ld [$ap+12],$t3
159 addccc @acc[4],$t4,@acc[4]
160 addccc @acc[5],$t5,@acc[5]
161 ld [$ap+16],$t4
162 ld [$ap+20],$t5
163 addccc @acc[6],$t6,@acc[6]
164 addccc @acc[7],$t7,@acc[7]
165 ld [$ap+24],$t6
166 ld [$ap+28],$t7
167 addccc @acc[0],$carry,@acc[0] ! "@acc[8]"
168 addc %g0,%g0,$carry
169___
170 # Reduction iteration is normally performed by accumulating
171 # result of multiplication of modulus by "magic" digit [and
172 # omitting least significant word, which is guaranteed to
173 # be 0], but thanks to special form of modulus and "magic"
174 # digit being equal to least significant word, it can be
175 # performed with additions and subtractions alone. Indeed:
176 #
177 # ffff.0001.0000.0000.0000.ffff.ffff.ffff
178 # * abcd
179 # + xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
180 #
181 # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
182 # rewrite above as:
183 #
184 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
185 # + abcd.0000.abcd.0000.0000.abcd.0000.0000.0000
186 # - abcd.0000.0000.0000.0000.0000.0000.abcd
187 #
188 # or marking redundant operations:
189 #
190 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.----
191 # + abcd.0000.abcd.0000.0000.abcd.----.----.----
192 # - abcd.----.----.----.----.----.----.----
193
194$code.=<<___;
195 ! multiplication-less reduction
196 addcc @acc[3],$t0,@acc[3] ! r[3]+=r[0]
197 addccc @acc[4],%g0,@acc[4] ! r[4]+=0
198 and @acc[1],$mask,@acc[1]
199 and @acc[2],$mask,@acc[2]
200 addccc @acc[5],%g0,@acc[5] ! r[5]+=0
201 addccc @acc[6],$t0,@acc[6] ! r[6]+=r[0]
202 and @acc[3],$mask,@acc[3]
203 and @acc[4],$mask,@acc[4]
204 addccc @acc[7],%g0,@acc[7] ! r[7]+=0
205 addccc @acc[0],$t0,@acc[0] ! r[8]+=r[0] "@acc[8]"
206 and @acc[5],$mask,@acc[5]
207 and @acc[6],$mask,@acc[6]
208 addc $carry,%g0,$carry ! top-most carry
209 subcc @acc[7],$t0,@acc[7] ! r[7]-=r[0]
210 subccc @acc[0],%g0,@acc[0] ! r[8]-=0 "@acc[8]"
211 subc $carry,%g0,$carry ! top-most carry
212 and @acc[7],$mask,@acc[7]
213 and @acc[0],$mask,@acc[0] ! "@acc[8]"
214___
215 push(@acc,shift(@acc)); # rotate registers to "omit" acc[0]
216$code.=<<___;
217 mulx $a0,$bi,$t0 ! a[0-7]*b[$i], 64-bit results
218 mulx $t1,$bi,$t1
219 mulx $t2,$bi,$t2
220 mulx $t3,$bi,$t3
221 mulx $t4,$bi,$t4
222 mulx $t5,$bi,$t5
223 mulx $t6,$bi,$t6
224 mulx $t7,$bi,$t7
225 add @acc[0],$t0,$t0 ! accumulate low parts, can't overflow
226 add @acc[1],$t1,$t1
227 srlx $t0,32,@acc[1] ! extract high parts
228 add @acc[2],$t2,$t2
229 srlx $t1,32,@acc[2]
230 add @acc[3],$t3,$t3
231 srlx $t2,32,@acc[3]
232 add @acc[4],$t4,$t4
233 srlx $t3,32,@acc[4]
234 add @acc[5],$t5,$t5
235 srlx $t4,32,@acc[5]
236 add @acc[6],$t6,$t6
237 srlx $t5,32,@acc[6]
238 add @acc[7],$t7,$t7
239 srlx $t6,32,@acc[7]
240 srlx $t7,32,@acc[0] ! "@acc[8]"
241___
242}
243$code.=<<___;
244 addcc @acc[1],$t1,@acc[1] ! accumulate high parts
245 addccc @acc[2],$t2,@acc[2]
246 addccc @acc[3],$t3,@acc[3]
247 addccc @acc[4],$t4,@acc[4]
248 addccc @acc[5],$t5,@acc[5]
249 addccc @acc[6],$t6,@acc[6]
250 addccc @acc[7],$t7,@acc[7]
251 addccc @acc[0],$carry,@acc[0] ! "@acc[8]"
252 addc %g0,%g0,$carry
253
254 addcc @acc[3],$t0,@acc[3] ! multiplication-less reduction
255 addccc @acc[4],%g0,@acc[4]
256 addccc @acc[5],%g0,@acc[5]
257 addccc @acc[6],$t0,@acc[6]
258 addccc @acc[7],%g0,@acc[7]
259 addccc @acc[0],$t0,@acc[0] ! "@acc[8]"
260 addc $carry,%g0,$carry
261 subcc @acc[7],$t0,@acc[7]
262 subccc @acc[0],%g0,@acc[0] ! "@acc[8]"
263 subc $carry,%g0,$carry ! top-most carry
264___
265 push(@acc,shift(@acc)); # rotate registers to omit acc[0]
266$code.=<<___;
267 ! Final step is "if result > mod, subtract mod", but we do it
268 ! "other way around", namely subtract modulus from result
269 ! and if it borrowed, add modulus back.
270
271 subcc @acc[0],-1,@acc[0] ! subtract modulus
272 subccc @acc[1],-1,@acc[1]
273 subccc @acc[2],-1,@acc[2]
274 subccc @acc[3],0,@acc[3]
275 subccc @acc[4],0,@acc[4]
276 subccc @acc[5],0,@acc[5]
277 subccc @acc[6],1,@acc[6]
278 subccc @acc[7],-1,@acc[7]
279 subc $carry,0,$carry ! broadcast borrow bit
280
281 ! Note that because mod has special form, i.e. consists of
282 ! 0xffffffff, 1 and 0s, we can conditionally synthesize it by
283 ! using value of broadcasted borrow and the borrow bit itself.
284 ! To minimize dependency chain we first broadcast and then
285 ! extract the bit by negating (follow $bi).
286
287 addcc @acc[0],$carry,@acc[0] ! add modulus or zero
288 addccc @acc[1],$carry,@acc[1]
289 neg $carry,$bi
290 st @acc[0],[$rp]
291 addccc @acc[2],$carry,@acc[2]
292 st @acc[1],[$rp+4]
293 addccc @acc[3],0,@acc[3]
294 st @acc[2],[$rp+8]
295 addccc @acc[4],0,@acc[4]
296 st @acc[3],[$rp+12]
297 addccc @acc[5],0,@acc[5]
298 st @acc[4],[$rp+16]
299 addccc @acc[6],$bi,@acc[6]
300 st @acc[5],[$rp+20]
301 addc @acc[7],$carry,@acc[7]
302 st @acc[6],[$rp+24]
303 retl
304 st @acc[7],[$rp+28]
305.type __ecp_nistz256_mul_mont,#function
306.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont
307
308! void ecp_nistz256_add(BN_ULONG %i0[8],const BN_ULONG %i1[8],
309! const BN_ULONG %i2[8]);
310.globl ecp_nistz256_add
311.align 32
312ecp_nistz256_add:
313 save %sp,-STACK_FRAME,%sp
314 ld [$ap],@acc[0]
315 ld [$ap+4],@acc[1]
316 ld [$ap+8],@acc[2]
317 ld [$ap+12],@acc[3]
318 ld [$ap+16],@acc[4]
319 ld [$ap+20],@acc[5]
320 ld [$ap+24],@acc[6]
321 call __ecp_nistz256_add
322 ld [$ap+28],@acc[7]
323 ret
324 restore
325.type ecp_nistz256_add,#function
326.size ecp_nistz256_add,.-ecp_nistz256_add
327
328.align 32
329__ecp_nistz256_add:
330 ld [$bp+0],$t0 ! b[0]
331 ld [$bp+4],$t1
332 ld [$bp+8],$t2
333 ld [$bp+12],$t3
334 addcc @acc[0],$t0,@acc[0]
335 ld [$bp+16],$t4
336 ld [$bp+20],$t5
337 addccc @acc[1],$t1,@acc[1]
338 ld [$bp+24],$t6
339 ld [$bp+28],$t7
340 addccc @acc[2],$t2,@acc[2]
341 addccc @acc[3],$t3,@acc[3]
342 addccc @acc[4],$t4,@acc[4]
343 addccc @acc[5],$t5,@acc[5]
344 addccc @acc[6],$t6,@acc[6]
345 addccc @acc[7],$t7,@acc[7]
346 addc %g0,%g0,$carry
347
348.Lreduce_by_sub:
349
350 ! if a+b >= modulus, subtract modulus.
351 !
352 ! But since comparison implies subtraction, we subtract
353 ! modulus and then add it back if subtraction borrowed.
354
355 subcc @acc[0],-1,@acc[0]
356 subccc @acc[1],-1,@acc[1]
357 subccc @acc[2],-1,@acc[2]
358 subccc @acc[3], 0,@acc[3]
359 subccc @acc[4], 0,@acc[4]
360 subccc @acc[5], 0,@acc[5]
361 subccc @acc[6], 1,@acc[6]
362 subccc @acc[7],-1,@acc[7]
363 subc $carry,0,$carry
364
365 ! Note that because mod has special form, i.e. consists of
366 ! 0xffffffff, 1 and 0s, we can conditionally synthesize it by
367 ! using value of borrow and its negative.
368
369 addcc @acc[0],$carry,@acc[0] ! add synthesized modulus
370 addccc @acc[1],$carry,@acc[1]
371 neg $carry,$bi
372 st @acc[0],[$rp]
373 addccc @acc[2],$carry,@acc[2]
374 st @acc[1],[$rp+4]
375 addccc @acc[3],0,@acc[3]
376 st @acc[2],[$rp+8]
377 addccc @acc[4],0,@acc[4]
378 st @acc[3],[$rp+12]
379 addccc @acc[5],0,@acc[5]
380 st @acc[4],[$rp+16]
381 addccc @acc[6],$bi,@acc[6]
382 st @acc[5],[$rp+20]
383 addc @acc[7],$carry,@acc[7]
384 st @acc[6],[$rp+24]
385 retl
386 st @acc[7],[$rp+28]
387.type __ecp_nistz256_add,#function
388.size __ecp_nistz256_add,.-__ecp_nistz256_add
389
390! void ecp_nistz256_mul_by_2(BN_ULONG %i0[8],const BN_ULONG %i1[8]);
391.globl ecp_nistz256_mul_by_2
392.align 32
393ecp_nistz256_mul_by_2:
394 save %sp,-STACK_FRAME,%sp
395 ld [$ap],@acc[0]
396 ld [$ap+4],@acc[1]
397 ld [$ap+8],@acc[2]
398 ld [$ap+12],@acc[3]
399 ld [$ap+16],@acc[4]
400 ld [$ap+20],@acc[5]
401 ld [$ap+24],@acc[6]
402 call __ecp_nistz256_mul_by_2
403 ld [$ap+28],@acc[7]
404 ret
405 restore
406.type ecp_nistz256_mul_by_2,#function
407.size ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
408
409.align 32
410__ecp_nistz256_mul_by_2:
411 addcc @acc[0],@acc[0],@acc[0] ! a+a=2*a
412 addccc @acc[1],@acc[1],@acc[1]
413 addccc @acc[2],@acc[2],@acc[2]
414 addccc @acc[3],@acc[3],@acc[3]
415 addccc @acc[4],@acc[4],@acc[4]
416 addccc @acc[5],@acc[5],@acc[5]
417 addccc @acc[6],@acc[6],@acc[6]
418 addccc @acc[7],@acc[7],@acc[7]
419 b .Lreduce_by_sub
420 addc %g0,%g0,$carry
421.type __ecp_nistz256_mul_by_2,#function
422.size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2
423
424! void ecp_nistz256_mul_by_3(BN_ULONG %i0[8],const BN_ULONG %i1[8]);
425.globl ecp_nistz256_mul_by_3
426.align 32
427ecp_nistz256_mul_by_3:
428 save %sp,-STACK_FRAME,%sp
429 ld [$ap],@acc[0]
430 ld [$ap+4],@acc[1]
431 ld [$ap+8],@acc[2]
432 ld [$ap+12],@acc[3]
433 ld [$ap+16],@acc[4]
434 ld [$ap+20],@acc[5]
435 ld [$ap+24],@acc[6]
436 call __ecp_nistz256_mul_by_3
437 ld [$ap+28],@acc[7]
438 ret
439 restore
440.type ecp_nistz256_mul_by_3,#function
441.size ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
442
443.align 32
444__ecp_nistz256_mul_by_3:
445 addcc @acc[0],@acc[0],$t0 ! a+a=2*a
446 addccc @acc[1],@acc[1],$t1
447 addccc @acc[2],@acc[2],$t2
448 addccc @acc[3],@acc[3],$t3
449 addccc @acc[4],@acc[4],$t4
450 addccc @acc[5],@acc[5],$t5
451 addccc @acc[6],@acc[6],$t6
452 addccc @acc[7],@acc[7],$t7
453 addc %g0,%g0,$carry
454
455 subcc $t0,-1,$t0 ! .Lreduce_by_sub but without stores
456 subccc $t1,-1,$t1
457 subccc $t2,-1,$t2
458 subccc $t3, 0,$t3
459 subccc $t4, 0,$t4
460 subccc $t5, 0,$t5
461 subccc $t6, 1,$t6
462 subccc $t7,-1,$t7
463 subc $carry,0,$carry
464
465 addcc $t0,$carry,$t0 ! add synthesized modulus
466 addccc $t1,$carry,$t1
467 neg $carry,$bi
468 addccc $t2,$carry,$t2
469 addccc $t3,0,$t3
470 addccc $t4,0,$t4
471 addccc $t5,0,$t5
472 addccc $t6,$bi,$t6
473 addc $t7,$carry,$t7
474
475 addcc $t0,@acc[0],@acc[0] ! 2*a+a=3*a
476 addccc $t1,@acc[1],@acc[1]
477 addccc $t2,@acc[2],@acc[2]
478 addccc $t3,@acc[3],@acc[3]
479 addccc $t4,@acc[4],@acc[4]
480 addccc $t5,@acc[5],@acc[5]
481 addccc $t6,@acc[6],@acc[6]
482 addccc $t7,@acc[7],@acc[7]
483 b .Lreduce_by_sub
484 addc %g0,%g0,$carry
485.type __ecp_nistz256_mul_by_3,#function
486.size __ecp_nistz256_mul_by_3,.-__ecp_nistz256_mul_by_3
487
488! void ecp_nistz256_neg(BN_ULONG %i0[8],const BN_ULONG %i1[8]);
489.globl ecp_nistz256_neg
490.align 32
491ecp_nistz256_neg:
492 save %sp,-STACK_FRAME,%sp
493 mov $ap,$bp
494 mov 0,@acc[0]
495 mov 0,@acc[1]
496 mov 0,@acc[2]
497 mov 0,@acc[3]
498 mov 0,@acc[4]
499 mov 0,@acc[5]
500 mov 0,@acc[6]
501 call __ecp_nistz256_sub_from
502 mov 0,@acc[7]
503 ret
504 restore
505.type ecp_nistz256_neg,#function
506.size ecp_nistz256_neg,.-ecp_nistz256_neg
507
508.align 32
509__ecp_nistz256_sub_from:
510 ld [$bp+0],$t0 ! b[0]
511 ld [$bp+4],$t1
512 ld [$bp+8],$t2
513 ld [$bp+12],$t3
514 subcc @acc[0],$t0,@acc[0]
515 ld [$bp+16],$t4
516 ld [$bp+20],$t5
517 subccc @acc[1],$t1,@acc[1]
518 subccc @acc[2],$t2,@acc[2]
519 ld [$bp+24],$t6
520 ld [$bp+28],$t7
521 subccc @acc[3],$t3,@acc[3]
522 subccc @acc[4],$t4,@acc[4]
523 subccc @acc[5],$t5,@acc[5]
524 subccc @acc[6],$t6,@acc[6]
525 subccc @acc[7],$t7,@acc[7]
526 subc %g0,%g0,$carry ! broadcast borrow bit
527
528.Lreduce_by_add:
529
530 ! if a-b borrows, add modulus.
531 !
532 ! Note that because mod has special form, i.e. consists of
533 ! 0xffffffff, 1 and 0s, we can conditionally synthesize it by
534 ! using value of broadcasted borrow and the borrow bit itself.
535 ! To minimize dependency chain we first broadcast and then
536 ! extract the bit by negating (follow $bi).
537
538 addcc @acc[0],$carry,@acc[0] ! add synthesized modulus
539 addccc @acc[1],$carry,@acc[1]
540 neg $carry,$bi
541 st @acc[0],[$rp]
542 addccc @acc[2],$carry,@acc[2]
543 st @acc[1],[$rp+4]
544 addccc @acc[3],0,@acc[3]
545 st @acc[2],[$rp+8]
546 addccc @acc[4],0,@acc[4]
547 st @acc[3],[$rp+12]
548 addccc @acc[5],0,@acc[5]
549 st @acc[4],[$rp+16]
550 addccc @acc[6],$bi,@acc[6]
551 st @acc[5],[$rp+20]
552 addc @acc[7],$carry,@acc[7]
553 st @acc[6],[$rp+24]
554 retl
555 st @acc[7],[$rp+28]
556.type __ecp_nistz256_sub_from,#function
557.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from
558
559.align 32
560__ecp_nistz256_sub_morf:
561 ld [$bp+0],$t0 ! b[0]
562 ld [$bp+4],$t1
563 ld [$bp+8],$t2
564 ld [$bp+12],$t3
565 subcc $t0,@acc[0],@acc[0]
566 ld [$bp+16],$t4
567 ld [$bp+20],$t5
568 subccc $t1,@acc[1],@acc[1]
569 subccc $t2,@acc[2],@acc[2]
570 ld [$bp+24],$t6
571 ld [$bp+28],$t7
572 subccc $t3,@acc[3],@acc[3]
573 subccc $t4,@acc[4],@acc[4]
574 subccc $t5,@acc[5],@acc[5]
575 subccc $t6,@acc[6],@acc[6]
576 subccc $t7,@acc[7],@acc[7]
577 b .Lreduce_by_add
578 subc %g0,%g0,$carry ! broadcast borrow bit
579.type __ecp_nistz256_sub_morf,#function
580.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf
581
582! void ecp_nistz256_div_by_2(BN_ULONG %i0[8],const BN_ULONG %i1[8]);
583.globl ecp_nistz256_div_by_2
584.align 32
585ecp_nistz256_div_by_2:
586 save %sp,-STACK_FRAME,%sp
587 ld [$ap],@acc[0]
588 ld [$ap+4],@acc[1]
589 ld [$ap+8],@acc[2]
590 ld [$ap+12],@acc[3]
591 ld [$ap+16],@acc[4]
592 ld [$ap+20],@acc[5]
593 ld [$ap+24],@acc[6]
594 call __ecp_nistz256_div_by_2
595 ld [$ap+28],@acc[7]
596 ret
597 restore
598.type ecp_nistz256_div_by_2,#function
599.size ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
600
601.align 32
602__ecp_nistz256_div_by_2:
603 ! ret = (a is odd ? a+mod : a) >> 1
604
605 and @acc[0],1,$bi
606 neg $bi,$carry
607 addcc @acc[0],$carry,@acc[0]
608 addccc @acc[1],$carry,@acc[1]
609 addccc @acc[2],$carry,@acc[2]
610 addccc @acc[3],0,@acc[3]
611 addccc @acc[4],0,@acc[4]
612 addccc @acc[5],0,@acc[5]
613 addccc @acc[6],$bi,@acc[6]
614 addccc @acc[7],$carry,@acc[7]
615 addc %g0,%g0,$carry
616
617 ! ret >>= 1
618
619 srl @acc[0],1,@acc[0]
620 sll @acc[1],31,$t0
621 srl @acc[1],1,@acc[1]
622 or @acc[0],$t0,@acc[0]
623 sll @acc[2],31,$t1
624 srl @acc[2],1,@acc[2]
625 or @acc[1],$t1,@acc[1]
626 sll @acc[3],31,$t2
627 st @acc[0],[$rp]
628 srl @acc[3],1,@acc[3]
629 or @acc[2],$t2,@acc[2]
630 sll @acc[4],31,$t3
631 st @acc[1],[$rp+4]
632 srl @acc[4],1,@acc[4]
633 or @acc[3],$t3,@acc[3]
634 sll @acc[5],31,$t4
635 st @acc[2],[$rp+8]
636 srl @acc[5],1,@acc[5]
637 or @acc[4],$t4,@acc[4]
638 sll @acc[6],31,$t5
639 st @acc[3],[$rp+12]
640 srl @acc[6],1,@acc[6]
641 or @acc[5],$t5,@acc[5]
642 sll @acc[7],31,$t6
643 st @acc[4],[$rp+16]
644 srl @acc[7],1,@acc[7]
645 or @acc[6],$t6,@acc[6]
646 sll $carry,31,$t7
647 st @acc[5],[$rp+20]
648 or @acc[7],$t7,@acc[7]
649 st @acc[6],[$rp+24]
650 retl
651 st @acc[7],[$rp+28]
652.type __ecp_nistz256_div_by_2,#function
653.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2
654___
655
656########################################################################
657# following subroutines are "literal" implementation of those found in
658# ecp_nistz256.c
659#
660########################################################################
661# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp);
662#
663{
664my ($S,$M,$Zsqr,$tmp0)=map(32*$_,(0..3));
665# above map() describes stack layout with 4 temporary
666# 256-bit vectors on top.
667
668$code.=<<___;
669#if 0
670#ifdef __PIC__
671SPARC_PIC_THUNK(%g1)
672#endif
673#endif
674
675.globl ecp_nistz256_point_double
676.align 32
677ecp_nistz256_point_double:
678#if 0
679 SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
680 ld [%g1],%g1 ! OPENSSL_sparcv9cap_P[0]
681 and %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK),%g1
682 cmp %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK)
683 be ecp_nistz256_point_double_vis3
684 nop
685#endif
686
687 save %sp,-STACK_FRAME-32*4,%sp
688
689 mov $rp,$rp_real
690 mov $ap,$ap_real
691
692.Lpoint_double_shortcut:
693 ld [$ap+32],@acc[0]
694 ld [$ap+32+4],@acc[1]
695 ld [$ap+32+8],@acc[2]
696 ld [$ap+32+12],@acc[3]
697 ld [$ap+32+16],@acc[4]
698 ld [$ap+32+20],@acc[5]
699 ld [$ap+32+24],@acc[6]
700 ld [$ap+32+28],@acc[7]
701 call __ecp_nistz256_mul_by_2 ! p256_mul_by_2(S, in_y);
702 add %sp,LOCALS+$S,$rp
703
704 add $ap_real,64,$bp
705 add $ap_real,64,$ap
706 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Zsqr, in_z);
707 add %sp,LOCALS+$Zsqr,$rp
708
709 add $ap_real,0,$bp
710 call __ecp_nistz256_add ! p256_add(M, Zsqr, in_x);
711 add %sp,LOCALS+$M,$rp
712
713 add %sp,LOCALS+$S,$bp
714 add %sp,LOCALS+$S,$ap
715 call __ecp_nistz256_mul_mont ! p256_sqr_mont(S, S);
716 add %sp,LOCALS+$S,$rp
717
718 ld [$ap_real],@acc[0]
719 add %sp,LOCALS+$Zsqr,$bp
720 ld [$ap_real+4],@acc[1]
721 ld [$ap_real+8],@acc[2]
722 ld [$ap_real+12],@acc[3]
723 ld [$ap_real+16],@acc[4]
724 ld [$ap_real+20],@acc[5]
725 ld [$ap_real+24],@acc[6]
726 ld [$ap_real+28],@acc[7]
727 call __ecp_nistz256_sub_from ! p256_sub(Zsqr, in_x, Zsqr);
728 add %sp,LOCALS+$Zsqr,$rp
729
730 add $ap_real,32,$bp
731 add $ap_real,64,$ap
732 call __ecp_nistz256_mul_mont ! p256_mul_mont(tmp0, in_z, in_y);
733 add %sp,LOCALS+$tmp0,$rp
734
735 call __ecp_nistz256_mul_by_2 ! p256_mul_by_2(res_z, tmp0);
736 add $rp_real,64,$rp
737
738 add %sp,LOCALS+$Zsqr,$bp
739 add %sp,LOCALS+$M,$ap
740 call __ecp_nistz256_mul_mont ! p256_mul_mont(M, M, Zsqr);
741 add %sp,LOCALS+$M,$rp
742
743 call __ecp_nistz256_mul_by_3 ! p256_mul_by_3(M, M);
744 add %sp,LOCALS+$M,$rp
745
746 add %sp,LOCALS+$S,$bp
747 add %sp,LOCALS+$S,$ap
748 call __ecp_nistz256_mul_mont ! p256_sqr_mont(tmp0, S);
749 add %sp,LOCALS+$tmp0,$rp
750
751 call __ecp_nistz256_div_by_2 ! p256_div_by_2(res_y, tmp0);
752 add $rp_real,32,$rp
753
754 add $ap_real,0,$bp
755 add %sp,LOCALS+$S,$ap
756 call __ecp_nistz256_mul_mont ! p256_mul_mont(S, S, in_x);
757 add %sp,LOCALS+$S,$rp
758
759 call __ecp_nistz256_mul_by_2 ! p256_mul_by_2(tmp0, S);
760 add %sp,LOCALS+$tmp0,$rp
761
762 add %sp,LOCALS+$M,$bp
763 add %sp,LOCALS+$M,$ap
764 call __ecp_nistz256_mul_mont ! p256_sqr_mont(res_x, M);
765 add $rp_real,0,$rp
766
767 add %sp,LOCALS+$tmp0,$bp
768 call __ecp_nistz256_sub_from ! p256_sub(res_x, res_x, tmp0);
769 add $rp_real,0,$rp
770
771 add %sp,LOCALS+$S,$bp
772 call __ecp_nistz256_sub_morf ! p256_sub(S, S, res_x);
773 add %sp,LOCALS+$S,$rp
774
775 add %sp,LOCALS+$M,$bp
776 add %sp,LOCALS+$S,$ap
777 call __ecp_nistz256_mul_mont ! p256_mul_mont(S, S, M);
778 add %sp,LOCALS+$S,$rp
779
780 add $rp_real,32,$bp
781 call __ecp_nistz256_sub_from ! p256_sub(res_y, S, res_y);
782 add $rp_real,32,$rp
783
784 ret
785 restore
786.type ecp_nistz256_point_double,#function
787.size ecp_nistz256_point_double,.-ecp_nistz256_point_double
788___
789}
790
791########################################################################
792# void ecp_nistz256_point_add(P256_POINT *out,const P256_POINT *in1,
793# const P256_POINT *in2);
794{
795my ($res_x,$res_y,$res_z,
796 $H,$Hsqr,$R,$Rsqr,$Hcub,
797 $U1,$U2,$S1,$S2)=map(32*$_,(0..11));
798my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
799
800# above map() describes stack layout with 12 temporary
801# 256-bit vectors on top. Then we reserve some space for
802# !in1infty, !in2infty, result of check for zero and return pointer.
803
804my $bp_real=$rp_real;
805
806$code.=<<___;
807.globl ecp_nistz256_point_add
808.align 32
809ecp_nistz256_point_add:
810#if 0
811 SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
812 ld [%g1],%g1 ! OPENSSL_sparcv9cap_P[0]
813 and %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK),%g1
814 cmp %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK)
815 be ecp_nistz256_point_add_vis3
816 nop
817#endif
818
819 save %sp,-STACK_FRAME-32*12-32,%sp
820
821 stx $rp,[%fp+STACK_BIAS-8] ! off-load $rp
822 mov $ap,$ap_real
823 mov $bp,$bp_real
824
825 ld [$bp+64],$t0 ! in2_z
826 ld [$bp+64+4],$t1
827 ld [$bp+64+8],$t2
828 ld [$bp+64+12],$t3
829 ld [$bp+64+16],$t4
830 ld [$bp+64+20],$t5
831 ld [$bp+64+24],$t6
832 ld [$bp+64+28],$t7
833 or $t1,$t0,$t0
834 or $t3,$t2,$t2
835 or $t5,$t4,$t4
836 or $t7,$t6,$t6
837 or $t2,$t0,$t0
838 or $t6,$t4,$t4
839 or $t4,$t0,$t0 ! !in2infty
840 movrnz $t0,-1,$t0
841 st $t0,[%fp+STACK_BIAS-12]
842
843 ld [$ap+64],$t0 ! in1_z
844 ld [$ap+64+4],$t1
845 ld [$ap+64+8],$t2
846 ld [$ap+64+12],$t3
847 ld [$ap+64+16],$t4
848 ld [$ap+64+20],$t5
849 ld [$ap+64+24],$t6
850 ld [$ap+64+28],$t7
851 or $t1,$t0,$t0
852 or $t3,$t2,$t2
853 or $t5,$t4,$t4
854 or $t7,$t6,$t6
855 or $t2,$t0,$t0
856 or $t6,$t4,$t4
857 or $t4,$t0,$t0 ! !in1infty
858 movrnz $t0,-1,$t0
859 st $t0,[%fp+STACK_BIAS-16]
860
861 add $bp_real,64,$bp
862 add $bp_real,64,$ap
863 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Z2sqr, in2_z);
864 add %sp,LOCALS+$Z2sqr,$rp
865
866 add $ap_real,64,$bp
867 add $ap_real,64,$ap
868 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Z1sqr, in1_z);
869 add %sp,LOCALS+$Z1sqr,$rp
870
871 add $bp_real,64,$bp
872 add %sp,LOCALS+$Z2sqr,$ap
873 call __ecp_nistz256_mul_mont ! p256_mul_mont(S1, Z2sqr, in2_z);
874 add %sp,LOCALS+$S1,$rp
875
876 add $ap_real,64,$bp
877 add %sp,LOCALS+$Z1sqr,$ap
878 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, Z1sqr, in1_z);
879 add %sp,LOCALS+$S2,$rp
880
881 add $ap_real,32,$bp
882 add %sp,LOCALS+$S1,$ap
883 call __ecp_nistz256_mul_mont ! p256_mul_mont(S1, S1, in1_y);
884 add %sp,LOCALS+$S1,$rp
885
886 add $bp_real,32,$bp
887 add %sp,LOCALS+$S2,$ap
888 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, S2, in2_y);
889 add %sp,LOCALS+$S2,$rp
890
891 add %sp,LOCALS+$S1,$bp
892 call __ecp_nistz256_sub_from ! p256_sub(R, S2, S1);
893 add %sp,LOCALS+$R,$rp
894
895 or @acc[1],@acc[0],@acc[0] ! see if result is zero
896 or @acc[3],@acc[2],@acc[2]
897 or @acc[5],@acc[4],@acc[4]
898 or @acc[7],@acc[6],@acc[6]
899 or @acc[2],@acc[0],@acc[0]
900 or @acc[6],@acc[4],@acc[4]
901 or @acc[4],@acc[0],@acc[0]
902 st @acc[0],[%fp+STACK_BIAS-20]
903
904 add $ap_real,0,$bp
905 add %sp,LOCALS+$Z2sqr,$ap
906 call __ecp_nistz256_mul_mont ! p256_mul_mont(U1, in1_x, Z2sqr);
907 add %sp,LOCALS+$U1,$rp
908
909 add $bp_real,0,$bp
910 add %sp,LOCALS+$Z1sqr,$ap
911 call __ecp_nistz256_mul_mont ! p256_mul_mont(U2, in2_x, Z1sqr);
912 add %sp,LOCALS+$U2,$rp
913
914 add %sp,LOCALS+$U1,$bp
915 call __ecp_nistz256_sub_from ! p256_sub(H, U2, U1);
916 add %sp,LOCALS+$H,$rp
917
918 or @acc[1],@acc[0],@acc[0] ! see if result is zero
919 or @acc[3],@acc[2],@acc[2]
920 or @acc[5],@acc[4],@acc[4]
921 or @acc[7],@acc[6],@acc[6]
922 or @acc[2],@acc[0],@acc[0]
923 or @acc[6],@acc[4],@acc[4]
924 orcc @acc[4],@acc[0],@acc[0]
925
926 bne,pt %icc,.Ladd_proceed ! is_equal(U1,U2)?
927 nop
928
929 ld [%fp+STACK_BIAS-12],$t0
930 ld [%fp+STACK_BIAS-16],$t1
931 ld [%fp+STACK_BIAS-20],$t2
932 andcc $t0,$t1,%g0
933 be,pt %icc,.Ladd_proceed ! (in1infty || in2infty)?
934 nop
935 andcc $t2,$t2,%g0
936 be,pt %icc,.Ladd_double ! is_equal(S1,S2)?
937 nop
938
939 ldx [%fp+STACK_BIAS-8],$rp
940 st %g0,[$rp]
941 st %g0,[$rp+4]
942 st %g0,[$rp+8]
943 st %g0,[$rp+12]
944 st %g0,[$rp+16]
945 st %g0,[$rp+20]
946 st %g0,[$rp+24]
947 st %g0,[$rp+28]
948 st %g0,[$rp+32]
949 st %g0,[$rp+32+4]
950 st %g0,[$rp+32+8]
951 st %g0,[$rp+32+12]
952 st %g0,[$rp+32+16]
953 st %g0,[$rp+32+20]
954 st %g0,[$rp+32+24]
955 st %g0,[$rp+32+28]
956 st %g0,[$rp+64]
957 st %g0,[$rp+64+4]
958 st %g0,[$rp+64+8]
959 st %g0,[$rp+64+12]
960 st %g0,[$rp+64+16]
961 st %g0,[$rp+64+20]
962 st %g0,[$rp+64+24]
963 st %g0,[$rp+64+28]
964 b .Ladd_done
965 nop
966
967.align 16
968.Ladd_double:
969 ldx [%fp+STACK_BIAS-8],$rp_real
970 mov $ap_real,$ap
971 b .Lpoint_double_shortcut
972 add %sp,32*(12-4)+32,%sp ! difference in frame sizes
973
974.align 16
975.Ladd_proceed:
976 add %sp,LOCALS+$R,$bp
977 add %sp,LOCALS+$R,$ap
978 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Rsqr, R);
979 add %sp,LOCALS+$Rsqr,$rp
980
981 add $ap_real,64,$bp
982 add %sp,LOCALS+$H,$ap
983 call __ecp_nistz256_mul_mont ! p256_mul_mont(res_z, H, in1_z);
984 add %sp,LOCALS+$res_z,$rp
985
986 add %sp,LOCALS+$H,$bp
987 add %sp,LOCALS+$H,$ap
988 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Hsqr, H);
989 add %sp,LOCALS+$Hsqr,$rp
990
991 add $bp_real,64,$bp
992 add %sp,LOCALS+$res_z,$ap
993 call __ecp_nistz256_mul_mont ! p256_mul_mont(res_z, res_z, in2_z);
994 add %sp,LOCALS+$res_z,$rp
995
996 add %sp,LOCALS+$H,$bp
997 add %sp,LOCALS+$Hsqr,$ap
998 call __ecp_nistz256_mul_mont ! p256_mul_mont(Hcub, Hsqr, H);
999 add %sp,LOCALS+$Hcub,$rp
1000
1001 add %sp,LOCALS+$U1,$bp
1002 add %sp,LOCALS+$Hsqr,$ap
1003 call __ecp_nistz256_mul_mont ! p256_mul_mont(U2, U1, Hsqr);
1004 add %sp,LOCALS+$U2,$rp
1005
1006 call __ecp_nistz256_mul_by_2 ! p256_mul_by_2(Hsqr, U2);
1007 add %sp,LOCALS+$Hsqr,$rp
1008
1009 add %sp,LOCALS+$Rsqr,$bp
1010 call __ecp_nistz256_sub_morf ! p256_sub(res_x, Rsqr, Hsqr);
1011 add %sp,LOCALS+$res_x,$rp
1012
1013 add %sp,LOCALS+$Hcub,$bp
1014 call __ecp_nistz256_sub_from ! p256_sub(res_x, res_x, Hcub);
1015 add %sp,LOCALS+$res_x,$rp
1016
1017 add %sp,LOCALS+$U2,$bp
1018 call __ecp_nistz256_sub_morf ! p256_sub(res_y, U2, res_x);
1019 add %sp,LOCALS+$res_y,$rp
1020
1021 add %sp,LOCALS+$Hcub,$bp
1022 add %sp,LOCALS+$S1,$ap
1023 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, S1, Hcub);
1024 add %sp,LOCALS+$S2,$rp
1025
1026 add %sp,LOCALS+$R,$bp
1027 add %sp,LOCALS+$res_y,$ap
1028 call __ecp_nistz256_mul_mont ! p256_mul_mont(res_y, res_y, R);
1029 add %sp,LOCALS+$res_y,$rp
1030
1031 add %sp,LOCALS+$S2,$bp
1032 call __ecp_nistz256_sub_from ! p256_sub(res_y, res_y, S2);
1033 add %sp,LOCALS+$res_y,$rp
1034
1035 ld [%fp+STACK_BIAS-16],$t1 ! !in1infty
1036 ld [%fp+STACK_BIAS-12],$t2 ! !in2infty
1037 ldx [%fp+STACK_BIAS-8],$rp
1038___
1039for($i=0;$i<96;$i+=8) { # conditional moves
1040$code.=<<___;
1041 ld [%sp+LOCALS+$i],@acc[0] ! res
1042 ld [%sp+LOCALS+$i+4],@acc[1]
1043 ld [$bp_real+$i],@acc[2] ! in2
1044 ld [$bp_real+$i+4],@acc[3]
1045 ld [$ap_real+$i],@acc[4] ! in1
1046 ld [$ap_real+$i+4],@acc[5]
1047 movrz $t1,@acc[2],@acc[0]
1048 movrz $t1,@acc[3],@acc[1]
1049 movrz $t2,@acc[4],@acc[0]
1050 movrz $t2,@acc[5],@acc[1]
1051 st @acc[0],[$rp+$i]
1052 st @acc[1],[$rp+$i+4]
1053___
1054}
1055$code.=<<___;
1056.Ladd_done:
1057 ret
1058 restore
1059.type ecp_nistz256_point_add,#function
1060.size ecp_nistz256_point_add,.-ecp_nistz256_point_add
1061___
1062}
1063
1064########################################################################
1065# void ecp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1,
1066# const P256_POINT_AFFINE *in2);
1067{
1068my ($res_x,$res_y,$res_z,
1069 $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..9));
1070my $Z1sqr = $S2;
1071# above map() describes stack layout with 10 temporary
1072# 256-bit vectors on top. Then we reserve some space for
1073# !in1infty, !in2infty, result of check for zero and return pointer.
1074
1075my @ONE_mont=(1,0,0,-1,-1,-1,-2,0);
1076my $bp_real=$rp_real;
1077
1078$code.=<<___;
1079.globl ecp_nistz256_point_add_affine
1080.align 32
1081ecp_nistz256_point_add_affine:
1082#if 0
1083 SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
1084 ld [%g1],%g1 ! OPENSSL_sparcv9cap_P[0]
1085 and %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK),%g1
1086 cmp %g1,(SPARCV9_VIS3|SPARCV9_64BIT_STACK)
1087 be ecp_nistz256_point_add_affine_vis3
1088 nop
1089#endif
1090
1091 save %sp,-STACK_FRAME-32*10-32,%sp
1092
1093 stx $rp,[%fp+STACK_BIAS-8] ! off-load $rp
1094 mov $ap,$ap_real
1095 mov $bp,$bp_real
1096
1097 ld [$ap+64],$t0 ! in1_z
1098 ld [$ap+64+4],$t1
1099 ld [$ap+64+8],$t2
1100 ld [$ap+64+12],$t3
1101 ld [$ap+64+16],$t4
1102 ld [$ap+64+20],$t5
1103 ld [$ap+64+24],$t6
1104 ld [$ap+64+28],$t7
1105 or $t1,$t0,$t0
1106 or $t3,$t2,$t2
1107 or $t5,$t4,$t4
1108 or $t7,$t6,$t6
1109 or $t2,$t0,$t0
1110 or $t6,$t4,$t4
1111 or $t4,$t0,$t0 ! !in1infty
1112 movrnz $t0,-1,$t0
1113 st $t0,[%fp+STACK_BIAS-16]
1114
1115 ld [$bp],@acc[0] ! in2_x
1116 ld [$bp+4],@acc[1]
1117 ld [$bp+8],@acc[2]
1118 ld [$bp+12],@acc[3]
1119 ld [$bp+16],@acc[4]
1120 ld [$bp+20],@acc[5]
1121 ld [$bp+24],@acc[6]
1122 ld [$bp+28],@acc[7]
1123 ld [$bp+32],$t0 ! in2_y
1124 ld [$bp+32+4],$t1
1125 ld [$bp+32+8],$t2
1126 ld [$bp+32+12],$t3
1127 ld [$bp+32+16],$t4
1128 ld [$bp+32+20],$t5
1129 ld [$bp+32+24],$t6
1130 ld [$bp+32+28],$t7
1131 or @acc[1],@acc[0],@acc[0]
1132 or @acc[3],@acc[2],@acc[2]
1133 or @acc[5],@acc[4],@acc[4]
1134 or @acc[7],@acc[6],@acc[6]
1135 or @acc[2],@acc[0],@acc[0]
1136 or @acc[6],@acc[4],@acc[4]
1137 or @acc[4],@acc[0],@acc[0]
1138 or $t1,$t0,$t0
1139 or $t3,$t2,$t2
1140 or $t5,$t4,$t4
1141 or $t7,$t6,$t6
1142 or $t2,$t0,$t0
1143 or $t6,$t4,$t4
1144 or $t4,$t0,$t0
1145 or @acc[0],$t0,$t0 ! !in2infty
1146 movrnz $t0,-1,$t0
1147 st $t0,[%fp+STACK_BIAS-12]
1148
1149 add $ap_real,64,$bp
1150 add $ap_real,64,$ap
1151 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Z1sqr, in1_z);
1152 add %sp,LOCALS+$Z1sqr,$rp
1153
1154 add $bp_real,0,$bp
1155 add %sp,LOCALS+$Z1sqr,$ap
1156 call __ecp_nistz256_mul_mont ! p256_mul_mont(U2, Z1sqr, in2_x);
1157 add %sp,LOCALS+$U2,$rp
1158
1159 add $ap_real,0,$bp
1160 call __ecp_nistz256_sub_from ! p256_sub(H, U2, in1_x);
1161 add %sp,LOCALS+$H,$rp
1162
1163 add $ap_real,64,$bp
1164 add %sp,LOCALS+$Z1sqr,$ap
1165 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, Z1sqr, in1_z);
1166 add %sp,LOCALS+$S2,$rp
1167
1168 add $ap_real,64,$bp
1169 add %sp,LOCALS+$H,$ap
1170 call __ecp_nistz256_mul_mont ! p256_mul_mont(res_z, H, in1_z);
1171 add %sp,LOCALS+$res_z,$rp
1172
1173 add $bp_real,32,$bp
1174 add %sp,LOCALS+$S2,$ap
1175 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, S2, in2_y);
1176 add %sp,LOCALS+$S2,$rp
1177
1178 add $ap_real,32,$bp
1179 call __ecp_nistz256_sub_from ! p256_sub(R, S2, in1_y);
1180 add %sp,LOCALS+$R,$rp
1181
1182 add %sp,LOCALS+$H,$bp
1183 add %sp,LOCALS+$H,$ap
1184 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Hsqr, H);
1185 add %sp,LOCALS+$Hsqr,$rp
1186
1187 add %sp,LOCALS+$R,$bp
1188 add %sp,LOCALS+$R,$ap
1189 call __ecp_nistz256_mul_mont ! p256_sqr_mont(Rsqr, R);
1190 add %sp,LOCALS+$Rsqr,$rp
1191
1192 add %sp,LOCALS+$H,$bp
1193 add %sp,LOCALS+$Hsqr,$ap
1194 call __ecp_nistz256_mul_mont ! p256_mul_mont(Hcub, Hsqr, H);
1195 add %sp,LOCALS+$Hcub,$rp
1196
1197 add $ap_real,0,$bp
1198 add %sp,LOCALS+$Hsqr,$ap
1199 call __ecp_nistz256_mul_mont ! p256_mul_mont(U2, in1_x, Hsqr);
1200 add %sp,LOCALS+$U2,$rp
1201
1202 call __ecp_nistz256_mul_by_2 ! p256_mul_by_2(Hsqr, U2);
1203 add %sp,LOCALS+$Hsqr,$rp
1204
1205 add %sp,LOCALS+$Rsqr,$bp
1206 call __ecp_nistz256_sub_morf ! p256_sub(res_x, Rsqr, Hsqr);
1207 add %sp,LOCALS+$res_x,$rp
1208
1209 add %sp,LOCALS+$Hcub,$bp
1210 call __ecp_nistz256_sub_from ! p256_sub(res_x, res_x, Hcub);
1211 add %sp,LOCALS+$res_x,$rp
1212
1213 add %sp,LOCALS+$U2,$bp
1214 call __ecp_nistz256_sub_morf ! p256_sub(res_y, U2, res_x);
1215 add %sp,LOCALS+$res_y,$rp
1216
1217 add $ap_real,32,$bp
1218 add %sp,LOCALS+$Hcub,$ap
1219 call __ecp_nistz256_mul_mont ! p256_mul_mont(S2, in1_y, Hcub);
1220 add %sp,LOCALS+$S2,$rp
1221
1222 add %sp,LOCALS+$R,$bp
1223 add %sp,LOCALS+$res_y,$ap
1224 call __ecp_nistz256_mul_mont ! p256_mul_mont(res_y, res_y, R);
1225 add %sp,LOCALS+$res_y,$rp
1226
1227 add %sp,LOCALS+$S2,$bp
1228 call __ecp_nistz256_sub_from ! p256_sub(res_y, res_y, S2);
1229 add %sp,LOCALS+$res_y,$rp
1230
1231 ld [%fp+STACK_BIAS-16],$t1 ! !in1infty
1232 ld [%fp+STACK_BIAS-12],$t2 ! !in2infty
1233 ldx [%fp+STACK_BIAS-8],$rp
1234___
1235for($i=0;$i<64;$i+=8) { # conditional moves
1236$code.=<<___;
1237 ld [%sp+LOCALS+$i],@acc[0] ! res
1238 ld [%sp+LOCALS+$i+4],@acc[1]
1239 ld [$bp_real+$i],@acc[2] ! in2
1240 ld [$bp_real+$i+4],@acc[3]
1241 ld [$ap_real+$i],@acc[4] ! in1
1242 ld [$ap_real+$i+4],@acc[5]
1243 movrz $t1,@acc[2],@acc[0]
1244 movrz $t1,@acc[3],@acc[1]
1245 movrz $t2,@acc[4],@acc[0]
1246 movrz $t2,@acc[5],@acc[1]
1247 st @acc[0],[$rp+$i]
1248 st @acc[1],[$rp+$i+4]
1249___
1250}
1251for(;$i<96;$i+=8) {
1252my $j=($i-64)/4;
1253$code.=<<___;
1254 ld [%sp+LOCALS+$i],@acc[0] ! res
1255 ld [%sp+LOCALS+$i+4],@acc[1]
1256 ld [$ap_real+$i],@acc[4] ! in1
1257 ld [$ap_real+$i+4],@acc[5]
1258 movrz $t1,@ONE_mont[$j],@acc[0]
1259 movrz $t1,@ONE_mont[$j+1],@acc[1]
1260 movrz $t2,@acc[4],@acc[0]
1261 movrz $t2,@acc[5],@acc[1]
1262 st @acc[0],[$rp+$i]
1263 st @acc[1],[$rp+$i+4]
1264___
1265}
1266$code.=<<___;
1267 ret
1268 restore
1269.type ecp_nistz256_point_add_affine,#function
1270.size ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
1271___
1272} }}}
1273{{{
1274my ($out,$inp,$index)=map("%i$_",(0..2));
1275my $mask="%o0";
1276
1277$code.=<<___;
1278! void ecp_nistz256_select_w5(P256_POINT *%i0,const void *%i1,
1279! int %i2);
1280.globl ecp_nistz256_select_w5
1281.align 32
1282ecp_nistz256_select_w5:
1283 save %sp,-STACK_FRAME,%sp
1284
1285 neg $index,$mask
1286 srax $mask,63,$mask
1287
1288 add $index,$mask,$index
1289 sll $index,2,$index
1290 add $inp,$index,$inp
1291
1292 ld [$inp+64*0],%l0
1293 ld [$inp+64*1],%l1
1294 ld [$inp+64*2],%l2
1295 ld [$inp+64*3],%l3
1296 ld [$inp+64*4],%l4
1297 ld [$inp+64*5],%l5
1298 ld [$inp+64*6],%l6
1299 ld [$inp+64*7],%l7
1300 add $inp,64*8,$inp
1301 and %l0,$mask,%l0
1302 and %l1,$mask,%l1
1303 st %l0,[$out] ! X
1304 and %l2,$mask,%l2
1305 st %l1,[$out+4]
1306 and %l3,$mask,%l3
1307 st %l2,[$out+8]
1308 and %l4,$mask,%l4
1309 st %l3,[$out+12]
1310 and %l5,$mask,%l5
1311 st %l4,[$out+16]
1312 and %l6,$mask,%l6
1313 st %l5,[$out+20]
1314 and %l7,$mask,%l7
1315 st %l6,[$out+24]
1316 st %l7,[$out+28]
1317 add $out,32,$out
1318
1319 ld [$inp+64*0],%l0
1320 ld [$inp+64*1],%l1
1321 ld [$inp+64*2],%l2
1322 ld [$inp+64*3],%l3
1323 ld [$inp+64*4],%l4
1324 ld [$inp+64*5],%l5
1325 ld [$inp+64*6],%l6
1326 ld [$inp+64*7],%l7
1327 add $inp,64*8,$inp
1328 and %l0,$mask,%l0
1329 and %l1,$mask,%l1
1330 st %l0,[$out] ! Y
1331 and %l2,$mask,%l2
1332 st %l1,[$out+4]
1333 and %l3,$mask,%l3
1334 st %l2,[$out+8]
1335 and %l4,$mask,%l4
1336 st %l3,[$out+12]
1337 and %l5,$mask,%l5
1338 st %l4,[$out+16]
1339 and %l6,$mask,%l6
1340 st %l5,[$out+20]
1341 and %l7,$mask,%l7
1342 st %l6,[$out+24]
1343 st %l7,[$out+28]
1344 add $out,32,$out
1345
1346 ld [$inp+64*0],%l0
1347 ld [$inp+64*1],%l1
1348 ld [$inp+64*2],%l2
1349 ld [$inp+64*3],%l3
1350 ld [$inp+64*4],%l4
1351 ld [$inp+64*5],%l5
1352 ld [$inp+64*6],%l6
1353 ld [$inp+64*7],%l7
1354 and %l0,$mask,%l0
1355 and %l1,$mask,%l1
1356 st %l0,[$out] ! Z
1357 and %l2,$mask,%l2
1358 st %l1,[$out+4]
1359 and %l3,$mask,%l3
1360 st %l2,[$out+8]
1361 and %l4,$mask,%l4
1362 st %l3,[$out+12]
1363 and %l5,$mask,%l5
1364 st %l4,[$out+16]
1365 and %l6,$mask,%l6
1366 st %l5,[$out+20]
1367 and %l7,$mask,%l7
1368 st %l6,[$out+24]
1369 st %l7,[$out+28]
1370
1371 ret
1372 restore
1373.type ecp_nistz256_select_w5,#function
1374.size ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
1375
1376! void ecp_nistz256_select_w7(P256_POINT_AFFINE *%i0,const void *%i1,
1377! int %i2);
1378.globl ecp_nistz256_select_w7
1379.align 32
1380ecp_nistz256_select_w7:
1381 save %sp,-STACK_FRAME,%sp
1382
1383 neg $index,$mask
1384 srax $mask,63,$mask
1385
1386 add $index,$mask,$index
1387 add $inp,$index,$inp
1388 mov 64/4,$index
1389
1390.Loop_select_w7:
1391 ldub [$inp+64*0],%l0
1392 prefetch [$inp+3840+64*0],1
1393 subcc $index,1,$index
1394 ldub [$inp+64*1],%l1
1395 prefetch [$inp+3840+64*1],1
1396 ldub [$inp+64*2],%l2
1397 prefetch [$inp+3840+64*2],1
1398 ldub [$inp+64*3],%l3
1399 prefetch [$inp+3840+64*3],1
1400 add $inp,64*4,$inp
1401 sll %l1,8,%l1
1402 sll %l2,16,%l2
1403 or %l0,%l1,%l0
1404 sll %l3,24,%l3
1405 or %l0,%l2,%l0
1406 or %l0,%l3,%l0
1407 and %l0,$mask,%l0
1408 st %l0,[$out]
1409 bne .Loop_select_w7
1410 add $out,4,$out
1411
1412 ret
1413 restore
1414.type ecp_nistz256_select_w7,#function
1415.size ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
1416___
1417}}}
1418{{{
1419########################################################################
1420# Following subroutines are VIS3 counterparts of those above that
1421# implement ones found in ecp_nistz256.c. Key difference is that they
1422# use 128-bit muliplication and addition with 64-bit carry, and in order
1423# to do that they perform conversion from uin32_t[8] to uint64_t[4] upon
1424# entry and vice versa on return.
1425#
1426my ($rp,$ap,$bp)=map("%i$_",(0..2));
1427my ($t0,$t1,$t2,$t3,$a0,$a1,$a2,$a3)=map("%l$_",(0..7));
1428my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5)=map("%o$_",(0..5));
1429my ($bi,$poly1,$poly3,$minus1)=(map("%i$_",(3..5)),"%g1");
1430my ($rp_real,$ap_real)=("%g2","%g3");
1431my ($acc6,$acc7)=($bp,$bi); # used in squaring
1432
1433$code.=<<___;
1434#if 0
1435.align 32
1436__ecp_nistz256_mul_by_2_vis3:
1437 addcc $acc0,$acc0,$acc0
1438 addxccc $acc1,$acc1,$acc1
1439 addxccc $acc2,$acc2,$acc2
1440 addxccc $acc3,$acc3,$acc3
1441 b .Lreduce_by_sub_vis3
1442 addxc %g0,%g0,$acc4 ! did it carry?
1443.type __ecp_nistz256_mul_by_2_vis3,#function
1444.size __ecp_nistz256_mul_by_2_vis3,.-__ecp_nistz256_mul_by_2_vis3
1445
1446.align 32
1447__ecp_nistz256_add_vis3:
1448 ldx [$bp+0],$t0
1449 ldx [$bp+8],$t1
1450 ldx [$bp+16],$t2
1451 ldx [$bp+24],$t3
1452
1453__ecp_nistz256_add_noload_vis3:
1454
1455 addcc $t0,$acc0,$acc0
1456 addxccc $t1,$acc1,$acc1
1457 addxccc $t2,$acc2,$acc2
1458 addxccc $t3,$acc3,$acc3
1459 addxc %g0,%g0,$acc4 ! did it carry?
1460
1461.Lreduce_by_sub_vis3:
1462
1463 addcc $acc0,1,$t0 ! add -modulus, i.e. subtract
1464 addxccc $acc1,$poly1,$t1
1465 addxccc $acc2,$minus1,$t2
1466 addxccc $acc3,$poly3,$t3
1467 addxc $acc4,$minus1,$acc4
1468
1469 movrz $acc4,$t0,$acc0 ! ret = borrow ? ret : ret-modulus
1470 movrz $acc4,$t1,$acc1
1471 stx $acc0,[$rp]
1472 movrz $acc4,$t2,$acc2
1473 stx $acc1,[$rp+8]
1474 movrz $acc4,$t3,$acc3
1475 stx $acc2,[$rp+16]
1476 retl
1477 stx $acc3,[$rp+24]
1478.type __ecp_nistz256_add_vis3,#function
1479.size __ecp_nistz256_add_vis3,.-__ecp_nistz256_add_vis3
1480
1481! Trouble with subtraction is that there is no subtraction with 64-bit
1482! borrow, only with 32-bit one. For this reason we "decompose" 64-bit
1483! $acc0-$acc3 to 32-bit values and pick b[4] in 32-bit pieces. But
1484! recall that SPARC is big-endian, which is why you'll observe that
1485! b[4] is accessed as 4-0-12-8-20-16-28-24. And prior reduction we
1486! "collect" result back to 64-bit $acc0-$acc3.
1487.align 32
1488__ecp_nistz256_sub_from_vis3:
1489 ld [$bp+4],$t0
1490 ld [$bp+0],$t1
1491 ld [$bp+12],$t2
1492 ld [$bp+8],$t3
1493
1494 srlx $acc0,32,$acc4
1495 not $poly1,$poly1
1496 srlx $acc1,32,$acc5
1497 subcc $acc0,$t0,$acc0
1498 ld [$bp+20],$t0
1499 subccc $acc4,$t1,$acc4
1500 ld [$bp+16],$t1
1501 subccc $acc1,$t2,$acc1
1502 ld [$bp+28],$t2
1503 and $acc0,$poly1,$acc0
1504 subccc $acc5,$t3,$acc5
1505 ld [$bp+24],$t3
1506 sllx $acc4,32,$acc4
1507 and $acc1,$poly1,$acc1
1508 sllx $acc5,32,$acc5
1509 or $acc0,$acc4,$acc0
1510 srlx $acc2,32,$acc4
1511 or $acc1,$acc5,$acc1
1512 srlx $acc3,32,$acc5
1513 subccc $acc2,$t0,$acc2
1514 subccc $acc4,$t1,$acc4
1515 subccc $acc3,$t2,$acc3
1516 and $acc2,$poly1,$acc2
1517 subccc $acc5,$t3,$acc5
1518 sllx $acc4,32,$acc4
1519 and $acc3,$poly1,$acc3
1520 sllx $acc5,32,$acc5
1521 or $acc2,$acc4,$acc2
1522 subc %g0,%g0,$acc4 ! did it borrow?
1523 b .Lreduce_by_add_vis3
1524 or $acc3,$acc5,$acc3
1525.type __ecp_nistz256_sub_from_vis3,#function
1526.size __ecp_nistz256_sub_from_vis3,.-__ecp_nistz256_sub_from_vis3
1527
1528.align 32
1529__ecp_nistz256_sub_morf_vis3:
1530 ld [$bp+4],$t0
1531 ld [$bp+0],$t1
1532 ld [$bp+12],$t2
1533 ld [$bp+8],$t3
1534
1535 srlx $acc0,32,$acc4
1536 not $poly1,$poly1
1537 srlx $acc1,32,$acc5
1538 subcc $t0,$acc0,$acc0
1539 ld [$bp+20],$t0
1540 subccc $t1,$acc4,$acc4
1541 ld [$bp+16],$t1
1542 subccc $t2,$acc1,$acc1
1543 ld [$bp+28],$t2
1544 and $acc0,$poly1,$acc0
1545 subccc $t3,$acc5,$acc5
1546 ld [$bp+24],$t3
1547 sllx $acc4,32,$acc4
1548 and $acc1,$poly1,$acc1
1549 sllx $acc5,32,$acc5
1550 or $acc0,$acc4,$acc0
1551 srlx $acc2,32,$acc4
1552 or $acc1,$acc5,$acc1
1553 srlx $acc3,32,$acc5
1554 subccc $t0,$acc2,$acc2
1555 subccc $t1,$acc4,$acc4
1556 subccc $t2,$acc3,$acc3
1557 and $acc2,$poly1,$acc2
1558 subccc $t3,$acc5,$acc5
1559 sllx $acc4,32,$acc4
1560 and $acc3,$poly1,$acc3
1561 sllx $acc5,32,$acc5
1562 or $acc2,$acc4,$acc2
1563 subc %g0,%g0,$acc4 ! did it borrow?
1564 or $acc3,$acc5,$acc3
1565
1566.Lreduce_by_add_vis3:
1567
1568 addcc $acc0,-1,$t0 ! add modulus
1569 not $poly3,$t3
1570 addxccc $acc1,$poly1,$t1
1571 not $poly1,$poly1 ! restore $poly1
1572 addxccc $acc2,%g0,$t2
1573 addxc $acc3,$t3,$t3
1574
1575 movrnz $acc4,$t0,$acc0 ! if a-b borrowed, ret = ret+mod
1576 movrnz $acc4,$t1,$acc1
1577 stx $acc0,[$rp]
1578 movrnz $acc4,$t2,$acc2
1579 stx $acc1,[$rp+8]
1580 movrnz $acc4,$t3,$acc3
1581 stx $acc2,[$rp+16]
1582 retl
1583 stx $acc3,[$rp+24]
1584.type __ecp_nistz256_sub_morf_vis3,#function
1585.size __ecp_nistz256_sub_morf_vis3,.-__ecp_nistz256_sub_morf_vis3
1586
1587.align 32
1588__ecp_nistz256_div_by_2_vis3:
1589 ! ret = (a is odd ? a+mod : a) >> 1
1590
1591 not $poly1,$t1
1592 not $poly3,$t3
1593 and $acc0,1,$acc5
1594 addcc $acc0,-1,$t0 ! add modulus
1595 addxccc $acc1,$t1,$t1
1596 addxccc $acc2,%g0,$t2
1597 addxccc $acc3,$t3,$t3
1598 addxc %g0,%g0,$acc4 ! carry bit
1599
1600 movrnz $acc5,$t0,$acc0
1601 movrnz $acc5,$t1,$acc1
1602 movrnz $acc5,$t2,$acc2
1603 movrnz $acc5,$t3,$acc3
1604 movrz $acc5,%g0,$acc4
1605
1606 ! ret >>= 1
1607
1608 srlx $acc0,1,$acc0
1609 sllx $acc1,63,$t0
1610 srlx $acc1,1,$acc1
1611 or $acc0,$t0,$acc0
1612 sllx $acc2,63,$t1
1613 srlx $acc2,1,$acc2
1614 or $acc1,$t1,$acc1
1615 sllx $acc3,63,$t2
1616 stx $acc0,[$rp]
1617 srlx $acc3,1,$acc3
1618 or $acc2,$t2,$acc2
1619 sllx $acc4,63,$t3 ! don't forget carry bit
1620 stx $acc1,[$rp+8]
1621 or $acc3,$t3,$acc3
1622 stx $acc2,[$rp+16]
1623 retl
1624 stx $acc3,[$rp+24]
1625.type __ecp_nistz256_div_by_2_vis3,#function
1626.size __ecp_nistz256_div_by_2_vis3,.-__ecp_nistz256_div_by_2_vis3
1627
1628! compared to __ecp_nistz256_mul_mont it's almost 4x smaller and
1629! 4x faster [on T4]...
1630.align 32
1631__ecp_nistz256_mul_mont_vis3:
1632 mulx $a0,$bi,$acc0
1633 not $poly3,$poly3 ! 0xFFFFFFFF00000001
1634 umulxhi $a0,$bi,$t0
1635 mulx $a1,$bi,$acc1
1636 umulxhi $a1,$bi,$t1
1637 mulx $a2,$bi,$acc2
1638 umulxhi $a2,$bi,$t2
1639 mulx $a3,$bi,$acc3
1640 umulxhi $a3,$bi,$t3
1641 ldx [$bp+8],$bi ! b[1]
1642
1643 addcc $acc1,$t0,$acc1 ! accumulate high parts of multiplication
1644 sllx $acc0,32,$t0
1645 addxccc $acc2,$t1,$acc2
1646 srlx $acc0,32,$t1
1647 addxccc $acc3,$t2,$acc3
1648 addxc %g0,$t3,$acc4
1649 mov 0,$acc5
1650___
1651for($i=1;$i<4;$i++) {
1652 # Reduction iteration is normally performed by accumulating
1653 # result of multiplication of modulus by "magic" digit [and
1654 # omitting least significant word, which is guaranteed to
1655 # be 0], but thanks to special form of modulus and "magic"
1656 # digit being equal to least significant word, it can be
1657 # performed with additions and subtractions alone. Indeed:
1658 #
1659 # ffff0001.00000000.0000ffff.ffffffff
1660 # * abcdefgh
1661 # + xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh
1662 #
1663 # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
1664 # rewrite above as:
1665 #
1666 # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh
1667 # + abcdefgh.abcdefgh.0000abcd.efgh0000.00000000
1668 # - 0000abcd.efgh0000.00000000.00000000.abcdefgh
1669 #
1670 # or marking redundant operations:
1671 #
1672 # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.--------
1673 # + abcdefgh.abcdefgh.0000abcd.efgh0000.--------
1674 # - 0000abcd.efgh0000.--------.--------.--------
1675 # ^^^^^^^^ but this word is calculated with umulxhi, because
1676 # there is no subtract with 64-bit borrow:-(
1677
1678$code.=<<___;
1679 sub $acc0,$t0,$t2 ! acc0*0xFFFFFFFF00000001, low part
1680 umulxhi $acc0,$poly3,$t3 ! acc0*0xFFFFFFFF00000001, high part
1681 addcc $acc1,$t0,$acc0 ! +=acc[0]<<96 and omit acc[0]
1682 mulx $a0,$bi,$t0
1683 addxccc $acc2,$t1,$acc1
1684 mulx $a1,$bi,$t1
1685 addxccc $acc3,$t2,$acc2 ! +=acc[0]*0xFFFFFFFF00000001
1686 mulx $a2,$bi,$t2
1687 addxccc $acc4,$t3,$acc3
1688 mulx $a3,$bi,$t3
1689 addxc $acc5,%g0,$acc4
1690
1691 addcc $acc0,$t0,$acc0 ! accumulate low parts of multiplication
1692 umulxhi $a0,$bi,$t0
1693 addxccc $acc1,$t1,$acc1
1694 umulxhi $a1,$bi,$t1
1695 addxccc $acc2,$t2,$acc2
1696 umulxhi $a2,$bi,$t2
1697 addxccc $acc3,$t3,$acc3
1698 umulxhi $a3,$bi,$t3
1699 addxc $acc4,%g0,$acc4
1700___
1701$code.=<<___ if ($i<3);
1702 ldx [$bp+8*($i+1)],$bi ! bp[$i+1]
1703___
1704$code.=<<___;
1705 addcc $acc1,$t0,$acc1 ! accumulate high parts of multiplication
1706 sllx $acc0,32,$t0
1707 addxccc $acc2,$t1,$acc2
1708 srlx $acc0,32,$t1
1709 addxccc $acc3,$t2,$acc3
1710 addxccc $acc4,$t3,$acc4
1711 addxc %g0,%g0,$acc5
1712___
1713}
1714$code.=<<___;
1715 sub $acc0,$t0,$t2 ! acc0*0xFFFFFFFF00000001, low part
1716 umulxhi $acc0,$poly3,$t3 ! acc0*0xFFFFFFFF00000001, high part
1717 addcc $acc1,$t0,$acc0 ! +=acc[0]<<96 and omit acc[0]
1718 addxccc $acc2,$t1,$acc1
1719 addxccc $acc3,$t2,$acc2 ! +=acc[0]*0xFFFFFFFF00000001
1720 addxccc $acc4,$t3,$acc3
1721 b .Lmul_final_vis3 ! see below
1722 addxc $acc5,%g0,$acc4
1723.type __ecp_nistz256_mul_mont_vis3,#function
1724.size __ecp_nistz256_mul_mont_vis3,.-__ecp_nistz256_mul_mont_vis3
1725
1726! compared to above __ecp_nistz256_mul_mont_vis3 it's 21% less
1727! instructions, but only 14% faster [on T4]...
1728.align 32
1729__ecp_nistz256_sqr_mont_vis3:
1730 ! | | | | | |a1*a0| |
1731 ! | | | | |a2*a0| | |
1732 ! | |a3*a2|a3*a0| | | |
1733 ! | | | |a2*a1| | | |
1734 ! | | |a3*a1| | | | |
1735 ! *| | | | | | | | 2|
1736 ! +|a3*a3|a2*a2|a1*a1|a0*a0|
1737 ! |--+--+--+--+--+--+--+--|
1738 ! |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx
1739 !
1740 ! "can't overflow" below mark carrying into high part of
1741 ! multiplication result, which can't overflow, because it
1742 ! can never be all ones.
1743
1744 mulx $a1,$a0,$acc1 ! a[1]*a[0]
1745 umulxhi $a1,$a0,$t1
1746 mulx $a2,$a0,$acc2 ! a[2]*a[0]
1747 umulxhi $a2,$a0,$t2
1748 mulx $a3,$a0,$acc3 ! a[3]*a[0]
1749 umulxhi $a3,$a0,$acc4
1750
1751 addcc $acc2,$t1,$acc2 ! accumulate high parts of multiplication
1752 mulx $a2,$a1,$t0 ! a[2]*a[1]
1753 umulxhi $a2,$a1,$t1
1754 addxccc $acc3,$t2,$acc3
1755 mulx $a3,$a1,$t2 ! a[3]*a[1]
1756 umulxhi $a3,$a1,$t3
1757 addxc $acc4,%g0,$acc4 ! can't overflow
1758
1759 mulx $a3,$a2,$acc5 ! a[3]*a[2]
1760 not $poly3,$poly3 ! 0xFFFFFFFF00000001
1761 umulxhi $a3,$a2,$acc6
1762
1763 addcc $t2,$t1,$t1 ! accumulate high parts of multiplication
1764 mulx $a0,$a0,$acc0 ! a[0]*a[0]
1765 addxc $t3,%g0,$t2 ! can't overflow
1766
1767 addcc $acc3,$t0,$acc3 ! accumulate low parts of multiplication
1768 umulxhi $a0,$a0,$a0
1769 addxccc $acc4,$t1,$acc4
1770 mulx $a1,$a1,$t1 ! a[1]*a[1]
1771 addxccc $acc5,$t2,$acc5
1772 umulxhi $a1,$a1,$a1
1773 addxc $acc6,%g0,$acc6 ! can't overflow
1774
1775 addcc $acc1,$acc1,$acc1 ! acc[1-6]*=2
1776 mulx $a2,$a2,$t2 ! a[2]*a[2]
1777 addxccc $acc2,$acc2,$acc2
1778 umulxhi $a2,$a2,$a2
1779 addxccc $acc3,$acc3,$acc3
1780 mulx $a3,$a3,$t3 ! a[3]*a[3]
1781 addxccc $acc4,$acc4,$acc4
1782 umulxhi $a3,$a3,$a3
1783 addxccc $acc5,$acc5,$acc5
1784 addxccc $acc6,$acc6,$acc6
1785 addxc %g0,%g0,$acc7
1786
1787 addcc $acc1,$a0,$acc1 ! +a[i]*a[i]
1788 addxccc $acc2,$t1,$acc2
1789 addxccc $acc3,$a1,$acc3
1790 addxccc $acc4,$t2,$acc4
1791 sllx $acc0,32,$t0
1792 addxccc $acc5,$a2,$acc5
1793 srlx $acc0,32,$t1
1794 addxccc $acc6,$t3,$acc6
1795 sub $acc0,$t0,$t2 ! acc0*0xFFFFFFFF00000001, low part
1796 addxc $acc7,$a3,$acc7
1797___
1798for($i=0;$i<3;$i++) { # reductions, see commentary
1799 # in multiplication for details
1800$code.=<<___;
1801 umulxhi $acc0,$poly3,$t3 ! acc0*0xFFFFFFFF00000001, high part
1802 addcc $acc1,$t0,$acc0 ! +=acc[0]<<96 and omit acc[0]
1803 sllx $acc0,32,$t0
1804 addxccc $acc2,$t1,$acc1
1805 srlx $acc0,32,$t1
1806 addxccc $acc3,$t2,$acc2 ! +=acc[0]*0xFFFFFFFF00000001
1807 sub $acc0,$t0,$t2 ! acc0*0xFFFFFFFF00000001, low part
1808 addxc %g0,$t3,$acc3 ! can't overflow
1809___
1810}
1811$code.=<<___;
1812 umulxhi $acc0,$poly3,$t3 ! acc0*0xFFFFFFFF00000001, high part
1813 addcc $acc1,$t0,$acc0 ! +=acc[0]<<96 and omit acc[0]
1814 addxccc $acc2,$t1,$acc1
1815 addxccc $acc3,$t2,$acc2 ! +=acc[0]*0xFFFFFFFF00000001
1816 addxc %g0,$t3,$acc3 ! can't overflow
1817
1818 addcc $acc0,$acc4,$acc0 ! accumulate upper half
1819 addxccc $acc1,$acc5,$acc1
1820 addxccc $acc2,$acc6,$acc2
1821 addxccc $acc3,$acc7,$acc3
1822 addxc %g0,%g0,$acc4
1823
1824.Lmul_final_vis3:
1825
1826 ! Final step is "if result > mod, subtract mod", but as comparison
1827 ! means subtraction, we do the subtraction and then copy outcome
1828 ! if it didn't borrow. But note that as we [have to] replace
1829 ! subtraction with addition with negative, carry/borrow logic is
1830 ! inverse.
1831
1832 addcc $acc0,1,$t0 ! add -modulus, i.e. subtract
1833 not $poly3,$poly3 ! restore 0x00000000FFFFFFFE
1834 addxccc $acc1,$poly1,$t1
1835 addxccc $acc2,$minus1,$t2
1836 addxccc $acc3,$poly3,$t3
1837 addxccc $acc4,$minus1,%g0 ! did it carry?
1838
1839 movcs %xcc,$t0,$acc0
1840 movcs %xcc,$t1,$acc1
1841 stx $acc0,[$rp]
1842 movcs %xcc,$t2,$acc2
1843 stx $acc1,[$rp+8]
1844 movcs %xcc,$t3,$acc3
1845 stx $acc2,[$rp+16]
1846 retl
1847 stx $acc3,[$rp+24]
1848.type __ecp_nistz256_sqr_mont_vis3,#function
1849.size __ecp_nistz256_sqr_mont_vis3,.-__ecp_nistz256_sqr_mont_vis3
1850___
1851
1852########################################################################
1853# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp);
1854#
1855{
1856my ($res_x,$res_y,$res_z,
1857 $in_x,$in_y,$in_z,
1858 $S,$M,$Zsqr,$tmp0)=map(32*$_,(0..9));
1859# above map() describes stack layout with 10 temporary
1860# 256-bit vectors on top.
1861
1862$code.=<<___;
1863.align 32
1864ecp_nistz256_point_double_vis3:
1865 save %sp,-STACK64_FRAME-32*10,%sp
1866
1867 mov $rp,$rp_real
1868.Ldouble_shortcut_vis3:
1869 mov -1,$minus1
1870 mov -2,$poly3
1871 sllx $minus1,32,$poly1 ! 0xFFFFFFFF00000000
1872 srl $poly3,0,$poly3 ! 0x00000000FFFFFFFE
1873
1874 ! convert input to uint64_t[4]
1875 ld [$ap],$a0 ! in_x
1876 ld [$ap+4],$t0
1877 ld [$ap+8],$a1
1878 ld [$ap+12],$t1
1879 ld [$ap+16],$a2
1880 ld [$ap+20],$t2
1881 ld [$ap+24],$a3
1882 ld [$ap+28],$t3
1883 sllx $t0,32,$t0
1884 sllx $t1,32,$t1
1885 ld [$ap+32],$acc0 ! in_y
1886 or $a0,$t0,$a0
1887 ld [$ap+32+4],$t0
1888 sllx $t2,32,$t2
1889 ld [$ap+32+8],$acc1
1890 or $a1,$t1,$a1
1891 ld [$ap+32+12],$t1
1892 sllx $t3,32,$t3
1893 ld [$ap+32+16],$acc2
1894 or $a2,$t2,$a2
1895 ld [$ap+32+20],$t2
1896 or $a3,$t3,$a3
1897 ld [$ap+32+24],$acc3
1898 sllx $t0,32,$t0
1899 ld [$ap+32+28],$t3
1900 sllx $t1,32,$t1
1901 stx $a0,[%sp+LOCALS64+$in_x]
1902 sllx $t2,32,$t2
1903 stx $a1,[%sp+LOCALS64+$in_x+8]
1904 sllx $t3,32,$t3
1905 stx $a2,[%sp+LOCALS64+$in_x+16]
1906 or $acc0,$t0,$acc0
1907 stx $a3,[%sp+LOCALS64+$in_x+24]
1908 or $acc1,$t1,$acc1
1909 stx $acc0,[%sp+LOCALS64+$in_y]
1910 or $acc2,$t2,$acc2
1911 stx $acc1,[%sp+LOCALS64+$in_y+8]
1912 or $acc3,$t3,$acc3
1913 stx $acc2,[%sp+LOCALS64+$in_y+16]
1914 stx $acc3,[%sp+LOCALS64+$in_y+24]
1915
1916 ld [$ap+64],$a0 ! in_z
1917 ld [$ap+64+4],$t0
1918 ld [$ap+64+8],$a1
1919 ld [$ap+64+12],$t1
1920 ld [$ap+64+16],$a2
1921 ld [$ap+64+20],$t2
1922 ld [$ap+64+24],$a3
1923 ld [$ap+64+28],$t3
1924 sllx $t0,32,$t0
1925 sllx $t1,32,$t1
1926 or $a0,$t0,$a0
1927 sllx $t2,32,$t2
1928 or $a1,$t1,$a1
1929 sllx $t3,32,$t3
1930 or $a2,$t2,$a2
1931 or $a3,$t3,$a3
1932 sllx $t0,32,$t0
1933 sllx $t1,32,$t1
1934 stx $a0,[%sp+LOCALS64+$in_z]
1935 sllx $t2,32,$t2
1936 stx $a1,[%sp+LOCALS64+$in_z+8]
1937 sllx $t3,32,$t3
1938 stx $a2,[%sp+LOCALS64+$in_z+16]
1939 stx $a3,[%sp+LOCALS64+$in_z+24]
1940
1941 ! in_y is still in $acc0-$acc3
1942 call __ecp_nistz256_mul_by_2_vis3 ! p256_mul_by_2(S, in_y);
1943 add %sp,LOCALS64+$S,$rp
1944
1945 ! in_z is still in $a0-$a3
1946 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Zsqr, in_z);
1947 add %sp,LOCALS64+$Zsqr,$rp
1948
1949 mov $acc0,$a0 ! put Zsqr aside
1950 mov $acc1,$a1
1951 mov $acc2,$a2
1952 mov $acc3,$a3
1953
1954 add %sp,LOCALS64+$in_x,$bp
1955 call __ecp_nistz256_add_vis3 ! p256_add(M, Zsqr, in_x);
1956 add %sp,LOCALS64+$M,$rp
1957
1958 mov $a0,$acc0 ! restore Zsqr
1959 ldx [%sp+LOCALS64+$S],$a0 ! forward load
1960 mov $a1,$acc1
1961 ldx [%sp+LOCALS64+$S+8],$a1
1962 mov $a2,$acc2
1963 ldx [%sp+LOCALS64+$S+16],$a2
1964 mov $a3,$acc3
1965 ldx [%sp+LOCALS64+$S+24],$a3
1966
1967 add %sp,LOCALS64+$in_x,$bp
1968 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(Zsqr, in_x, Zsqr);
1969 add %sp,LOCALS64+$Zsqr,$rp
1970
1971 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(S, S);
1972 add %sp,LOCALS64+$S,$rp
1973
1974 ldx [%sp+LOCALS64+$in_z],$bi
1975 ldx [%sp+LOCALS64+$in_y],$a0
1976 ldx [%sp+LOCALS64+$in_y+8],$a1
1977 ldx [%sp+LOCALS64+$in_y+16],$a2
1978 ldx [%sp+LOCALS64+$in_y+24],$a3
1979 add %sp,LOCALS64+$in_z,$bp
1980 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(tmp0, in_z, in_y);
1981 add %sp,LOCALS64+$tmp0,$rp
1982
1983 ldx [%sp+LOCALS64+$M],$bi ! forward load
1984 ldx [%sp+LOCALS64+$Zsqr],$a0
1985 ldx [%sp+LOCALS64+$Zsqr+8],$a1
1986 ldx [%sp+LOCALS64+$Zsqr+16],$a2
1987 ldx [%sp+LOCALS64+$Zsqr+24],$a3
1988
1989 call __ecp_nistz256_mul_by_2_vis3 ! p256_mul_by_2(res_z, tmp0);
1990 add %sp,LOCALS64+$res_z,$rp
1991
1992 add %sp,LOCALS64+$M,$bp
1993 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(M, M, Zsqr);
1994 add %sp,LOCALS64+$M,$rp
1995
1996 mov $acc0,$a0 ! put aside M
1997 mov $acc1,$a1
1998 mov $acc2,$a2
1999 mov $acc3,$a3
2000 call __ecp_nistz256_mul_by_2_vis3
2001 add %sp,LOCALS64+$M,$rp
2002 mov $a0,$t0 ! copy M
2003 ldx [%sp+LOCALS64+$S],$a0 ! forward load
2004 mov $a1,$t1
2005 ldx [%sp+LOCALS64+$S+8],$a1
2006 mov $a2,$t2
2007 ldx [%sp+LOCALS64+$S+16],$a2
2008 mov $a3,$t3
2009 ldx [%sp+LOCALS64+$S+24],$a3
2010 call __ecp_nistz256_add_noload_vis3 ! p256_mul_by_3(M, M);
2011 add %sp,LOCALS64+$M,$rp
2012
2013 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(tmp0, S);
2014 add %sp,LOCALS64+$tmp0,$rp
2015
2016 ldx [%sp+LOCALS64+$S],$bi ! forward load
2017 ldx [%sp+LOCALS64+$in_x],$a0
2018 ldx [%sp+LOCALS64+$in_x+8],$a1
2019 ldx [%sp+LOCALS64+$in_x+16],$a2
2020 ldx [%sp+LOCALS64+$in_x+24],$a3
2021
2022 call __ecp_nistz256_div_by_2_vis3 ! p256_div_by_2(res_y, tmp0);
2023 add %sp,LOCALS64+$res_y,$rp
2024
2025 add %sp,LOCALS64+$S,$bp
2026 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S, S, in_x);
2027 add %sp,LOCALS64+$S,$rp
2028
2029 ldx [%sp+LOCALS64+$M],$a0 ! forward load
2030 ldx [%sp+LOCALS64+$M+8],$a1
2031 ldx [%sp+LOCALS64+$M+16],$a2
2032 ldx [%sp+LOCALS64+$M+24],$a3
2033
2034 call __ecp_nistz256_mul_by_2_vis3 ! p256_mul_by_2(tmp0, S);
2035 add %sp,LOCALS64+$tmp0,$rp
2036
2037 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(res_x, M);
2038 add %sp,LOCALS64+$res_x,$rp
2039
2040 add %sp,LOCALS64+$tmp0,$bp
2041 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_x, res_x, tmp0);
2042 add %sp,LOCALS64+$res_x,$rp
2043
2044 ldx [%sp+LOCALS64+$M],$a0 ! forward load
2045 ldx [%sp+LOCALS64+$M+8],$a1
2046 ldx [%sp+LOCALS64+$M+16],$a2
2047 ldx [%sp+LOCALS64+$M+24],$a3
2048
2049 add %sp,LOCALS64+$S,$bp
2050 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(S, S, res_x);
2051 add %sp,LOCALS64+$S,$rp
2052
2053 mov $acc0,$bi
2054 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S, S, M);
2055 add %sp,LOCALS64+$S,$rp
2056
2057 ldx [%sp+LOCALS64+$res_x],$a0 ! forward load
2058 ldx [%sp+LOCALS64+$res_x+8],$a1
2059 ldx [%sp+LOCALS64+$res_x+16],$a2
2060 ldx [%sp+LOCALS64+$res_x+24],$a3
2061
2062 add %sp,LOCALS64+$res_y,$bp
2063 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_y, S, res_y);
2064 add %sp,LOCALS64+$res_y,$bp
2065
2066 ! convert output to uint_32[8]
2067 srlx $a0,32,$t0
2068 srlx $a1,32,$t1
2069 st $a0,[$rp_real] ! res_x
2070 srlx $a2,32,$t2
2071 st $t0,[$rp_real+4]
2072 srlx $a3,32,$t3
2073 st $a1,[$rp_real+8]
2074 st $t1,[$rp_real+12]
2075 st $a2,[$rp_real+16]
2076 st $t2,[$rp_real+20]
2077 st $a3,[$rp_real+24]
2078 st $t3,[$rp_real+28]
2079
2080 ldx [%sp+LOCALS64+$res_z],$a0 ! forward load
2081 srlx $acc0,32,$t0
2082 ldx [%sp+LOCALS64+$res_z+8],$a1
2083 srlx $acc1,32,$t1
2084 ldx [%sp+LOCALS64+$res_z+16],$a2
2085 srlx $acc2,32,$t2
2086 ldx [%sp+LOCALS64+$res_z+24],$a3
2087 srlx $acc3,32,$t3
2088 st $acc0,[$rp_real+32] ! res_y
2089 st $t0, [$rp_real+32+4]
2090 st $acc1,[$rp_real+32+8]
2091 st $t1, [$rp_real+32+12]
2092 st $acc2,[$rp_real+32+16]
2093 st $t2, [$rp_real+32+20]
2094 st $acc3,[$rp_real+32+24]
2095 st $t3, [$rp_real+32+28]
2096
2097 srlx $a0,32,$t0
2098 srlx $a1,32,$t1
2099 st $a0,[$rp_real+64] ! res_z
2100 srlx $a2,32,$t2
2101 st $t0,[$rp_real+64+4]
2102 srlx $a3,32,$t3
2103 st $a1,[$rp_real+64+8]
2104 st $t1,[$rp_real+64+12]
2105 st $a2,[$rp_real+64+16]
2106 st $t2,[$rp_real+64+20]
2107 st $a3,[$rp_real+64+24]
2108 st $t3,[$rp_real+64+28]
2109
2110 ret
2111 restore
2112.type ecp_nistz256_point_double_vis3,#function
2113.size ecp_nistz256_point_double_vis3,.-ecp_nistz256_point_double_vis3
2114___
2115}
2116########################################################################
2117# void ecp_nistz256_point_add(P256_POINT *out,const P256_POINT *in1,
2118# const P256_POINT *in2);
2119{
2120my ($res_x,$res_y,$res_z,
2121 $in1_x,$in1_y,$in1_z,
2122 $in2_x,$in2_y,$in2_z,
2123 $H,$Hsqr,$R,$Rsqr,$Hcub,
2124 $U1,$U2,$S1,$S2)=map(32*$_,(0..17));
2125my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
2126
2127# above map() describes stack layout with 18 temporary
2128# 256-bit vectors on top. Then we reserve some space for
2129# !in1infty, !in2infty and result of check for zero.
2130
2131$code.=<<___;
2132.globl ecp_nistz256_point_add_vis3
2133.align 32
2134ecp_nistz256_point_add_vis3:
2135 save %sp,-STACK64_FRAME-32*18-32,%sp
2136
2137 mov $rp,$rp_real
2138 mov -1,$minus1
2139 mov -2,$poly3
2140 sllx $minus1,32,$poly1 ! 0xFFFFFFFF00000000
2141 srl $poly3,0,$poly3 ! 0x00000000FFFFFFFE
2142
2143 ! convert input to uint64_t[4]
2144 ld [$bp],$a0 ! in2_x
2145 ld [$bp+4],$t0
2146 ld [$bp+8],$a1
2147 ld [$bp+12],$t1
2148 ld [$bp+16],$a2
2149 ld [$bp+20],$t2
2150 ld [$bp+24],$a3
2151 ld [$bp+28],$t3
2152 sllx $t0,32,$t0
2153 sllx $t1,32,$t1
2154 ld [$bp+32],$acc0 ! in2_y
2155 or $a0,$t0,$a0
2156 ld [$bp+32+4],$t0
2157 sllx $t2,32,$t2
2158 ld [$bp+32+8],$acc1
2159 or $a1,$t1,$a1
2160 ld [$bp+32+12],$t1
2161 sllx $t3,32,$t3
2162 ld [$bp+32+16],$acc2
2163 or $a2,$t2,$a2
2164 ld [$bp+32+20],$t2
2165 or $a3,$t3,$a3
2166 ld [$bp+32+24],$acc3
2167 sllx $t0,32,$t0
2168 ld [$bp+32+28],$t3
2169 sllx $t1,32,$t1
2170 stx $a0,[%sp+LOCALS64+$in2_x]
2171 sllx $t2,32,$t2
2172 stx $a1,[%sp+LOCALS64+$in2_x+8]
2173 sllx $t3,32,$t3
2174 stx $a2,[%sp+LOCALS64+$in2_x+16]
2175 or $acc0,$t0,$acc0
2176 stx $a3,[%sp+LOCALS64+$in2_x+24]
2177 or $acc1,$t1,$acc1
2178 stx $acc0,[%sp+LOCALS64+$in2_y]
2179 or $acc2,$t2,$acc2
2180 stx $acc1,[%sp+LOCALS64+$in2_y+8]
2181 or $acc3,$t3,$acc3
2182 stx $acc2,[%sp+LOCALS64+$in2_y+16]
2183 stx $acc3,[%sp+LOCALS64+$in2_y+24]
2184
2185 ld [$bp+64],$acc0 ! in2_z
2186 ld [$bp+64+4],$t0
2187 ld [$bp+64+8],$acc1
2188 ld [$bp+64+12],$t1
2189 ld [$bp+64+16],$acc2
2190 ld [$bp+64+20],$t2
2191 ld [$bp+64+24],$acc3
2192 ld [$bp+64+28],$t3
2193 sllx $t0,32,$t0
2194 sllx $t1,32,$t1
2195 ld [$ap],$a0 ! in1_x
2196 or $acc0,$t0,$acc0
2197 ld [$ap+4],$t0
2198 sllx $t2,32,$t2
2199 ld [$ap+8],$a1
2200 or $acc1,$t1,$acc1
2201 ld [$ap+12],$t1
2202 sllx $t3,32,$t3
2203 ld [$ap+16],$a2
2204 or $acc2,$t2,$acc2
2205 ld [$ap+20],$t2
2206 or $acc3,$t3,$acc3
2207 ld [$ap+24],$a3
2208 sllx $t0,32,$t0
2209 ld [$ap+28],$t3
2210 sllx $t1,32,$t1
2211 stx $acc0,[%sp+LOCALS64+$in2_z]
2212 sllx $t2,32,$t2
2213 stx $acc1,[%sp+LOCALS64+$in2_z+8]
2214 sllx $t3,32,$t3
2215 stx $acc2,[%sp+LOCALS64+$in2_z+16]
2216 stx $acc3,[%sp+LOCALS64+$in2_z+24]
2217
2218 or $acc1,$acc0,$acc0
2219 or $acc3,$acc2,$acc2
2220 or $acc2,$acc0,$acc0
2221 movrnz $acc0,-1,$acc0 ! !in2infty
2222 stx $acc0,[%fp+STACK_BIAS-8]
2223
2224 or $a0,$t0,$a0
2225 ld [$ap+32],$acc0 ! in1_y
2226 or $a1,$t1,$a1
2227 ld [$ap+32+4],$t0
2228 or $a2,$t2,$a2
2229 ld [$ap+32+8],$acc1
2230 or $a3,$t3,$a3
2231 ld [$ap+32+12],$t1
2232 ld [$ap+32+16],$acc2
2233 ld [$ap+32+20],$t2
2234 ld [$ap+32+24],$acc3
2235 sllx $t0,32,$t0
2236 ld [$ap+32+28],$t3
2237 sllx $t1,32,$t1
2238 stx $a0,[%sp+LOCALS64+$in1_x]
2239 sllx $t2,32,$t2
2240 stx $a1,[%sp+LOCALS64+$in1_x+8]
2241 sllx $t3,32,$t3
2242 stx $a2,[%sp+LOCALS64+$in1_x+16]
2243 or $acc0,$t0,$acc0
2244 stx $a3,[%sp+LOCALS64+$in1_x+24]
2245 or $acc1,$t1,$acc1
2246 stx $acc0,[%sp+LOCALS64+$in1_y]
2247 or $acc2,$t2,$acc2
2248 stx $acc1,[%sp+LOCALS64+$in1_y+8]
2249 or $acc3,$t3,$acc3
2250 stx $acc2,[%sp+LOCALS64+$in1_y+16]
2251 stx $acc3,[%sp+LOCALS64+$in1_y+24]
2252
2253 ldx [%sp+LOCALS64+$in2_z],$a0 ! forward load
2254 ldx [%sp+LOCALS64+$in2_z+8],$a1
2255 ldx [%sp+LOCALS64+$in2_z+16],$a2
2256 ldx [%sp+LOCALS64+$in2_z+24],$a3
2257
2258 ld [$ap+64],$acc0 ! in1_z
2259 ld [$ap+64+4],$t0
2260 ld [$ap+64+8],$acc1
2261 ld [$ap+64+12],$t1
2262 ld [$ap+64+16],$acc2
2263 ld [$ap+64+20],$t2
2264 ld [$ap+64+24],$acc3
2265 ld [$ap+64+28],$t3
2266 sllx $t0,32,$t0
2267 sllx $t1,32,$t1
2268 or $acc0,$t0,$acc0
2269 sllx $t2,32,$t2
2270 or $acc1,$t1,$acc1
2271 sllx $t3,32,$t3
2272 stx $acc0,[%sp+LOCALS64+$in1_z]
2273 or $acc2,$t2,$acc2
2274 stx $acc1,[%sp+LOCALS64+$in1_z+8]
2275 or $acc3,$t3,$acc3
2276 stx $acc2,[%sp+LOCALS64+$in1_z+16]
2277 stx $acc3,[%sp+LOCALS64+$in1_z+24]
2278
2279 or $acc1,$acc0,$acc0
2280 or $acc3,$acc2,$acc2
2281 or $acc2,$acc0,$acc0
2282 movrnz $acc0,-1,$acc0 ! !in1infty
2283 stx $acc0,[%fp+STACK_BIAS-16]
2284
2285 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Z2sqr, in2_z);
2286 add %sp,LOCALS64+$Z2sqr,$rp
2287
2288 ldx [%sp+LOCALS64+$in1_z],$a0
2289 ldx [%sp+LOCALS64+$in1_z+8],$a1
2290 ldx [%sp+LOCALS64+$in1_z+16],$a2
2291 ldx [%sp+LOCALS64+$in1_z+24],$a3
2292 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Z1sqr, in1_z);
2293 add %sp,LOCALS64+$Z1sqr,$rp
2294
2295 ldx [%sp+LOCALS64+$Z2sqr],$bi
2296 ldx [%sp+LOCALS64+$in2_z],$a0
2297 ldx [%sp+LOCALS64+$in2_z+8],$a1
2298 ldx [%sp+LOCALS64+$in2_z+16],$a2
2299 ldx [%sp+LOCALS64+$in2_z+24],$a3
2300 add %sp,LOCALS64+$Z2sqr,$bp
2301 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S1, Z2sqr, in2_z);
2302 add %sp,LOCALS64+$S1,$rp
2303
2304 ldx [%sp+LOCALS64+$Z1sqr],$bi
2305 ldx [%sp+LOCALS64+$in1_z],$a0
2306 ldx [%sp+LOCALS64+$in1_z+8],$a1
2307 ldx [%sp+LOCALS64+$in1_z+16],$a2
2308 ldx [%sp+LOCALS64+$in1_z+24],$a3
2309 add %sp,LOCALS64+$Z1sqr,$bp
2310 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, Z1sqr, in1_z);
2311 add %sp,LOCALS64+$S2,$rp
2312
2313 ldx [%sp+LOCALS64+$S1],$bi
2314 ldx [%sp+LOCALS64+$in1_y],$a0
2315 ldx [%sp+LOCALS64+$in1_y+8],$a1
2316 ldx [%sp+LOCALS64+$in1_y+16],$a2
2317 ldx [%sp+LOCALS64+$in1_y+24],$a3
2318 add %sp,LOCALS64+$S1,$bp
2319 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S1, S1, in1_y);
2320 add %sp,LOCALS64+$S1,$rp
2321
2322 ldx [%sp+LOCALS64+$S2],$bi
2323 ldx [%sp+LOCALS64+$in2_y],$a0
2324 ldx [%sp+LOCALS64+$in2_y+8],$a1
2325 ldx [%sp+LOCALS64+$in2_y+16],$a2
2326 ldx [%sp+LOCALS64+$in2_y+24],$a3
2327 add %sp,LOCALS64+$S2,$bp
2328 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, S2, in2_y);
2329 add %sp,LOCALS64+$S2,$rp
2330
2331 ldx [%sp+LOCALS64+$Z2sqr],$bi ! forward load
2332 ldx [%sp+LOCALS64+$in1_x],$a0
2333 ldx [%sp+LOCALS64+$in1_x+8],$a1
2334 ldx [%sp+LOCALS64+$in1_x+16],$a2
2335 ldx [%sp+LOCALS64+$in1_x+24],$a3
2336
2337 add %sp,LOCALS64+$S1,$bp
2338 call __ecp_nistz256_sub_from_vis3 ! p256_sub(R, S2, S1);
2339 add %sp,LOCALS64+$R,$rp
2340
2341 or $acc1,$acc0,$acc0 ! see if result is zero
2342 or $acc3,$acc2,$acc2
2343 or $acc2,$acc0,$acc0
2344 stx $acc0,[%fp+STACK_BIAS-24]
2345
2346 add %sp,LOCALS64+$Z2sqr,$bp
2347 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(U1, in1_x, Z2sqr);
2348 add %sp,LOCALS64+$U1,$rp
2349
2350 ldx [%sp+LOCALS64+$Z1sqr],$bi
2351 ldx [%sp+LOCALS64+$in2_x],$a0
2352 ldx [%sp+LOCALS64+$in2_x+8],$a1
2353 ldx [%sp+LOCALS64+$in2_x+16],$a2
2354 ldx [%sp+LOCALS64+$in2_x+24],$a3
2355 add %sp,LOCALS64+$Z1sqr,$bp
2356 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(U2, in2_x, Z1sqr);
2357 add %sp,LOCALS64+$U2,$rp
2358
2359 ldx [%sp+LOCALS64+$R],$a0 ! forward load
2360 ldx [%sp+LOCALS64+$R+8],$a1
2361 ldx [%sp+LOCALS64+$R+16],$a2
2362 ldx [%sp+LOCALS64+$R+24],$a3
2363
2364 add %sp,LOCALS64+$U1,$bp
2365 call __ecp_nistz256_sub_from_vis3 ! p256_sub(H, U2, U1);
2366 add %sp,LOCALS64+$H,$rp
2367
2368 or $acc1,$acc0,$acc0 ! see if result is zero
2369 or $acc3,$acc2,$acc2
2370 orcc $acc2,$acc0,$acc0
2371
2372 bne,pt %xcc,.Ladd_proceed_vis3 ! is_equal(U1,U2)?
2373 nop
2374
2375 ldx [%fp+STACK_BIAS-8],$t0
2376 ldx [%fp+STACK_BIAS-16],$t1
2377 ldx [%fp+STACK_BIAS-24],$t2
2378 andcc $t0,$t1,%g0
2379 be,pt %xcc,.Ladd_proceed_vis3 ! (in1infty || in2infty)?
2380 nop
2381 andcc $t2,$t2,%g0
2382 be,a,pt %xcc,.Ldouble_shortcut_vis3 ! is_equal(S1,S2)?
2383 add %sp,32*(12-10)+32,%sp ! difference in frame sizes
2384
2385 st %g0,[$rp_real]
2386 st %g0,[$rp_real+4]
2387 st %g0,[$rp_real+8]
2388 st %g0,[$rp_real+12]
2389 st %g0,[$rp_real+16]
2390 st %g0,[$rp_real+20]
2391 st %g0,[$rp_real+24]
2392 st %g0,[$rp_real+28]
2393 st %g0,[$rp_real+32]
2394 st %g0,[$rp_real+32+4]
2395 st %g0,[$rp_real+32+8]
2396 st %g0,[$rp_real+32+12]
2397 st %g0,[$rp_real+32+16]
2398 st %g0,[$rp_real+32+20]
2399 st %g0,[$rp_real+32+24]
2400 st %g0,[$rp_real+32+28]
2401 st %g0,[$rp_real+64]
2402 st %g0,[$rp_real+64+4]
2403 st %g0,[$rp_real+64+8]
2404 st %g0,[$rp_real+64+12]
2405 st %g0,[$rp_real+64+16]
2406 st %g0,[$rp_real+64+20]
2407 st %g0,[$rp_real+64+24]
2408 st %g0,[$rp_real+64+28]
2409 b .Ladd_done_vis3
2410 nop
2411
2412.align 16
2413.Ladd_proceed_vis3:
2414 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Rsqr, R);
2415 add %sp,LOCALS64+$Rsqr,$rp
2416
2417 ldx [%sp+LOCALS64+$H],$bi
2418 ldx [%sp+LOCALS64+$in1_z],$a0
2419 ldx [%sp+LOCALS64+$in1_z+8],$a1
2420 ldx [%sp+LOCALS64+$in1_z+16],$a2
2421 ldx [%sp+LOCALS64+$in1_z+24],$a3
2422 add %sp,LOCALS64+$H,$bp
2423 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(res_z, H, in1_z);
2424 add %sp,LOCALS64+$res_z,$rp
2425
2426 ldx [%sp+LOCALS64+$H],$a0
2427 ldx [%sp+LOCALS64+$H+8],$a1
2428 ldx [%sp+LOCALS64+$H+16],$a2
2429 ldx [%sp+LOCALS64+$H+24],$a3
2430 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Hsqr, H);
2431 add %sp,LOCALS64+$Hsqr,$rp
2432
2433 ldx [%sp+LOCALS64+$res_z],$bi
2434 ldx [%sp+LOCALS64+$in2_z],$a0
2435 ldx [%sp+LOCALS64+$in2_z+8],$a1
2436 ldx [%sp+LOCALS64+$in2_z+16],$a2
2437 ldx [%sp+LOCALS64+$in2_z+24],$a3
2438 add %sp,LOCALS64+$res_z,$bp
2439 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(res_z, res_z, in2_z);
2440 add %sp,LOCALS64+$res_z,$rp
2441
2442 ldx [%sp+LOCALS64+$H],$bi
2443 ldx [%sp+LOCALS64+$Hsqr],$a0
2444 ldx [%sp+LOCALS64+$Hsqr+8],$a1
2445 ldx [%sp+LOCALS64+$Hsqr+16],$a2
2446 ldx [%sp+LOCALS64+$Hsqr+24],$a3
2447 add %sp,LOCALS64+$H,$bp
2448 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(Hcub, Hsqr, H);
2449 add %sp,LOCALS64+$Hcub,$rp
2450
2451 ldx [%sp+LOCALS64+$U1],$bi
2452 ldx [%sp+LOCALS64+$Hsqr],$a0
2453 ldx [%sp+LOCALS64+$Hsqr+8],$a1
2454 ldx [%sp+LOCALS64+$Hsqr+16],$a2
2455 ldx [%sp+LOCALS64+$Hsqr+24],$a3
2456 add %sp,LOCALS64+$U1,$bp
2457 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(U2, U1, Hsqr);
2458 add %sp,LOCALS64+$U2,$rp
2459
2460 call __ecp_nistz256_mul_by_2_vis3 ! p256_mul_by_2(Hsqr, U2);
2461 add %sp,LOCALS64+$Hsqr,$rp
2462
2463 add %sp,LOCALS64+$Rsqr,$bp
2464 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(res_x, Rsqr, Hsqr);
2465 add %sp,LOCALS64+$res_x,$rp
2466
2467 add %sp,LOCALS64+$Hcub,$bp
2468 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_x, res_x, Hcub);
2469 add %sp,LOCALS64+$res_x,$rp
2470
2471 ldx [%sp+LOCALS64+$S1],$bi ! forward load
2472 ldx [%sp+LOCALS64+$Hcub],$a0
2473 ldx [%sp+LOCALS64+$Hcub+8],$a1
2474 ldx [%sp+LOCALS64+$Hcub+16],$a2
2475 ldx [%sp+LOCALS64+$Hcub+24],$a3
2476
2477 add %sp,LOCALS64+$U2,$bp
2478 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(res_y, U2, res_x);
2479 add %sp,LOCALS64+$res_y,$rp
2480
2481 add %sp,LOCALS64+$S1,$bp
2482 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, S1, Hcub);
2483 add %sp,LOCALS64+$S2,$rp
2484
2485 ldx [%sp+LOCALS64+$R],$bi
2486 ldx [%sp+LOCALS64+$res_y],$a0
2487 ldx [%sp+LOCALS64+$res_y+8],$a1
2488 ldx [%sp+LOCALS64+$res_y+16],$a2
2489 ldx [%sp+LOCALS64+$res_y+24],$a3
2490 add %sp,LOCALS64+$R,$bp
2491 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(res_y, res_y, R);
2492 add %sp,LOCALS64+$res_y,$rp
2493
2494 add %sp,LOCALS64+$S2,$bp
2495 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_y, res_y, S2);
2496 add %sp,LOCALS64+$res_y,$rp
2497
2498 ldx [%fp+STACK_BIAS-16],$t1 ! !in1infty
2499 ldx [%fp+STACK_BIAS-8],$t2 ! !in2infty
2500___
2501for($i=0;$i<96;$i+=16) { # conditional moves
2502$code.=<<___;
2503 ldx [%sp+LOCALS64+$res_x+$i],$acc0 ! res
2504 ldx [%sp+LOCALS64+$res_x+$i+8],$acc1
2505 ldx [%sp+LOCALS64+$in2_x+$i],$acc2 ! in2
2506 ldx [%sp+LOCALS64+$in2_x+$i+8],$acc3
2507 ldx [%sp+LOCALS64+$in1_x+$i],$acc4 ! in1
2508 ldx [%sp+LOCALS64+$in1_x+$i+8],$acc5
2509 movrz $t1,$acc2,$acc0
2510 movrz $t1,$acc3,$acc1
2511 movrz $t2,$acc4,$acc0
2512 movrz $t2,$acc5,$acc1
2513 srlx $acc0,32,$acc2
2514 srlx $acc1,32,$acc3
2515 st $acc0,[$rp_real+$i]
2516 st $acc2,[$rp_real+$i+4]
2517 st $acc1,[$rp_real+$i+8]
2518 st $acc3,[$rp_real+$i+12]
2519___
2520}
2521$code.=<<___;
2522.Ladd_done_vis3:
2523 ret
2524 restore
2525.type ecp_nistz256_point_add_vis3,#function
2526.size ecp_nistz256_point_add_vis3,.-ecp_nistz256_point_add_vis3
2527___
2528}
2529########################################################################
2530# void ecp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1,
2531# const P256_POINT_AFFINE *in2);
2532{
2533my ($res_x,$res_y,$res_z,
2534 $in1_x,$in1_y,$in1_z,
2535 $in2_x,$in2_y,
2536 $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14));
2537my $Z1sqr = $S2;
2538# above map() describes stack layout with 15 temporary
2539# 256-bit vectors on top. Then we reserve some space for
2540# !in1infty and !in2infty.
2541
2542$code.=<<___;
2543.align 32
2544ecp_nistz256_point_add_affine_vis3:
2545 save %sp,-STACK64_FRAME-32*15-32,%sp
2546
2547 mov $rp,$rp_real
2548 mov -1,$minus1
2549 mov -2,$poly3
2550 sllx $minus1,32,$poly1 ! 0xFFFFFFFF00000000
2551 srl $poly3,0,$poly3 ! 0x00000000FFFFFFFE
2552
2553 ! convert input to uint64_t[4]
2554 ld [$bp],$a0 ! in2_x
2555 ld [$bp+4],$t0
2556 ld [$bp+8],$a1
2557 ld [$bp+12],$t1
2558 ld [$bp+16],$a2
2559 ld [$bp+20],$t2
2560 ld [$bp+24],$a3
2561 ld [$bp+28],$t3
2562 sllx $t0,32,$t0
2563 sllx $t1,32,$t1
2564 ld [$bp+32],$acc0 ! in2_y
2565 or $a0,$t0,$a0
2566 ld [$bp+32+4],$t0
2567 sllx $t2,32,$t2
2568 ld [$bp+32+8],$acc1
2569 or $a1,$t1,$a1
2570 ld [$bp+32+12],$t1
2571 sllx $t3,32,$t3
2572 ld [$bp+32+16],$acc2
2573 or $a2,$t2,$a2
2574 ld [$bp+32+20],$t2
2575 or $a3,$t3,$a3
2576 ld [$bp+32+24],$acc3
2577 sllx $t0,32,$t0
2578 ld [$bp+32+28],$t3
2579 sllx $t1,32,$t1
2580 stx $a0,[%sp+LOCALS64+$in2_x]
2581 sllx $t2,32,$t2
2582 stx $a1,[%sp+LOCALS64+$in2_x+8]
2583 sllx $t3,32,$t3
2584 stx $a2,[%sp+LOCALS64+$in2_x+16]
2585 or $acc0,$t0,$acc0
2586 stx $a3,[%sp+LOCALS64+$in2_x+24]
2587 or $acc1,$t1,$acc1
2588 stx $acc0,[%sp+LOCALS64+$in2_y]
2589 or $acc2,$t2,$acc2
2590 stx $acc1,[%sp+LOCALS64+$in2_y+8]
2591 or $acc3,$t3,$acc3
2592 stx $acc2,[%sp+LOCALS64+$in2_y+16]
2593 stx $acc3,[%sp+LOCALS64+$in2_y+24]
2594
2595 or $a1,$a0,$a0
2596 or $a3,$a2,$a2
2597 or $acc1,$acc0,$acc0
2598 or $acc3,$acc2,$acc2
2599 or $a2,$a0,$a0
2600 or $acc2,$acc0,$acc0
2601 or $acc0,$a0,$a0
2602 movrnz $a0,-1,$a0 ! !in2infty
2603 stx $a0,[%fp+STACK_BIAS-8]
2604
2605 ld [$ap],$a0 ! in1_x
2606 ld [$ap+4],$t0
2607 ld [$ap+8],$a1
2608 ld [$ap+12],$t1
2609 ld [$ap+16],$a2
2610 ld [$ap+20],$t2
2611 ld [$ap+24],$a3
2612 ld [$ap+28],$t3
2613 sllx $t0,32,$t0
2614 sllx $t1,32,$t1
2615 ld [$ap+32],$acc0 ! in1_y
2616 or $a0,$t0,$a0
2617 ld [$ap+32+4],$t0
2618 sllx $t2,32,$t2
2619 ld [$ap+32+8],$acc1
2620 or $a1,$t1,$a1
2621 ld [$ap+32+12],$t1
2622 sllx $t3,32,$t3
2623 ld [$ap+32+16],$acc2
2624 or $a2,$t2,$a2
2625 ld [$ap+32+20],$t2
2626 or $a3,$t3,$a3
2627 ld [$ap+32+24],$acc3
2628 sllx $t0,32,$t0
2629 ld [$ap+32+28],$t3
2630 sllx $t1,32,$t1
2631 stx $a0,[%sp+LOCALS64+$in1_x]
2632 sllx $t2,32,$t2
2633 stx $a1,[%sp+LOCALS64+$in1_x+8]
2634 sllx $t3,32,$t3
2635 stx $a2,[%sp+LOCALS64+$in1_x+16]
2636 or $acc0,$t0,$acc0
2637 stx $a3,[%sp+LOCALS64+$in1_x+24]
2638 or $acc1,$t1,$acc1
2639 stx $acc0,[%sp+LOCALS64+$in1_y]
2640 or $acc2,$t2,$acc2
2641 stx $acc1,[%sp+LOCALS64+$in1_y+8]
2642 or $acc3,$t3,$acc3
2643 stx $acc2,[%sp+LOCALS64+$in1_y+16]
2644 stx $acc3,[%sp+LOCALS64+$in1_y+24]
2645
2646 ld [$ap+64],$a0 ! in1_z
2647 ld [$ap+64+4],$t0
2648 ld [$ap+64+8],$a1
2649 ld [$ap+64+12],$t1
2650 ld [$ap+64+16],$a2
2651 ld [$ap+64+20],$t2
2652 ld [$ap+64+24],$a3
2653 ld [$ap+64+28],$t3
2654 sllx $t0,32,$t0
2655 sllx $t1,32,$t1
2656 or $a0,$t0,$a0
2657 sllx $t2,32,$t2
2658 or $a1,$t1,$a1
2659 sllx $t3,32,$t3
2660 stx $a0,[%sp+LOCALS64+$in1_z]
2661 or $a2,$t2,$a2
2662 stx $a1,[%sp+LOCALS64+$in1_z+8]
2663 or $a3,$t3,$a3
2664 stx $a2,[%sp+LOCALS64+$in1_z+16]
2665 stx $a3,[%sp+LOCALS64+$in1_z+24]
2666
2667 or $a1,$a0,$t0
2668 or $a3,$a2,$t2
2669 or $t2,$t0,$t0
2670 movrnz $t0,-1,$t0 ! !in1infty
2671 stx $t0,[%fp+STACK_BIAS-16]
2672
2673 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Z1sqr, in1_z);
2674 add %sp,LOCALS64+$Z1sqr,$rp
2675
2676 ldx [%sp+LOCALS64+$in2_x],$bi
2677 mov $acc0,$a0
2678 mov $acc1,$a1
2679 mov $acc2,$a2
2680 mov $acc3,$a3
2681 add %sp,LOCALS64+$in2_x,$bp
2682 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(U2, Z1sqr, in2_x);
2683 add %sp,LOCALS64+$U2,$rp
2684
2685 ldx [%sp+LOCALS64+$Z1sqr],$bi ! forward load
2686 ldx [%sp+LOCALS64+$in1_z],$a0
2687 ldx [%sp+LOCALS64+$in1_z+8],$a1
2688 ldx [%sp+LOCALS64+$in1_z+16],$a2
2689 ldx [%sp+LOCALS64+$in1_z+24],$a3
2690
2691 add %sp,LOCALS64+$in1_x,$bp
2692 call __ecp_nistz256_sub_from_vis3 ! p256_sub(H, U2, in1_x);
2693 add %sp,LOCALS64+$H,$rp
2694
2695 add %sp,LOCALS64+$Z1sqr,$bp
2696 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, Z1sqr, in1_z);
2697 add %sp,LOCALS64+$S2,$rp
2698
2699 ldx [%sp+LOCALS64+$H],$bi
2700 ldx [%sp+LOCALS64+$in1_z],$a0
2701 ldx [%sp+LOCALS64+$in1_z+8],$a1
2702 ldx [%sp+LOCALS64+$in1_z+16],$a2
2703 ldx [%sp+LOCALS64+$in1_z+24],$a3
2704 add %sp,LOCALS64+$H,$bp
2705 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(res_z, H, in1_z);
2706 add %sp,LOCALS64+$res_z,$rp
2707
2708 ldx [%sp+LOCALS64+$S2],$bi
2709 ldx [%sp+LOCALS64+$in2_y],$a0
2710 ldx [%sp+LOCALS64+$in2_y+8],$a1
2711 ldx [%sp+LOCALS64+$in2_y+16],$a2
2712 ldx [%sp+LOCALS64+$in2_y+24],$a3
2713 add %sp,LOCALS64+$S2,$bp
2714 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, S2, in2_y);
2715 add %sp,LOCALS64+$S2,$rp
2716
2717 ldx [%sp+LOCALS64+$H],$a0 ! forward load
2718 ldx [%sp+LOCALS64+$H+8],$a1
2719 ldx [%sp+LOCALS64+$H+16],$a2
2720 ldx [%sp+LOCALS64+$H+24],$a3
2721
2722 add %sp,LOCALS64+$in1_y,$bp
2723 call __ecp_nistz256_sub_from_vis3 ! p256_sub(R, S2, in1_y);
2724 add %sp,LOCALS64+$R,$rp
2725
2726 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Hsqr, H);
2727 add %sp,LOCALS64+$Hsqr,$rp
2728
2729 ldx [%sp+LOCALS64+$R],$a0
2730 ldx [%sp+LOCALS64+$R+8],$a1
2731 ldx [%sp+LOCALS64+$R+16],$a2
2732 ldx [%sp+LOCALS64+$R+24],$a3
2733 call __ecp_nistz256_sqr_mont_vis3 ! p256_sqr_mont(Rsqr, R);
2734 add %sp,LOCALS64+$Rsqr,$rp
2735
2736 ldx [%sp+LOCALS64+$H],$bi
2737 ldx [%sp+LOCALS64+$Hsqr],$a0
2738 ldx [%sp+LOCALS64+$Hsqr+8],$a1
2739 ldx [%sp+LOCALS64+$Hsqr+16],$a2
2740 ldx [%sp+LOCALS64+$Hsqr+24],$a3
2741 add %sp,LOCALS64+$H,$bp
2742 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(Hcub, Hsqr, H);
2743 add %sp,LOCALS64+$Hcub,$rp
2744
2745 ldx [%sp+LOCALS64+$Hsqr],$bi
2746 ldx [%sp+LOCALS64+$in1_x],$a0
2747 ldx [%sp+LOCALS64+$in1_x+8],$a1
2748 ldx [%sp+LOCALS64+$in1_x+16],$a2
2749 ldx [%sp+LOCALS64+$in1_x+24],$a3
2750 add %sp,LOCALS64+$Hsqr,$bp
2751 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(U2, in1_x, Hsqr);
2752 add %sp,LOCALS64+$U2,$rp
2753
2754 call __ecp_nistz256_mul_by_2_vis3 ! p256_mul_by_2(Hsqr, U2);
2755 add %sp,LOCALS64+$Hsqr,$rp
2756
2757 add %sp,LOCALS64+$Rsqr,$bp
2758 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(res_x, Rsqr, Hsqr);
2759 add %sp,LOCALS64+$res_x,$rp
2760
2761 add %sp,LOCALS64+$Hcub,$bp
2762 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_x, res_x, Hcub);
2763 add %sp,LOCALS64+$res_x,$rp
2764
2765 ldx [%sp+LOCALS64+$Hcub],$bi ! forward load
2766 ldx [%sp+LOCALS64+$in1_y],$a0
2767 ldx [%sp+LOCALS64+$in1_y+8],$a1
2768 ldx [%sp+LOCALS64+$in1_y+16],$a2
2769 ldx [%sp+LOCALS64+$in1_y+24],$a3
2770
2771 add %sp,LOCALS64+$U2,$bp
2772 call __ecp_nistz256_sub_morf_vis3 ! p256_sub(res_y, U2, res_x);
2773 add %sp,LOCALS64+$res_y,$rp
2774
2775 add %sp,LOCALS64+$Hcub,$bp
2776 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(S2, in1_y, Hcub);
2777 add %sp,LOCALS64+$S2,$rp
2778
2779 ldx [%sp+LOCALS64+$R],$bi
2780 ldx [%sp+LOCALS64+$res_y],$a0
2781 ldx [%sp+LOCALS64+$res_y+8],$a1
2782 ldx [%sp+LOCALS64+$res_y+16],$a2
2783 ldx [%sp+LOCALS64+$res_y+24],$a3
2784 add %sp,LOCALS64+$R,$bp
2785 call __ecp_nistz256_mul_mont_vis3 ! p256_mul_mont(res_y, res_y, R);
2786 add %sp,LOCALS64+$res_y,$rp
2787
2788 add %sp,LOCALS64+$S2,$bp
2789 call __ecp_nistz256_sub_from_vis3 ! p256_sub(res_y, res_y, S2);
2790 add %sp,LOCALS64+$res_y,$rp
2791
2792 ldx [%fp+STACK_BIAS-16],$t1 ! !in1infty
2793 ldx [%fp+STACK_BIAS-8],$t2 ! !in2infty
27941: call .+8
2795 add %o7,.Lone_mont_vis3-1b,$bp
2796___
2797for($i=0;$i<64;$i+=16) { # conditional moves
2798$code.=<<___;
2799 ldx [%sp+LOCALS64+$res_x+$i],$acc0 ! res
2800 ldx [%sp+LOCALS64+$res_x+$i+8],$acc1
2801 ldx [%sp+LOCALS64+$in2_x+$i],$acc2 ! in2
2802 ldx [%sp+LOCALS64+$in2_x+$i+8],$acc3
2803 ldx [%sp+LOCALS64+$in1_x+$i],$acc4 ! in1
2804 ldx [%sp+LOCALS64+$in1_x+$i+8],$acc5
2805 movrz $t1,$acc2,$acc0
2806 movrz $t1,$acc3,$acc1
2807 movrz $t2,$acc4,$acc0
2808 movrz $t2,$acc5,$acc1
2809 srlx $acc0,32,$acc2
2810 srlx $acc1,32,$acc3
2811 st $acc0,[$rp_real+$i]
2812 st $acc2,[$rp_real+$i+4]
2813 st $acc1,[$rp_real+$i+8]
2814 st $acc3,[$rp_real+$i+12]
2815___
2816}
2817for(;$i<96;$i+=16) {
2818$code.=<<___;
2819 ldx [%sp+LOCALS64+$res_x+$i],$acc0 ! res
2820 ldx [%sp+LOCALS64+$res_x+$i+8],$acc1
2821 ldx [$bp+$i-64],$acc2 ! "in2"
2822 ldx [$bp+$i-64+8],$acc3
2823 ldx [%sp+LOCALS64+$in1_x+$i],$acc4 ! in1
2824 ldx [%sp+LOCALS64+$in1_x+$i+8],$acc5
2825 movrz $t1,$acc2,$acc0
2826 movrz $t1,$acc3,$acc1
2827 movrz $t2,$acc4,$acc0
2828 movrz $t2,$acc5,$acc1
2829 srlx $acc0,32,$acc2
2830 srlx $acc1,32,$acc3
2831 st $acc0,[$rp_real+$i]
2832 st $acc2,[$rp_real+$i+4]
2833 st $acc1,[$rp_real+$i+8]
2834 st $acc3,[$rp_real+$i+12]
2835___
2836}
2837$code.=<<___;
2838 ret
2839 restore
2840.type ecp_nistz256_point_add_affine_vis3,#function
2841.size ecp_nistz256_point_add_affine_vis3,.-ecp_nistz256_point_add_affine_vis3
2842.align 64
2843.Lone_mont_vis3:
2844.long 0x00000000,0x00000001, 0xffffffff,0x00000000
2845.long 0xffffffff,0xffffffff, 0x00000000,0xfffffffe
2846.align 64
2847#endif
2848___
2849} }}}
2850
2851# Purpose of these subroutines is to explicitly encode VIS instructions,
2852# so that one can compile the module without having to specify VIS
2853# extensions on compiler command line, e.g. -xarch=v9 vs. -xarch=v9a.
2854# Idea is to reserve for option to produce "universal" binary and let
2855# programmer detect if current CPU is VIS capable at run-time.
2856sub unvis3 {
2857my ($mnemonic,$rs1,$rs2,$rd)=@_;
2858my %bias = ( "g" => 0, "o" => 8, "l" => 16, "i" => 24 );
2859my ($ref,$opf);
2860my %visopf = ( "addxc" => 0x011,
2861 "addxccc" => 0x013,
2862 "umulxhi" => 0x016 );
2863
2864 $ref = "$mnemonic\t$rs1,$rs2,$rd";
2865
2866 if ($opf=$visopf{$mnemonic}) {
2867 foreach ($rs1,$rs2,$rd) {
2868 return $ref if (!/%([goli])([0-9])/);
2869 $_=$bias{$1}+$2;
2870 }
2871
2872 return sprintf ".word\t0x%08x !%s",
2873 0x81b00000|$rd<<25|$rs1<<14|$opf<<5|$rs2,
2874 $ref;
2875 } else {
2876 return $ref;
2877 }
2878}
2879
2880foreach (split("\n",$code)) {
2881 s/\`([^\`]*)\`/eval $1/ge;
2882
2883 s/\b(umulxhi|addxc[c]{0,2})\s+(%[goli][0-7]),\s*(%[goli][0-7]),\s*(%[goli][0-7])/
2884 &unvis3($1,$2,$3,$4)
2885 /ge;
2886
2887 print $_,"\n";
2888}
2889
2890close STDOUT;
diff --git a/src/lib/libcrypto/ec/asm/ecp_nistz256-x86.pl b/src/lib/libcrypto/ec/asm/ecp_nistz256-x86.pl
deleted file mode 100644
index 085d637e5d..0000000000
--- a/src/lib/libcrypto/ec/asm/ecp_nistz256-x86.pl
+++ /dev/null
@@ -1,1740 +0,0 @@
1#! /usr/bin/env perl
2# $OpenBSD: ecp_nistz256-x86.pl,v 1.1 2016/11/04 17:33:20 miod Exp $
3#
4# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
5#
6# Licensed under the OpenSSL license (the "License"). You may not use
7# this file except in compliance with the License. You can obtain a copy
8# in the file LICENSE in the source distribution or at
9# https://www.openssl.org/source/license.html
10
11
12# ====================================================================
13# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
14# project. The module is, however, dual licensed under OpenSSL and
15# CRYPTOGAMS licenses depending on where you obtain it. For further
16# details see http://www.openssl.org/~appro/cryptogams/.
17# ====================================================================
18#
19# ECP_NISTZ256 module for x86/SSE2.
20#
21# October 2014.
22#
23# Original ECP_NISTZ256 submission targeting x86_64 is detailed in
24# http://eprint.iacr.org/2013/816. In the process of adaptation
25# original .c module was made 32-bit savvy in order to make this
26# implementation possible.
27#
28# with/without -DECP_NISTZ256_ASM
29# Pentium +66-163%
30# PIII +72-172%
31# P4 +65-132%
32# Core2 +90-215%
33# Sandy Bridge +105-265% (contemporary i[57]-* are all close to this)
34# Atom +65-155%
35# Opteron +54-110%
36# Bulldozer +99-240%
37# VIA Nano +93-290%
38#
39# Ranges denote minimum and maximum improvement coefficients depending
40# on benchmark. Lower coefficients are for ECDSA sign, server-side
41# operation. Keep in mind that +200% means 3x improvement.
42
43$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
44push(@INC,"${dir}","${dir}../../perlasm");
45require "x86asm.pl";
46
47# Uncomment when all i386 assembly generators are updated to take the output
48# file as last argument...
49# $output=pop;
50# open STDOUT,">$output";
51
52&asm_init($ARGV[0],"ecp_nistz256-x86.pl",$ARGV[$#ARGV] eq "386");
53
54$sse2=0;
55for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
56
57&external_label("OPENSSL_ia32cap_P") if ($sse2);
58
59
60########################################################################
61# Keep in mind that constants are stored least to most significant word
62&static_label("ONE");
63&set_label("ONE",64);
64&data_word(1,0,0,0,0,0,0,0);
65&align(64);
66
67########################################################################
68# void ecp_nistz256_mul_by_2(BN_ULONG edi[8],const BN_ULONG esi[8]);
69&function_begin("ecp_nistz256_mul_by_2");
70 &mov ("esi",&wparam(1));
71 &mov ("edi",&wparam(0));
72 &mov ("ebp","esi");
73########################################################################
74# common pattern for internal functions is that %edi is result pointer,
75# %esi and %ebp are input ones, %ebp being optional. %edi is preserved.
76 &call ("_ecp_nistz256_add");
77&function_end("ecp_nistz256_mul_by_2");
78
79########################################################################
80# void ecp_nistz256_div_by_2(BN_ULONG edi[8],const BN_ULONG esi[8]);
81&function_begin("ecp_nistz256_div_by_2");
82 &mov ("esi",&wparam(1));
83 &mov ("edi",&wparam(0));
84 &call ("_ecp_nistz256_div_by_2");
85&function_end("ecp_nistz256_div_by_2");
86
87&function_begin_B("_ecp_nistz256_div_by_2");
88 # tmp = a is odd ? a+mod : a
89 #
90 # note that because mod has special form, i.e. consists of
91 # 0xffffffff, 1 and 0s, we can conditionally synthesize it by
92 # assigning least significant bit of input to one register,
93 # %ebp, and its negative to another, %edx.
94
95 &mov ("ebp",&DWP(0,"esi"));
96 &xor ("edx","edx");
97 &mov ("ebx",&DWP(4,"esi"));
98 &mov ("eax","ebp");
99 &and ("ebp",1);
100 &mov ("ecx",&DWP(8,"esi"));
101 &sub ("edx","ebp");
102
103 &add ("eax","edx");
104 &adc ("ebx","edx");
105 &mov (&DWP(0,"edi"),"eax");
106 &adc ("ecx","edx");
107 &mov (&DWP(4,"edi"),"ebx");
108 &mov (&DWP(8,"edi"),"ecx");
109
110 &mov ("eax",&DWP(12,"esi"));
111 &mov ("ebx",&DWP(16,"esi"));
112 &adc ("eax",0);
113 &mov ("ecx",&DWP(20,"esi"));
114 &adc ("ebx",0);
115 &mov (&DWP(12,"edi"),"eax");
116 &adc ("ecx",0);
117 &mov (&DWP(16,"edi"),"ebx");
118 &mov (&DWP(20,"edi"),"ecx");
119
120 &mov ("eax",&DWP(24,"esi"));
121 &mov ("ebx",&DWP(28,"esi"));
122 &adc ("eax","ebp");
123 &adc ("ebx","edx");
124 &mov (&DWP(24,"edi"),"eax");
125 &sbb ("esi","esi"); # broadcast carry bit
126 &mov (&DWP(28,"edi"),"ebx");
127
128 # ret = tmp >> 1
129
130 &mov ("eax",&DWP(0,"edi"));
131 &mov ("ebx",&DWP(4,"edi"));
132 &mov ("ecx",&DWP(8,"edi"));
133 &mov ("edx",&DWP(12,"edi"));
134
135 &shr ("eax",1);
136 &mov ("ebp","ebx");
137 &shl ("ebx",31);
138 &or ("eax","ebx");
139
140 &shr ("ebp",1);
141 &mov ("ebx","ecx");
142 &shl ("ecx",31);
143 &mov (&DWP(0,"edi"),"eax");
144 &or ("ebp","ecx");
145 &mov ("eax",&DWP(16,"edi"));
146
147 &shr ("ebx",1);
148 &mov ("ecx","edx");
149 &shl ("edx",31);
150 &mov (&DWP(4,"edi"),"ebp");
151 &or ("ebx","edx");
152 &mov ("ebp",&DWP(20,"edi"));
153
154 &shr ("ecx",1);
155 &mov ("edx","eax");
156 &shl ("eax",31);
157 &mov (&DWP(8,"edi"),"ebx");
158 &or ("ecx","eax");
159 &mov ("ebx",&DWP(24,"edi"));
160
161 &shr ("edx",1);
162 &mov ("eax","ebp");
163 &shl ("ebp",31);
164 &mov (&DWP(12,"edi"),"ecx");
165 &or ("edx","ebp");
166 &mov ("ecx",&DWP(28,"edi"));
167
168 &shr ("eax",1);
169 &mov ("ebp","ebx");
170 &shl ("ebx",31);
171 &mov (&DWP(16,"edi"),"edx");
172 &or ("eax","ebx");
173
174 &shr ("ebp",1);
175 &mov ("ebx","ecx");
176 &shl ("ecx",31);
177 &mov (&DWP(20,"edi"),"eax");
178 &or ("ebp","ecx");
179
180 &shr ("ebx",1);
181 &shl ("esi",31);
182 &mov (&DWP(24,"edi"),"ebp");
183 &or ("ebx","esi"); # handle top-most carry bit
184 &mov (&DWP(28,"edi"),"ebx");
185
186 &ret ();
187&function_end_B("_ecp_nistz256_div_by_2");
188
189########################################################################
190# void ecp_nistz256_add(BN_ULONG edi[8],const BN_ULONG esi[8],
191# const BN_ULONG ebp[8]);
192&function_begin("ecp_nistz256_add");
193 &mov ("esi",&wparam(1));
194 &mov ("ebp",&wparam(2));
195 &mov ("edi",&wparam(0));
196 &call ("_ecp_nistz256_add");
197&function_end("ecp_nistz256_add");
198
199&function_begin_B("_ecp_nistz256_add");
200 &mov ("eax",&DWP(0,"esi"));
201 &mov ("ebx",&DWP(4,"esi"));
202 &mov ("ecx",&DWP(8,"esi"));
203 &add ("eax",&DWP(0,"ebp"));
204 &mov ("edx",&DWP(12,"esi"));
205 &adc ("ebx",&DWP(4,"ebp"));
206 &mov (&DWP(0,"edi"),"eax");
207 &adc ("ecx",&DWP(8,"ebp"));
208 &mov (&DWP(4,"edi"),"ebx");
209 &adc ("edx",&DWP(12,"ebp"));
210 &mov (&DWP(8,"edi"),"ecx");
211 &mov (&DWP(12,"edi"),"edx");
212
213 &mov ("eax",&DWP(16,"esi"));
214 &mov ("ebx",&DWP(20,"esi"));
215 &mov ("ecx",&DWP(24,"esi"));
216 &adc ("eax",&DWP(16,"ebp"));
217 &mov ("edx",&DWP(28,"esi"));
218 &adc ("ebx",&DWP(20,"ebp"));
219 &mov (&DWP(16,"edi"),"eax");
220 &adc ("ecx",&DWP(24,"ebp"));
221 &mov (&DWP(20,"edi"),"ebx");
222 &mov ("esi",0);
223 &adc ("edx",&DWP(28,"ebp"));
224 &mov (&DWP(24,"edi"),"ecx");
225 &adc ("esi",0);
226 &mov (&DWP(28,"edi"),"edx");
227
228 # if a+b >= modulus, subtract modulus.
229 #
230 # But since comparison implies subtraction, we subtract modulus
231 # to see if it borrows, and then subtract it for real if
232 # subtraction didn't borrow.
233
234 &mov ("eax",&DWP(0,"edi"));
235 &mov ("ebx",&DWP(4,"edi"));
236 &mov ("ecx",&DWP(8,"edi"));
237 &sub ("eax",-1);
238 &mov ("edx",&DWP(12,"edi"));
239 &sbb ("ebx",-1);
240 &mov ("eax",&DWP(16,"edi"));
241 &sbb ("ecx",-1);
242 &mov ("ebx",&DWP(20,"edi"));
243 &sbb ("edx",0);
244 &mov ("ecx",&DWP(24,"edi"));
245 &sbb ("eax",0);
246 &mov ("edx",&DWP(28,"edi"));
247 &sbb ("ebx",0);
248 &sbb ("ecx",1);
249 &sbb ("edx",-1);
250 &sbb ("esi",0);
251
252 # Note that because mod has special form, i.e. consists of
253 # 0xffffffff, 1 and 0s, we can conditionally synthesize it by
254 # by using borrow.
255
256 &not ("esi");
257 &mov ("eax",&DWP(0,"edi"));
258 &mov ("ebp","esi");
259 &mov ("ebx",&DWP(4,"edi"));
260 &shr ("ebp",31);
261 &mov ("ecx",&DWP(8,"edi"));
262 &sub ("eax","esi");
263 &mov ("edx",&DWP(12,"edi"));
264 &sbb ("ebx","esi");
265 &mov (&DWP(0,"edi"),"eax");
266 &sbb ("ecx","esi");
267 &mov (&DWP(4,"edi"),"ebx");
268 &sbb ("edx",0);
269 &mov (&DWP(8,"edi"),"ecx");
270 &mov (&DWP(12,"edi"),"edx");
271
272 &mov ("eax",&DWP(16,"edi"));
273 &mov ("ebx",&DWP(20,"edi"));
274 &mov ("ecx",&DWP(24,"edi"));
275 &sbb ("eax",0);
276 &mov ("edx",&DWP(28,"edi"));
277 &sbb ("ebx",0);
278 &mov (&DWP(16,"edi"),"eax");
279 &sbb ("ecx","ebp");
280 &mov (&DWP(20,"edi"),"ebx");
281 &sbb ("edx","esi");
282 &mov (&DWP(24,"edi"),"ecx");
283 &mov (&DWP(28,"edi"),"edx");
284
285 &ret ();
286&function_end_B("_ecp_nistz256_add");
287
288########################################################################
289# void ecp_nistz256_sub(BN_ULONG edi[8],const BN_ULONG esi[8],
290# const BN_ULONG ebp[8]);
291&function_begin("ecp_nistz256_sub");
292 &mov ("esi",&wparam(1));
293 &mov ("ebp",&wparam(2));
294 &mov ("edi",&wparam(0));
295 &call ("_ecp_nistz256_sub");
296&function_end("ecp_nistz256_sub");
297
298&function_begin_B("_ecp_nistz256_sub");
299 &mov ("eax",&DWP(0,"esi"));
300 &mov ("ebx",&DWP(4,"esi"));
301 &mov ("ecx",&DWP(8,"esi"));
302 &sub ("eax",&DWP(0,"ebp"));
303 &mov ("edx",&DWP(12,"esi"));
304 &sbb ("ebx",&DWP(4,"ebp"));
305 &mov (&DWP(0,"edi"),"eax");
306 &sbb ("ecx",&DWP(8,"ebp"));
307 &mov (&DWP(4,"edi"),"ebx");
308 &sbb ("edx",&DWP(12,"ebp"));
309 &mov (&DWP(8,"edi"),"ecx");
310 &mov (&DWP(12,"edi"),"edx");
311
312 &mov ("eax",&DWP(16,"esi"));
313 &mov ("ebx",&DWP(20,"esi"));
314 &mov ("ecx",&DWP(24,"esi"));
315 &sbb ("eax",&DWP(16,"ebp"));
316 &mov ("edx",&DWP(28,"esi"));
317 &sbb ("ebx",&DWP(20,"ebp"));
318 &sbb ("ecx",&DWP(24,"ebp"));
319 &mov (&DWP(16,"edi"),"eax");
320 &sbb ("edx",&DWP(28,"ebp"));
321 &mov (&DWP(20,"edi"),"ebx");
322 &sbb ("esi","esi"); # broadcast borrow bit
323 &mov (&DWP(24,"edi"),"ecx");
324 &mov (&DWP(28,"edi"),"edx");
325
326 # if a-b borrows, add modulus.
327 #
328 # Note that because mod has special form, i.e. consists of
329 # 0xffffffff, 1 and 0s, we can conditionally synthesize it by
330 # assigning borrow bit to one register, %ebp, and its negative
331 # to another, %esi. But we started by calculating %esi...
332
333 &mov ("eax",&DWP(0,"edi"));
334 &mov ("ebp","esi");
335 &mov ("ebx",&DWP(4,"edi"));
336 &shr ("ebp",31);
337 &mov ("ecx",&DWP(8,"edi"));
338 &add ("eax","esi");
339 &mov ("edx",&DWP(12,"edi"));
340 &adc ("ebx","esi");
341 &mov (&DWP(0,"edi"),"eax");
342 &adc ("ecx","esi");
343 &mov (&DWP(4,"edi"),"ebx");
344 &adc ("edx",0);
345 &mov (&DWP(8,"edi"),"ecx");
346 &mov (&DWP(12,"edi"),"edx");
347
348 &mov ("eax",&DWP(16,"edi"));
349 &mov ("ebx",&DWP(20,"edi"));
350 &mov ("ecx",&DWP(24,"edi"));
351 &adc ("eax",0);
352 &mov ("edx",&DWP(28,"edi"));
353 &adc ("ebx",0);
354 &mov (&DWP(16,"edi"),"eax");
355 &adc ("ecx","ebp");
356 &mov (&DWP(20,"edi"),"ebx");
357 &adc ("edx","esi");
358 &mov (&DWP(24,"edi"),"ecx");
359 &mov (&DWP(28,"edi"),"edx");
360
361 &ret ();
362&function_end_B("_ecp_nistz256_sub");
363
364########################################################################
365# void ecp_nistz256_neg(BN_ULONG edi[8],const BN_ULONG esi[8]);
366&function_begin("ecp_nistz256_neg");
367 &mov ("ebp",&wparam(1));
368 &mov ("edi",&wparam(0));
369
370 &xor ("eax","eax");
371 &stack_push(8);
372 &mov (&DWP(0,"esp"),"eax");
373 &mov ("esi","esp");
374 &mov (&DWP(4,"esp"),"eax");
375 &mov (&DWP(8,"esp"),"eax");
376 &mov (&DWP(12,"esp"),"eax");
377 &mov (&DWP(16,"esp"),"eax");
378 &mov (&DWP(20,"esp"),"eax");
379 &mov (&DWP(24,"esp"),"eax");
380 &mov (&DWP(28,"esp"),"eax");
381
382 &call ("_ecp_nistz256_sub");
383
384 &stack_pop(8);
385&function_end("ecp_nistz256_neg");
386
387&function_begin_B("_picup_eax");
388 &mov ("eax",&DWP(0,"esp"));
389 &ret ();
390&function_end_B("_picup_eax");
391
392########################################################################
393# void ecp_nistz256_from_mont(BN_ULONG edi[8],const BN_ULONG esi[8]);
394&function_begin("ecp_nistz256_from_mont");
395 &mov ("esi",&wparam(1));
396 &call ("_picup_eax");
397 &set_label("pic");
398 &lea ("ebp",&DWP(&label("ONE")."-".&label("pic"),"eax"));
399 if ($sse2) {
400 &picmeup("eax","OPENSSL_ia32cap_P","eax",&label("pic"));
401 &mov ("eax",&DWP(0,"eax")); }
402 &mov ("edi",&wparam(0));
403 &call ("_ecp_nistz256_mul_mont");
404&function_end("ecp_nistz256_from_mont");
405
406########################################################################
407# void ecp_nistz256_mul_mont(BN_ULONG edi[8],const BN_ULONG esi[8],
408# const BN_ULONG ebp[8]);
409&function_begin("ecp_nistz256_mul_mont");
410 &mov ("esi",&wparam(1));
411 &mov ("ebp",&wparam(2));
412 if ($sse2) {
413 &call ("_picup_eax");
414 &set_label("pic");
415 &picmeup("eax","OPENSSL_ia32cap_P","eax",&label("pic"));
416 &mov ("eax",&DWP(0,"eax")); }
417 &mov ("edi",&wparam(0));
418 &call ("_ecp_nistz256_mul_mont");
419&function_end("ecp_nistz256_mul_mont");
420
421########################################################################
422# void ecp_nistz256_sqr_mont(BN_ULONG edi[8],const BN_ULONG esi[8]);
423&function_begin("ecp_nistz256_sqr_mont");
424 &mov ("esi",&wparam(1));
425 if ($sse2) {
426 &call ("_picup_eax");
427 &set_label("pic");
428 &picmeup("eax","OPENSSL_ia32cap_P","eax",&label("pic"));
429 &mov ("eax",&DWP(0,"eax")); }
430 &mov ("edi",&wparam(0));
431 &mov ("ebp","esi");
432 &call ("_ecp_nistz256_mul_mont");
433&function_end("ecp_nistz256_sqr_mont");
434
435&function_begin_B("_ecp_nistz256_mul_mont");
436 if ($sse2) {
437 # see if XMM+SSE2 is on
438 &and ("eax","\$(IA32CAP_MASK0_FXSR | IA32CAP_MASK0_SSE2)");
439 &cmp ("eax","\$(IA32CAP_MASK0_FXSR | IA32CAP_MASK0_SSE2)");
440 &jne (&label("mul_mont_ialu"));
441
442 ########################################
443 # SSE2 code path featuring 32x16-bit
444 # multiplications is ~2x faster than
445 # IALU counterpart (except on Atom)...
446 ########################################
447 # stack layout:
448 # +------------------------------------+< %esp
449 # | 7 16-byte temporary XMM words, |
450 # | "sliding" toward lower address |
451 # . .
452 # +------------------------------------+
453 # | unused XMM word |
454 # +------------------------------------+< +128,%ebx
455 # | 8 16-byte XMM words holding copies |
456 # | of a[i]<<64|a[i] |
457 # . .
458 # . .
459 # +------------------------------------+< +256
460 &mov ("edx","esp");
461 &sub ("esp",0x100);
462
463 &movd ("xmm7",&DWP(0,"ebp")); # b[0] -> 0000.00xy
464 &lea ("ebp",&DWP(4,"ebp"));
465 &pcmpeqd("xmm6","xmm6");
466 &psrlq ("xmm6",48); # compose 0xffff<<64|0xffff
467
468 &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y
469 &and ("esp",-64);
470 &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y
471 &lea ("ebx",&DWP(0x80,"esp"));
472
473 &movd ("xmm0",&DWP(4*0,"esi")); # a[0] -> 0000.00xy
474 &pshufd ("xmm0","xmm0",0b11001100); # 0000.00xy -> 00xy.00xy
475 &movd ("xmm1",&DWP(4*1,"esi")); # a[1] -> ...
476 &movdqa (&QWP(0x00,"ebx"),"xmm0"); # offload converted a[0]
477 &pmuludq("xmm0","xmm7"); # a[0]*b[0]
478
479 &movd ("xmm2",&DWP(4*2,"esi"));
480 &pshufd ("xmm1","xmm1",0b11001100);
481 &movdqa (&QWP(0x10,"ebx"),"xmm1");
482 &pmuludq("xmm1","xmm7"); # a[1]*b[0]
483
484 &movq ("xmm4","xmm0"); # clear upper 64 bits
485 &pslldq("xmm4",6);
486 &paddq ("xmm4","xmm0");
487 &movdqa("xmm5","xmm4");
488 &psrldq("xmm4",10); # upper 32 bits of a[0]*b[0]
489 &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[0]
490
491 # Upper half of a[0]*b[i] is carried into next multiplication
492 # iteration, while lower one "participates" in actual reduction.
493 # Normally latter is done by accumulating result of multiplication
494 # of modulus by "magic" digit, but thanks to special form of modulus
495 # and "magic" digit it can be performed only with additions and
496 # subtractions (see note in IALU section below). Note that we are
497 # not bothered with carry bits, they are accumulated in "flatten"
498 # phase after all multiplications and reductions.
499
500 &movd ("xmm3",&DWP(4*3,"esi"));
501 &pshufd ("xmm2","xmm2",0b11001100);
502 &movdqa (&QWP(0x20,"ebx"),"xmm2");
503 &pmuludq("xmm2","xmm7"); # a[2]*b[0]
504 &paddq ("xmm1","xmm4"); # a[1]*b[0]+hw(a[0]*b[0]), carry
505 &movdqa (&QWP(0x00,"esp"),"xmm1"); # t[0]
506
507 &movd ("xmm0",&DWP(4*4,"esi"));
508 &pshufd ("xmm3","xmm3",0b11001100);
509 &movdqa (&QWP(0x30,"ebx"),"xmm3");
510 &pmuludq("xmm3","xmm7"); # a[3]*b[0]
511 &movdqa (&QWP(0x10,"esp"),"xmm2");
512
513 &movd ("xmm1",&DWP(4*5,"esi"));
514 &pshufd ("xmm0","xmm0",0b11001100);
515 &movdqa (&QWP(0x40,"ebx"),"xmm0");
516 &pmuludq("xmm0","xmm7"); # a[4]*b[0]
517 &paddq ("xmm3","xmm5"); # a[3]*b[0]+lw(a[0]*b[0]), reduction step
518 &movdqa (&QWP(0x20,"esp"),"xmm3");
519
520 &movd ("xmm2",&DWP(4*6,"esi"));
521 &pshufd ("xmm1","xmm1",0b11001100);
522 &movdqa (&QWP(0x50,"ebx"),"xmm1");
523 &pmuludq("xmm1","xmm7"); # a[5]*b[0]
524 &movdqa (&QWP(0x30,"esp"),"xmm0");
525 &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step
526
527 &movd ("xmm3",&DWP(4*7,"esi"));
528 &pshufd ("xmm2","xmm2",0b11001100);
529 &movdqa (&QWP(0x60,"ebx"),"xmm2");
530 &pmuludq("xmm2","xmm7"); # a[6]*b[0]
531 &movdqa (&QWP(0x40,"esp"),"xmm1");
532 &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step
533
534 &movd ("xmm0",&DWP(0,"ebp")); # b[1] -> 0000.00xy
535 &pshufd ("xmm3","xmm3",0b11001100);
536 &movdqa (&QWP(0x70,"ebx"),"xmm3");
537 &pmuludq("xmm3","xmm7"); # a[7]*b[0]
538
539 &pshuflw("xmm7","xmm0",0b11011100); # 0000.00xy -> 0000.0x0y
540 &movdqa ("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0]
541 &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y
542
543 &mov ("ecx",6);
544 &lea ("ebp",&DWP(4,"ebp"));
545 &jmp (&label("madd_sse2"));
546
547&set_label("madd_sse2",16);
548 &paddq ("xmm2","xmm5"); # a[6]*b[i-1]+lw(a[0]*b[i-1]), reduction step [modulo-scheduled]
549 &paddq ("xmm3","xmm4"); # a[7]*b[i-1]+lw(a[0]*b[i-1])*0xffffffff, reduction step [modulo-scheduled]
550 &movdqa ("xmm1",&QWP(0x10,"ebx"));
551 &pmuludq("xmm0","xmm7"); # a[0]*b[i]
552 &movdqa(&QWP(0x50,"esp"),"xmm2");
553
554 &movdqa ("xmm2",&QWP(0x20,"ebx"));
555 &pmuludq("xmm1","xmm7"); # a[1]*b[i]
556 &movdqa(&QWP(0x60,"esp"),"xmm3");
557 &paddq ("xmm0",&QWP(0x00,"esp"));
558
559 &movdqa ("xmm3",&QWP(0x30,"ebx"));
560 &pmuludq("xmm2","xmm7"); # a[2]*b[i]
561 &movq ("xmm4","xmm0"); # clear upper 64 bits
562 &pslldq("xmm4",6);
563 &paddq ("xmm1",&QWP(0x10,"esp"));
564 &paddq ("xmm4","xmm0");
565 &movdqa("xmm5","xmm4");
566 &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0]
567
568 &movdqa ("xmm0",&QWP(0x40,"ebx"));
569 &pmuludq("xmm3","xmm7"); # a[3]*b[i]
570 &paddq ("xmm1","xmm4"); # a[1]*b[i]+hw(a[0]*b[i]), carry
571 &paddq ("xmm2",&QWP(0x20,"esp"));
572 &movdqa (&QWP(0x00,"esp"),"xmm1");
573
574 &movdqa ("xmm1",&QWP(0x50,"ebx"));
575 &pmuludq("xmm0","xmm7"); # a[4]*b[i]
576 &paddq ("xmm3",&QWP(0x30,"esp"));
577 &movdqa (&QWP(0x10,"esp"),"xmm2");
578 &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i]
579
580 &movdqa ("xmm2",&QWP(0x60,"ebx"));
581 &pmuludq("xmm1","xmm7"); # a[5]*b[i]
582 &paddq ("xmm3","xmm5"); # a[3]*b[i]+lw(a[0]*b[i]), reduction step
583 &paddq ("xmm0",&QWP(0x40,"esp"));
584 &movdqa (&QWP(0x20,"esp"),"xmm3");
585 &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step
586
587 &movdqa ("xmm3","xmm7");
588 &pmuludq("xmm2","xmm7"); # a[6]*b[i]
589 &movd ("xmm7",&DWP(0,"ebp")); # b[i++] -> 0000.00xy
590 &lea ("ebp",&DWP(4,"ebp"));
591 &paddq ("xmm1",&QWP(0x50,"esp"));
592 &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step
593 &movdqa (&QWP(0x30,"esp"),"xmm0");
594 &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y
595
596 &pmuludq("xmm3",&QWP(0x70,"ebx")); # a[7]*b[i]
597 &pshufd("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y
598 &movdqa("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0]
599 &movdqa (&QWP(0x40,"esp"),"xmm1");
600 &paddq ("xmm2",&QWP(0x60,"esp"));
601
602 &dec ("ecx");
603 &jnz (&label("madd_sse2"));
604
605 &paddq ("xmm2","xmm5"); # a[6]*b[6]+lw(a[0]*b[6]), reduction step [modulo-scheduled]
606 &paddq ("xmm3","xmm4"); # a[7]*b[6]+lw(a[0]*b[6])*0xffffffff, reduction step [modulo-scheduled]
607 &movdqa ("xmm1",&QWP(0x10,"ebx"));
608 &pmuludq("xmm0","xmm7"); # a[0]*b[7]
609 &movdqa(&QWP(0x50,"esp"),"xmm2");
610
611 &movdqa ("xmm2",&QWP(0x20,"ebx"));
612 &pmuludq("xmm1","xmm7"); # a[1]*b[7]
613 &movdqa(&QWP(0x60,"esp"),"xmm3");
614 &paddq ("xmm0",&QWP(0x00,"esp"));
615
616 &movdqa ("xmm3",&QWP(0x30,"ebx"));
617 &pmuludq("xmm2","xmm7"); # a[2]*b[7]
618 &movq ("xmm4","xmm0"); # clear upper 64 bits
619 &pslldq("xmm4",6);
620 &paddq ("xmm1",&QWP(0x10,"esp"));
621 &paddq ("xmm4","xmm0");
622 &movdqa("xmm5","xmm4");
623 &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0]
624
625 &movdqa ("xmm0",&QWP(0x40,"ebx"));
626 &pmuludq("xmm3","xmm7"); # a[3]*b[7]
627 &paddq ("xmm1","xmm4"); # a[1]*b[7]+hw(a[0]*b[7]), carry
628 &paddq ("xmm2",&QWP(0x20,"esp"));
629 &movdqa (&QWP(0x00,"esp"),"xmm1");
630
631 &movdqa ("xmm1",&QWP(0x50,"ebx"));
632 &pmuludq("xmm0","xmm7"); # a[4]*b[7]
633 &paddq ("xmm3",&QWP(0x30,"esp"));
634 &movdqa (&QWP(0x10,"esp"),"xmm2");
635 &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i]
636
637 &movdqa ("xmm2",&QWP(0x60,"ebx"));
638 &pmuludq("xmm1","xmm7"); # a[5]*b[7]
639 &paddq ("xmm3","xmm5"); # reduction step
640 &paddq ("xmm0",&QWP(0x40,"esp"));
641 &movdqa (&QWP(0x20,"esp"),"xmm3");
642 &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step
643
644 &movdqa ("xmm3",&QWP(0x70,"ebx"));
645 &pmuludq("xmm2","xmm7"); # a[6]*b[7]
646 &paddq ("xmm1",&QWP(0x50,"esp"));
647 &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step
648 &movdqa (&QWP(0x30,"esp"),"xmm0");
649
650 &pmuludq("xmm3","xmm7"); # a[7]*b[7]
651 &pcmpeqd("xmm7","xmm7");
652 &movdqa ("xmm0",&QWP(0x00,"esp"));
653 &pslldq ("xmm7",8);
654 &movdqa (&QWP(0x40,"esp"),"xmm1");
655 &paddq ("xmm2",&QWP(0x60,"esp"));
656
657 &paddq ("xmm2","xmm5"); # a[6]*b[7]+lw(a[0]*b[7]), reduction step
658 &paddq ("xmm3","xmm4"); # a[6]*b[7]+lw(a[0]*b[7])*0xffffffff, reduction step
659 &movdqa(&QWP(0x50,"esp"),"xmm2");
660 &movdqa(&QWP(0x60,"esp"),"xmm3");
661
662 &movdqa ("xmm1",&QWP(0x10,"esp"));
663 &movdqa ("xmm2",&QWP(0x20,"esp"));
664 &movdqa ("xmm3",&QWP(0x30,"esp"));
665
666 &movq ("xmm4","xmm0"); # "flatten"
667 &pand ("xmm0","xmm7");
668 &xor ("ebp","ebp");
669 &pslldq ("xmm4",6);
670 &movq ("xmm5","xmm1");
671 &paddq ("xmm0","xmm4");
672 &pand ("xmm1","xmm7");
673 &psrldq ("xmm0",6);
674 &movd ("eax","xmm0");
675 &psrldq ("xmm0",4);
676
677 &paddq ("xmm5","xmm0");
678 &movdqa ("xmm0",&QWP(0x40,"esp"));
679 &sub ("eax",-1); # start subtracting modulus,
680 # this is used to determine
681 # if result is larger/smaller
682 # than modulus (see below)
683 &pslldq ("xmm5",6);
684 &movq ("xmm4","xmm2");
685 &paddq ("xmm1","xmm5");
686 &pand ("xmm2","xmm7");
687 &psrldq ("xmm1",6);
688 &mov (&DWP(4*0,"edi"),"eax");
689 &movd ("eax","xmm1");
690 &psrldq ("xmm1",4);
691
692 &paddq ("xmm4","xmm1");
693 &movdqa ("xmm1",&QWP(0x50,"esp"));
694 &sbb ("eax",-1);
695 &pslldq ("xmm4",6);
696 &movq ("xmm5","xmm3");
697 &paddq ("xmm2","xmm4");
698 &pand ("xmm3","xmm7");
699 &psrldq ("xmm2",6);
700 &mov (&DWP(4*1,"edi"),"eax");
701 &movd ("eax","xmm2");
702 &psrldq ("xmm2",4);
703
704 &paddq ("xmm5","xmm2");
705 &movdqa ("xmm2",&QWP(0x60,"esp"));
706 &sbb ("eax",-1);
707 &pslldq ("xmm5",6);
708 &movq ("xmm4","xmm0");
709 &paddq ("xmm3","xmm5");
710 &pand ("xmm0","xmm7");
711 &psrldq ("xmm3",6);
712 &mov (&DWP(4*2,"edi"),"eax");
713 &movd ("eax","xmm3");
714 &psrldq ("xmm3",4);
715
716 &paddq ("xmm4","xmm3");
717 &sbb ("eax",0);
718 &pslldq ("xmm4",6);
719 &movq ("xmm5","xmm1");
720 &paddq ("xmm0","xmm4");
721 &pand ("xmm1","xmm7");
722 &psrldq ("xmm0",6);
723 &mov (&DWP(4*3,"edi"),"eax");
724 &movd ("eax","xmm0");
725 &psrldq ("xmm0",4);
726
727 &paddq ("xmm5","xmm0");
728 &sbb ("eax",0);
729 &pslldq ("xmm5",6);
730 &movq ("xmm4","xmm2");
731 &paddq ("xmm1","xmm5");
732 &pand ("xmm2","xmm7");
733 &psrldq ("xmm1",6);
734 &movd ("ebx","xmm1");
735 &psrldq ("xmm1",4);
736 &mov ("esp","edx");
737
738 &paddq ("xmm4","xmm1");
739 &pslldq ("xmm4",6);
740 &paddq ("xmm2","xmm4");
741 &psrldq ("xmm2",6);
742 &movd ("ecx","xmm2");
743 &psrldq ("xmm2",4);
744 &sbb ("ebx",0);
745 &movd ("edx","xmm2");
746 &pextrw ("esi","xmm2",2); # top-most overflow bit
747 &sbb ("ecx",1);
748 &sbb ("edx",-1);
749 &sbb ("esi",0); # borrow from subtraction
750
751 # Final step is "if result > mod, subtract mod", and at this point
752 # we have result - mod written to output buffer, as well as borrow
753 # bit from this subtraction, and if borrow bit is set, we add
754 # modulus back.
755 #
756 # Note that because mod has special form, i.e. consists of
757 # 0xffffffff, 1 and 0s, we can conditionally synthesize it by
758 # assigning borrow bit to one register, %ebp, and its negative
759 # to another, %esi. But we started by calculating %esi...
760
761 &sub ("ebp","esi");
762 &add (&DWP(4*0,"edi"),"esi"); # add modulus or zero
763 &adc (&DWP(4*1,"edi"),"esi");
764 &adc (&DWP(4*2,"edi"),"esi");
765 &adc (&DWP(4*3,"edi"),0);
766 &adc ("eax",0);
767 &adc ("ebx",0);
768 &mov (&DWP(4*4,"edi"),"eax");
769 &adc ("ecx","ebp");
770 &mov (&DWP(4*5,"edi"),"ebx");
771 &adc ("edx","esi");
772 &mov (&DWP(4*6,"edi"),"ecx");
773 &mov (&DWP(4*7,"edi"),"edx");
774
775 &ret ();
776
777&set_label("mul_mont_ialu",16); }
778
779 ########################################
780 # IALU code path suitable for all CPUs.
781 ########################################
782 # stack layout:
783 # +------------------------------------+< %esp
784 # | 8 32-bit temporary words, accessed |
785 # | as circular buffer |
786 # . .
787 # . .
788 # +------------------------------------+< +32
789 # | offloaded destination pointer |
790 # +------------------------------------+
791 # | unused |
792 # +------------------------------------+< +40
793 &sub ("esp",10*4);
794
795 &mov ("eax",&DWP(0*4,"esi")); # a[0]
796 &mov ("ebx",&DWP(0*4,"ebp")); # b[0]
797 &mov (&DWP(8*4,"esp"),"edi"); # off-load dst ptr
798
799 &mul ("ebx"); # a[0]*b[0]
800 &mov (&DWP(0*4,"esp"),"eax"); # t[0]
801 &mov ("eax",&DWP(1*4,"esi"));
802 &mov ("ecx","edx")
803
804 &mul ("ebx"); # a[1]*b[0]
805 &add ("ecx","eax");
806 &mov ("eax",&DWP(2*4,"esi"));
807 &adc ("edx",0);
808 &mov (&DWP(1*4,"esp"),"ecx"); # t[1]
809 &mov ("ecx","edx");
810
811 &mul ("ebx"); # a[2]*b[0]
812 &add ("ecx","eax");
813 &mov ("eax",&DWP(3*4,"esi"));
814 &adc ("edx",0);
815 &mov (&DWP(2*4,"esp"),"ecx"); # t[2]
816 &mov ("ecx","edx");
817
818 &mul ("ebx"); # a[3]*b[0]
819 &add ("ecx","eax");
820 &mov ("eax",&DWP(4*4,"esi"));
821 &adc ("edx",0);
822 &mov (&DWP(3*4,"esp"),"ecx"); # t[3]
823 &mov ("ecx","edx");
824
825 &mul ("ebx"); # a[4]*b[0]
826 &add ("ecx","eax");
827 &mov ("eax",&DWP(5*4,"esi"));
828 &adc ("edx",0);
829 &mov (&DWP(4*4,"esp"),"ecx"); # t[4]
830 &mov ("ecx","edx");
831
832 &mul ("ebx"); # a[5]*b[0]
833 &add ("ecx","eax");
834 &mov ("eax",&DWP(6*4,"esi"));
835 &adc ("edx",0);
836 &mov (&DWP(5*4,"esp"),"ecx"); # t[5]
837 &mov ("ecx","edx");
838
839 &mul ("ebx"); # a[6]*b[0]
840 &add ("ecx","eax");
841 &mov ("eax",&DWP(7*4,"esi"));
842 &adc ("edx",0);
843 &mov (&DWP(6*4,"esp"),"ecx"); # t[6]
844 &mov ("ecx","edx");
845
846 &xor ("edi","edi"); # initial top-most carry
847 &mul ("ebx"); # a[7]*b[0]
848 &add ("ecx","eax"); # t[7]
849 &mov ("eax",&DWP(0*4,"esp")); # t[0]
850 &adc ("edx",0); # t[8]
851
852for ($i=0;$i<7;$i++) {
853 my $j=$i+1;
854
855 # Reduction iteration is normally performed by accumulating
856 # result of multiplication of modulus by "magic" digit [and
857 # omitting least significant word, which is guaranteed to
858 # be 0], but thanks to special form of modulus and "magic"
859 # digit being equal to least significant word, it can be
860 # performed with additions and subtractions alone. Indeed:
861 #
862 # ffff.0001.0000.0000.0000.ffff.ffff.ffff
863 # * abcd
864 # + xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
865 #
866 # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
867 # rewrite above as:
868 #
869 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd
870 # + abcd.0000.abcd.0000.0000.abcd.0000.0000.0000
871 # - abcd.0000.0000.0000.0000.0000.0000.abcd
872 #
873 # or marking redundant operations:
874 #
875 # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.----
876 # + abcd.0000.abcd.0000.0000.abcd.----.----.----
877 # - abcd.----.----.----.----.----.----.----
878
879 &add (&DWP((($i+3)%8)*4,"esp"),"eax"); # t[3]+=t[0]
880 &adc (&DWP((($i+4)%8)*4,"esp"),0); # t[4]+=0
881 &adc (&DWP((($i+5)%8)*4,"esp"),0); # t[5]+=0
882 &adc (&DWP((($i+6)%8)*4,"esp"),"eax"); # t[6]+=t[0]
883 &adc ("ecx",0); # t[7]+=0
884 &adc ("edx","eax"); # t[8]+=t[0]
885 &adc ("edi",0); # top-most carry
886 &mov ("ebx",&DWP($j*4,"ebp")); # b[i]
887 &sub ("ecx","eax"); # t[7]-=t[0]
888 &mov ("eax",&DWP(0*4,"esi")); # a[0]
889 &sbb ("edx",0); # t[8]-=0
890 &mov (&DWP((($i+7)%8)*4,"esp"),"ecx");
891 &sbb ("edi",0); # top-most carry,
892 # keep in mind that
893 # netto result is
894 # *addition* of value
895 # with (abcd<<32)-abcd
896 # on top, so that
897 # underflow is
898 # impossible, because
899 # (abcd<<32)-abcd
900 # doesn't underflow
901 &mov (&DWP((($i+8)%8)*4,"esp"),"edx");
902
903 &mul ("ebx"); # a[0]*b[i]
904 &add ("eax",&DWP((($j+0)%8)*4,"esp"));
905 &adc ("edx",0);
906 &mov (&DWP((($j+0)%8)*4,"esp"),"eax");
907 &mov ("eax",&DWP(1*4,"esi"));
908 &mov ("ecx","edx")
909
910 &mul ("ebx"); # a[1]*b[i]
911 &add ("ecx",&DWP((($j+1)%8)*4,"esp"));
912 &adc ("edx",0);
913 &add ("ecx","eax");
914 &adc ("edx",0);
915 &mov ("eax",&DWP(2*4,"esi"));
916 &mov (&DWP((($j+1)%8)*4,"esp"),"ecx");
917 &mov ("ecx","edx");
918
919 &mul ("ebx"); # a[2]*b[i]
920 &add ("ecx",&DWP((($j+2)%8)*4,"esp"));
921 &adc ("edx",0);
922 &add ("ecx","eax");
923 &adc ("edx",0);
924 &mov ("eax",&DWP(3*4,"esi"));
925 &mov (&DWP((($j+2)%8)*4,"esp"),"ecx");
926 &mov ("ecx","edx");
927
928 &mul ("ebx"); # a[3]*b[i]
929 &add ("ecx",&DWP((($j+3)%8)*4,"esp"));
930 &adc ("edx",0);
931 &add ("ecx","eax");
932 &adc ("edx",0);
933 &mov ("eax",&DWP(4*4,"esi"));
934 &mov (&DWP((($j+3)%8)*4,"esp"),"ecx");
935 &mov ("ecx","edx");
936
937 &mul ("ebx"); # a[4]*b[i]
938 &add ("ecx",&DWP((($j+4)%8)*4,"esp"));
939 &adc ("edx",0);
940 &add ("ecx","eax");
941 &adc ("edx",0);
942 &mov ("eax",&DWP(5*4,"esi"));
943 &mov (&DWP((($j+4)%8)*4,"esp"),"ecx");
944 &mov ("ecx","edx");
945
946 &mul ("ebx"); # a[5]*b[i]
947 &add ("ecx",&DWP((($j+5)%8)*4,"esp"));
948 &adc ("edx",0);
949 &add ("ecx","eax");
950 &adc ("edx",0);
951 &mov ("eax",&DWP(6*4,"esi"));
952 &mov (&DWP((($j+5)%8)*4,"esp"),"ecx");
953 &mov ("ecx","edx");
954
955 &mul ("ebx"); # a[6]*b[i]
956 &add ("ecx",&DWP((($j+6)%8)*4,"esp"));
957 &adc ("edx",0);
958 &add ("ecx","eax");
959 &adc ("edx",0);
960 &mov ("eax",&DWP(7*4,"esi"));
961 &mov (&DWP((($j+6)%8)*4,"esp"),"ecx");
962 &mov ("ecx","edx");
963
964 &mul ("ebx"); # a[7]*b[i]
965 &add ("ecx",&DWP((($j+7)%8)*4,"esp"));
966 &adc ("edx",0);
967 &add ("ecx","eax"); # t[7]
968 &mov ("eax",&DWP((($j+0)%8)*4,"esp")); # t[0]
969 &adc ("edx","edi"); # t[8]
970 &mov ("edi",0);
971 &adc ("edi",0); # top-most carry
972}
973 &mov ("ebp",&DWP(8*4,"esp")); # restore dst ptr
974 &xor ("esi","esi");
975 my $j=$i+1;
976
977 # last multiplication-less reduction
978 &add (&DWP((($i+3)%8)*4,"esp"),"eax"); # t[3]+=t[0]
979 &adc (&DWP((($i+4)%8)*4,"esp"),0); # t[4]+=0
980 &adc (&DWP((($i+5)%8)*4,"esp"),0); # t[5]+=0
981 &adc (&DWP((($i+6)%8)*4,"esp"),"eax"); # t[6]+=t[0]
982 &adc ("ecx",0); # t[7]+=0
983 &adc ("edx","eax"); # t[8]+=t[0]
984 &adc ("edi",0); # top-most carry
985 &mov ("ebx",&DWP((($j+1)%8)*4,"esp"));
986 &sub ("ecx","eax"); # t[7]-=t[0]
987 &mov ("eax",&DWP((($j+0)%8)*4,"esp"));
988 &sbb ("edx",0); # t[8]-=0
989 &mov (&DWP((($i+7)%8)*4,"esp"),"ecx");
990 &sbb ("edi",0); # top-most carry
991 &mov (&DWP((($i+8)%8)*4,"esp"),"edx");
992
993 # Final step is "if result > mod, subtract mod", but we do it
994 # "other way around", namely write result - mod to output buffer
995 # and if subtraction borrowed, add modulus back.
996
997 &mov ("ecx",&DWP((($j+2)%8)*4,"esp"));
998 &sub ("eax",-1);
999 &mov ("edx",&DWP((($j+3)%8)*4,"esp"));
1000 &sbb ("ebx",-1);
1001 &mov (&DWP(0*4,"ebp"),"eax");
1002 &sbb ("ecx",-1);
1003 &mov (&DWP(1*4,"ebp"),"ebx");
1004 &sbb ("edx",0);
1005 &mov (&DWP(2*4,"ebp"),"ecx");
1006 &mov (&DWP(3*4,"ebp"),"edx");
1007
1008 &mov ("eax",&DWP((($j+4)%8)*4,"esp"));
1009 &mov ("ebx",&DWP((($j+5)%8)*4,"esp"));
1010 &mov ("ecx",&DWP((($j+6)%8)*4,"esp"));
1011 &sbb ("eax",0);
1012 &mov ("edx",&DWP((($j+7)%8)*4,"esp"));
1013 &sbb ("ebx",0);
1014 &sbb ("ecx",1);
1015 &sbb ("edx",-1);
1016 &sbb ("edi",0);
1017
1018 # Note that because mod has special form, i.e. consists of
1019 # 0xffffffff, 1 and 0s, we can conditionally synthesize it by
1020 # assigning borrow bit to one register, %ebp, and its negative
1021 # to another, %esi. But we started by calculating %esi...
1022
1023 &sub ("esi","edi");
1024 &add (&DWP(0*4,"ebp"),"edi"); # add modulus or zero
1025 &adc (&DWP(1*4,"ebp"),"edi");
1026 &adc (&DWP(2*4,"ebp"),"edi");
1027 &adc (&DWP(3*4,"ebp"),0);
1028 &adc ("eax",0);
1029 &adc ("ebx",0);
1030 &mov (&DWP(4*4,"ebp"),"eax");
1031 &adc ("ecx","esi");
1032 &mov (&DWP(5*4,"ebp"),"ebx");
1033 &adc ("edx","edi");
1034 &mov (&DWP(6*4,"ebp"),"ecx");
1035 &mov ("edi","ebp"); # fulfill contract
1036 &mov (&DWP(7*4,"ebp"),"edx");
1037
1038 &add ("esp",10*4);
1039 &ret ();
1040&function_end_B("_ecp_nistz256_mul_mont");
1041
1042########################################################################
1043# void ecp_nistz256_select_w5(P256_POINT *edi,const void *esi,
1044# int ebp);
1045&function_begin("ecp_nistz256_select_w5");
1046 &mov ("esi",&wparam(1));
1047 &mov ("ebp",&wparam(2));
1048
1049 &lea ("esi",&DWP(0,"esi","ebp",4));
1050 &neg ("ebp");
1051 &sar ("ebp",31);
1052 &mov ("edi",&wparam(0));
1053 &lea ("esi",&DWP(0,"esi","ebp",4));
1054
1055 for($i=0;$i<24;$i+=4) {
1056 &mov ("eax",&DWP(64*($i+0),"esi"));
1057 &mov ("ebx",&DWP(64*($i+1),"esi"));
1058 &mov ("ecx",&DWP(64*($i+2),"esi"));
1059 &mov ("edx",&DWP(64*($i+3),"esi"));
1060 &and ("eax","ebp");
1061 &and ("ebx","ebp");
1062 &and ("ecx","ebp");
1063 &and ("edx","ebp");
1064 &mov (&DWP(4*($i+0),"edi"),"eax");
1065 &mov (&DWP(4*($i+1),"edi"),"ebx");
1066 &mov (&DWP(4*($i+2),"edi"),"ecx");
1067 &mov (&DWP(4*($i+3),"edi"),"edx");
1068 }
1069&function_end("ecp_nistz256_select_w5");
1070
1071########################################################################
1072# void ecp_nistz256_select_w7(P256_POINT_AFFINE *edi,const void *esi,
1073# int ebp);
1074&function_begin("ecp_nistz256_select_w7");
1075 &mov ("esi",&wparam(1));
1076 &mov ("ebp",&wparam(2));
1077
1078 &add ("esi","ebp");
1079 &neg ("ebp"),
1080 &sar ("ebp",31);
1081 &mov ("edi",&wparam(0));
1082 &lea ("esi",&DWP(0,"esi","ebp"));
1083
1084 for($i=0;$i<64;$i+=4) {
1085 &movz ("eax",&BP(64*($i+0),"esi"));
1086 &movz ("ebx",&BP(64*($i+1),"esi"));
1087 &movz ("ecx",&BP(64*($i+2),"esi"));
1088 &and ("eax","ebp");
1089 &movz ("edx",&BP(64*($i+3),"esi"));
1090 &and ("ebx","ebp");
1091 &mov (&BP($i+0,"edi"),"al");
1092 &and ("ecx","ebp");
1093 &mov (&BP($i+1,"edi"),"bl");
1094 &and ("edx","ebp");
1095 &mov (&BP($i+2,"edi"),"cl");
1096 &mov (&BP($i+3,"edi"),"dl");
1097 }
1098&function_end("ecp_nistz256_select_w7");
1099
1100########################################################################
1101# following subroutines are "literal" implementation of those found in
1102# ecp_nistz256.c
1103#
1104########################################################################
1105# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp);
1106#
1107&static_label("point_double_shortcut");
1108&function_begin("ecp_nistz256_point_double");
1109{ my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4));
1110
1111 &mov ("esi",&wparam(1));
1112
1113 # above map() describes stack layout with 5 temporary
1114 # 256-bit vectors on top, then we take extra word for
1115 # OPENSSL_ia32cap_P copy.
1116 &stack_push(8*5+1);
1117 if ($sse2) {
1118 &call ("_picup_eax");
1119 &set_label("pic");
1120 &picmeup("edx","OPENSSL_ia32cap_P","eax",&label("pic"));
1121 &mov ("ebp",&DWP(0,"edx")); }
1122
1123&set_label("point_double_shortcut");
1124 &mov ("eax",&DWP(0,"esi")); # copy in_x
1125 &mov ("ebx",&DWP(4,"esi"));
1126 &mov ("ecx",&DWP(8,"esi"));
1127 &mov ("edx",&DWP(12,"esi"));
1128 &mov (&DWP($in_x+0,"esp"),"eax");
1129 &mov (&DWP($in_x+4,"esp"),"ebx");
1130 &mov (&DWP($in_x+8,"esp"),"ecx");
1131 &mov (&DWP($in_x+12,"esp"),"edx");
1132 &mov ("eax",&DWP(16,"esi"));
1133 &mov ("ebx",&DWP(20,"esi"));
1134 &mov ("ecx",&DWP(24,"esi"));
1135 &mov ("edx",&DWP(28,"esi"));
1136 &mov (&DWP($in_x+16,"esp"),"eax");
1137 &mov (&DWP($in_x+20,"esp"),"ebx");
1138 &mov (&DWP($in_x+24,"esp"),"ecx");
1139 &mov (&DWP($in_x+28,"esp"),"edx");
1140 &mov (&DWP(32*5,"esp"),"ebp"); # OPENSSL_ia32cap_P copy
1141
1142 &lea ("ebp",&DWP(32,"esi"));
1143 &lea ("esi",&DWP(32,"esi"));
1144 &lea ("edi",&DWP($S,"esp"));
1145 &call ("_ecp_nistz256_add"); # p256_mul_by_2(S, in_y);
1146
1147 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1148 &mov ("esi",64);
1149 &add ("esi",&wparam(1));
1150 &lea ("edi",&DWP($Zsqr,"esp"));
1151 &mov ("ebp","esi");
1152 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Zsqr, in_z);
1153
1154 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1155 &lea ("esi",&DWP($S,"esp"));
1156 &lea ("ebp",&DWP($S,"esp"));
1157 &lea ("edi",&DWP($S,"esp"));
1158 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(S, S);
1159
1160 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1161 &mov ("ebp",&wparam(1));
1162 &lea ("esi",&DWP(32,"ebp"));
1163 &lea ("ebp",&DWP(64,"ebp"));
1164 &lea ("edi",&DWP($tmp0,"esp"));
1165 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(tmp0, in_z, in_y);
1166
1167 &lea ("esi",&DWP($in_x,"esp"));
1168 &lea ("ebp",&DWP($Zsqr,"esp"));
1169 &lea ("edi",&DWP($M,"esp"));
1170 &call ("_ecp_nistz256_add"); # p256_add(M, in_x, Zsqr);
1171
1172 &mov ("edi",64);
1173 &lea ("esi",&DWP($tmp0,"esp"));
1174 &lea ("ebp",&DWP($tmp0,"esp"));
1175 &add ("edi",&wparam(0));
1176 &call ("_ecp_nistz256_add"); # p256_mul_by_2(res_z, tmp0);
1177
1178 &lea ("esi",&DWP($in_x,"esp"));
1179 &lea ("ebp",&DWP($Zsqr,"esp"));
1180 &lea ("edi",&DWP($Zsqr,"esp"));
1181 &call ("_ecp_nistz256_sub"); # p256_sub(Zsqr, in_x, Zsqr);
1182
1183 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1184 &lea ("esi",&DWP($S,"esp"));
1185 &lea ("ebp",&DWP($S,"esp"));
1186 &lea ("edi",&DWP($tmp0,"esp"));
1187 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(tmp0, S);
1188
1189 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1190 &lea ("esi",&DWP($M,"esp"));
1191 &lea ("ebp",&DWP($Zsqr,"esp"));
1192 &lea ("edi",&DWP($M,"esp"));
1193 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(M, M, Zsqr);
1194
1195 &mov ("edi",32);
1196 &lea ("esi",&DWP($tmp0,"esp"));
1197 &add ("edi",&wparam(0));
1198 &call ("_ecp_nistz256_div_by_2"); # p256_div_by_2(res_y, tmp0);
1199
1200 &lea ("esi",&DWP($M,"esp"));
1201 &lea ("ebp",&DWP($M,"esp"));
1202 &lea ("edi",&DWP($tmp0,"esp"));
1203 &call ("_ecp_nistz256_add"); # 1/2 p256_mul_by_3(M, M);
1204
1205 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1206 &lea ("esi",&DWP($in_x,"esp"));
1207 &lea ("ebp",&DWP($S,"esp"));
1208 &lea ("edi",&DWP($S,"esp"));
1209 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, in_x);
1210
1211 &lea ("esi",&DWP($tmp0,"esp"));
1212 &lea ("ebp",&DWP($M,"esp"));
1213 &lea ("edi",&DWP($M,"esp"));
1214 &call ("_ecp_nistz256_add"); # 2/2 p256_mul_by_3(M, M);
1215
1216 &lea ("esi",&DWP($S,"esp"));
1217 &lea ("ebp",&DWP($S,"esp"));
1218 &lea ("edi",&DWP($tmp0,"esp"));
1219 &call ("_ecp_nistz256_add"); # p256_mul_by_2(tmp0, S);
1220
1221 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1222 &lea ("esi",&DWP($M,"esp"));
1223 &lea ("ebp",&DWP($M,"esp"));
1224 &mov ("edi",&wparam(0));
1225 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(res_x, M);
1226
1227 &mov ("esi","edi"); # %edi is still res_x here
1228 &lea ("ebp",&DWP($tmp0,"esp"));
1229 &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, tmp0);
1230
1231 &lea ("esi",&DWP($S,"esp"));
1232 &mov ("ebp","edi"); # %edi is still res_x
1233 &lea ("edi",&DWP($S,"esp"));
1234 &call ("_ecp_nistz256_sub"); # p256_sub(S, S, res_x);
1235
1236 &mov ("eax",&DWP(32*5,"esp")); # OPENSSL_ia32cap_P copy
1237 &mov ("esi","edi"); # %edi is still &S
1238 &lea ("ebp",&DWP($M,"esp"));
1239 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, M);
1240
1241 &mov ("ebp",32);
1242 &lea ("esi",&DWP($S,"esp"));
1243 &add ("ebp",&wparam(0));
1244 &mov ("edi","ebp");
1245 &call ("_ecp_nistz256_sub"); # p256_sub(res_y, S, res_y);
1246
1247 &stack_pop(8*5+1);
1248} &function_end("ecp_nistz256_point_double");
1249
1250########################################################################
1251# void ecp_nistz256_point_add(P256_POINT *out,const P256_POINT *in1,
1252# const P256_POINT *in2);
1253&function_begin("ecp_nistz256_point_add");
1254{ my ($res_x,$res_y,$res_z,
1255 $in1_x,$in1_y,$in1_z,
1256 $in2_x,$in2_y,$in2_z,
1257 $H,$Hsqr,$R,$Rsqr,$Hcub,
1258 $U1,$U2,$S1,$S2)=map(32*$_,(0..17));
1259 my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
1260
1261 &mov ("esi",&wparam(2));
1262
1263 # above map() describes stack layout with 18 temporary
1264 # 256-bit vectors on top, then we take extra words for
1265 # !in1infty, !in2infty, result of check for zero and
1266 # OPENSSL_ia32cap_P copy. [one unused word for padding]
1267 &stack_push(8*18+5);
1268 if ($sse2) {
1269 &call ("_picup_eax");
1270 &set_label("pic");
1271 &picmeup("edx","OPENSSL_ia32cap_P","eax",&label("pic"));
1272 &mov ("ebp",&DWP(0,"edx")); }
1273
1274 &lea ("edi",&DWP($in2_x,"esp"));
1275 for($i=0;$i<96;$i+=16) {
1276 &mov ("eax",&DWP($i+0,"esi")); # copy in2
1277 &mov ("ebx",&DWP($i+4,"esi"));
1278 &mov ("ecx",&DWP($i+8,"esi"));
1279 &mov ("edx",&DWP($i+12,"esi"));
1280 &mov (&DWP($i+0,"edi"),"eax");
1281 &mov (&DWP(32*18+12,"esp"),"ebp") if ($i==0);
1282 &mov ("ebp","eax") if ($i==64);
1283 &or ("ebp","eax") if ($i>64);
1284 &mov (&DWP($i+4,"edi"),"ebx");
1285 &or ("ebp","ebx") if ($i>=64);
1286 &mov (&DWP($i+8,"edi"),"ecx");
1287 &or ("ebp","ecx") if ($i>=64);
1288 &mov (&DWP($i+12,"edi"),"edx");
1289 &or ("ebp","edx") if ($i>=64);
1290 }
1291 &xor ("eax","eax");
1292 &mov ("esi",&wparam(1));
1293 &sub ("eax","ebp");
1294 &or ("ebp","eax");
1295 &sar ("ebp",31);
1296 &mov (&DWP(32*18+4,"esp"),"ebp"); # !in2infty
1297
1298 &lea ("edi",&DWP($in1_x,"esp"));
1299 for($i=0;$i<96;$i+=16) {
1300 &mov ("eax",&DWP($i+0,"esi")); # copy in1
1301 &mov ("ebx",&DWP($i+4,"esi"));
1302 &mov ("ecx",&DWP($i+8,"esi"));
1303 &mov ("edx",&DWP($i+12,"esi"));
1304 &mov (&DWP($i+0,"edi"),"eax");
1305 &mov ("ebp","eax") if ($i==64);
1306 &or ("ebp","eax") if ($i>64);
1307 &mov (&DWP($i+4,"edi"),"ebx");
1308 &or ("ebp","ebx") if ($i>=64);
1309 &mov (&DWP($i+8,"edi"),"ecx");
1310 &or ("ebp","ecx") if ($i>=64);
1311 &mov (&DWP($i+12,"edi"),"edx");
1312 &or ("ebp","edx") if ($i>=64);
1313 }
1314 &xor ("eax","eax");
1315 &sub ("eax","ebp");
1316 &or ("ebp","eax");
1317 &sar ("ebp",31);
1318 &mov (&DWP(32*18+0,"esp"),"ebp"); # !in1infty
1319
1320 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1321 &lea ("esi",&DWP($in2_z,"esp"));
1322 &lea ("ebp",&DWP($in2_z,"esp"));
1323 &lea ("edi",&DWP($Z2sqr,"esp"));
1324 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Z2sqr, in2_z);
1325
1326 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1327 &lea ("esi",&DWP($in1_z,"esp"));
1328 &lea ("ebp",&DWP($in1_z,"esp"));
1329 &lea ("edi",&DWP($Z1sqr,"esp"));
1330 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Z1sqr, in1_z);
1331
1332 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1333 &lea ("esi",&DWP($Z2sqr,"esp"));
1334 &lea ("ebp",&DWP($in2_z,"esp"));
1335 &lea ("edi",&DWP($S1,"esp"));
1336 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S1, Z2sqr, in2_z);
1337
1338 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1339 &lea ("esi",&DWP($Z1sqr,"esp"));
1340 &lea ("ebp",&DWP($in1_z,"esp"));
1341 &lea ("edi",&DWP($S2,"esp"));
1342 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Z1sqr, in1_z);
1343
1344 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1345 &lea ("esi",&DWP($in1_y,"esp"));
1346 &lea ("ebp",&DWP($S1,"esp"));
1347 &lea ("edi",&DWP($S1,"esp"));
1348 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S1, S1, in1_y);
1349
1350 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1351 &lea ("esi",&DWP($in2_y,"esp"));
1352 &lea ("ebp",&DWP($S2,"esp"));
1353 &lea ("edi",&DWP($S2,"esp"));
1354 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, S2, in2_y);
1355
1356 &lea ("esi",&DWP($S2,"esp"));
1357 &lea ("ebp",&DWP($S1,"esp"));
1358 &lea ("edi",&DWP($R,"esp"));
1359 &call ("_ecp_nistz256_sub"); # p256_sub(R, S2, S1);
1360
1361 &or ("ebx","eax"); # see if result is zero
1362 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1363 &or ("ebx","ecx");
1364 &or ("ebx","edx");
1365 &or ("ebx",&DWP(0,"edi"));
1366 &or ("ebx",&DWP(4,"edi"));
1367 &lea ("esi",&DWP($in1_x,"esp"));
1368 &or ("ebx",&DWP(8,"edi"));
1369 &lea ("ebp",&DWP($Z2sqr,"esp"));
1370 &or ("ebx",&DWP(12,"edi"));
1371 &lea ("edi",&DWP($U1,"esp"));
1372 &mov (&DWP(32*18+8,"esp"),"ebx");
1373
1374 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U1, in1_x, Z2sqr);
1375
1376 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1377 &lea ("esi",&DWP($in2_x,"esp"));
1378 &lea ("ebp",&DWP($Z1sqr,"esp"));
1379 &lea ("edi",&DWP($U2,"esp"));
1380 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, in2_x, Z1sqr);
1381
1382 &lea ("esi",&DWP($U2,"esp"));
1383 &lea ("ebp",&DWP($U1,"esp"));
1384 &lea ("edi",&DWP($H,"esp"));
1385 &call ("_ecp_nistz256_sub"); # p256_sub(H, U2, U1);
1386
1387 &or ("eax","ebx"); # see if result is zero
1388 &or ("eax","ecx");
1389 &or ("eax","edx");
1390 &or ("eax",&DWP(0,"edi"));
1391 &or ("eax",&DWP(4,"edi"));
1392 &or ("eax",&DWP(8,"edi"));
1393 &or ("eax",&DWP(12,"edi"));
1394
1395 &data_byte(0x3e); # predict taken
1396 &jnz (&label("add_proceed")); # is_equal(U1,U2)?
1397
1398 &mov ("eax",&DWP(32*18+0,"esp"));
1399 &and ("eax",&DWP(32*18+4,"esp"));
1400 &mov ("ebx",&DWP(32*18+8,"esp"));
1401 &jz (&label("add_proceed")); # (in1infty || in2infty)?
1402 &test ("ebx","ebx");
1403 &jz (&label("add_double")); # is_equal(S1,S2)?
1404
1405 &mov ("edi",&wparam(0));
1406 &xor ("eax","eax");
1407 &mov ("ecx",96/4);
1408 &data_byte(0xfc,0xf3,0xab); # cld; stosd
1409 &jmp (&label("add_done"));
1410
1411&set_label("add_double",16);
1412 &mov ("esi",&wparam(1));
1413 &mov ("ebp",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1414 &add ("esp",4*((8*18+5)-(8*5+1))); # difference in frame sizes
1415 &jmp (&label("point_double_shortcut"));
1416
1417&set_label("add_proceed",16);
1418 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1419 &lea ("esi",&DWP($R,"esp"));
1420 &lea ("ebp",&DWP($R,"esp"));
1421 &lea ("edi",&DWP($Rsqr,"esp"));
1422 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Rsqr, R);
1423
1424 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1425 &lea ("esi",&DWP($H,"esp"));
1426 &lea ("ebp",&DWP($in1_z,"esp"));
1427 &lea ("edi",&DWP($res_z,"esp"));
1428 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_z, H, in1_z);
1429
1430 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1431 &lea ("esi",&DWP($H,"esp"));
1432 &lea ("ebp",&DWP($H,"esp"));
1433 &lea ("edi",&DWP($Hsqr,"esp"));
1434 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Hsqr, H);
1435
1436 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1437 &lea ("esi",&DWP($in2_z,"esp"));
1438 &lea ("ebp",&DWP($res_z,"esp"));
1439 &lea ("edi",&DWP($res_z,"esp"));
1440 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_z, res_z, in2_z);
1441
1442 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1443 &lea ("esi",&DWP($Hsqr,"esp"));
1444 &lea ("ebp",&DWP($U1,"esp"));
1445 &lea ("edi",&DWP($U2,"esp"));
1446 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, U1, Hsqr);
1447
1448 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1449 &lea ("esi",&DWP($H,"esp"));
1450 &lea ("ebp",&DWP($Hsqr,"esp"));
1451 &lea ("edi",&DWP($Hcub,"esp"));
1452 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(Hcub, Hsqr, H);
1453
1454 &lea ("esi",&DWP($U2,"esp"));
1455 &lea ("ebp",&DWP($U2,"esp"));
1456 &lea ("edi",&DWP($Hsqr,"esp"));
1457 &call ("_ecp_nistz256_add"); # p256_mul_by_2(Hsqr, U2);
1458
1459 &lea ("esi",&DWP($Rsqr,"esp"));
1460 &lea ("ebp",&DWP($Hsqr,"esp"));
1461 &lea ("edi",&DWP($res_x,"esp"));
1462 &call ("_ecp_nistz256_sub"); # p256_sub(res_x, Rsqr, Hsqr);
1463
1464 &lea ("esi",&DWP($res_x,"esp"));
1465 &lea ("ebp",&DWP($Hcub,"esp"));
1466 &lea ("edi",&DWP($res_x,"esp"));
1467 &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, Hcub);
1468
1469 &lea ("esi",&DWP($U2,"esp"));
1470 &lea ("ebp",&DWP($res_x,"esp"));
1471 &lea ("edi",&DWP($res_y,"esp"));
1472 &call ("_ecp_nistz256_sub"); # p256_sub(res_y, U2, res_x);
1473
1474 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1475 &lea ("esi",&DWP($Hcub,"esp"));
1476 &lea ("ebp",&DWP($S1,"esp"));
1477 &lea ("edi",&DWP($S2,"esp"));
1478 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, S1, Hcub);
1479
1480 &mov ("eax",&DWP(32*18+12,"esp")); # OPENSSL_ia32cap_P copy
1481 &lea ("esi",&DWP($R,"esp"));
1482 &lea ("ebp",&DWP($res_y,"esp"));
1483 &lea ("edi",&DWP($res_y,"esp"));
1484 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_y, R, res_y);
1485
1486 &lea ("esi",&DWP($res_y,"esp"));
1487 &lea ("ebp",&DWP($S2,"esp"));
1488 &lea ("edi",&DWP($res_y,"esp"));
1489 &call ("_ecp_nistz256_sub"); # p256_sub(res_y, res_y, S2);
1490
1491 &mov ("ebp",&DWP(32*18+0,"esp")); # !in1infty
1492 &mov ("esi",&DWP(32*18+4,"esp")); # !in2infty
1493 &mov ("edi",&wparam(0));
1494 &mov ("edx","ebp");
1495 &not ("ebp");
1496 &and ("edx","esi");
1497 &and ("ebp","esi");
1498 &not ("esi");
1499
1500 ########################################
1501 # conditional moves
1502 for($i=64;$i<96;$i+=4) {
1503 &mov ("eax","edx");
1504 &and ("eax",&DWP($res_x+$i,"esp"));
1505 &mov ("ebx","ebp");
1506 &and ("ebx",&DWP($in2_x+$i,"esp"));
1507 &mov ("ecx","esi");
1508 &and ("ecx",&DWP($in1_x+$i,"esp"));
1509 &or ("eax","ebx");
1510 &or ("eax","ecx");
1511 &mov (&DWP($i,"edi"),"eax");
1512 }
1513 for($i=0;$i<64;$i+=4) {
1514 &mov ("eax","edx");
1515 &and ("eax",&DWP($res_x+$i,"esp"));
1516 &mov ("ebx","ebp");
1517 &and ("ebx",&DWP($in2_x+$i,"esp"));
1518 &mov ("ecx","esi");
1519 &and ("ecx",&DWP($in1_x+$i,"esp"));
1520 &or ("eax","ebx");
1521 &or ("eax","ecx");
1522 &mov (&DWP($i,"edi"),"eax");
1523 }
1524 &set_label("add_done");
1525 &stack_pop(8*18+5);
1526} &function_end("ecp_nistz256_point_add");
1527
1528########################################################################
1529# void ecp_nistz256_point_add_affine(P256_POINT *out,
1530# const P256_POINT *in1,
1531# const P256_POINT_AFFINE *in2);
1532&function_begin("ecp_nistz256_point_add_affine");
1533{
1534 my ($res_x,$res_y,$res_z,
1535 $in1_x,$in1_y,$in1_z,
1536 $in2_x,$in2_y,
1537 $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14));
1538 my $Z1sqr = $S2;
1539 my @ONE_mont=(1,0,0,-1,-1,-1,-2,0);
1540
1541 &mov ("esi",&wparam(1));
1542
1543 # above map() describes stack layout with 15 temporary
1544 # 256-bit vectors on top, then we take extra words for
1545 # !in1infty, !in2infty, and OPENSSL_ia32cap_P copy.
1546 &stack_push(8*15+3);
1547 if ($sse2) {
1548 &call ("_picup_eax");
1549 &set_label("pic");
1550 &picmeup("edx","OPENSSL_ia32cap_P","eax",&label("pic"));
1551 &mov ("ebp",&DWP(0,"edx")); }
1552
1553 &lea ("edi",&DWP($in1_x,"esp"));
1554 for($i=0;$i<96;$i+=16) {
1555 &mov ("eax",&DWP($i+0,"esi")); # copy in1
1556 &mov ("ebx",&DWP($i+4,"esi"));
1557 &mov ("ecx",&DWP($i+8,"esi"));
1558 &mov ("edx",&DWP($i+12,"esi"));
1559 &mov (&DWP($i+0,"edi"),"eax");
1560 &mov (&DWP(32*15+8,"esp"),"ebp") if ($i==0);
1561 &mov ("ebp","eax") if ($i==64);
1562 &or ("ebp","eax") if ($i>64);
1563 &mov (&DWP($i+4,"edi"),"ebx");
1564 &or ("ebp","ebx") if ($i>=64);
1565 &mov (&DWP($i+8,"edi"),"ecx");
1566 &or ("ebp","ecx") if ($i>=64);
1567 &mov (&DWP($i+12,"edi"),"edx");
1568 &or ("ebp","edx") if ($i>=64);
1569 }
1570 &xor ("eax","eax");
1571 &mov ("esi",&wparam(2));
1572 &sub ("eax","ebp");
1573 &or ("ebp","eax");
1574 &sar ("ebp",31);
1575 &mov (&DWP(32*15+0,"esp"),"ebp"); # !in1infty
1576
1577 &lea ("edi",&DWP($in2_x,"esp"));
1578 for($i=0;$i<64;$i+=16) {
1579 &mov ("eax",&DWP($i+0,"esi")); # copy in2
1580 &mov ("ebx",&DWP($i+4,"esi"));
1581 &mov ("ecx",&DWP($i+8,"esi"));
1582 &mov ("edx",&DWP($i+12,"esi"));
1583 &mov (&DWP($i+0,"edi"),"eax");
1584 &mov ("ebp","eax") if ($i==0);
1585 &or ("ebp","eax") if ($i!=0);
1586 &mov (&DWP($i+4,"edi"),"ebx");
1587 &or ("ebp","ebx");
1588 &mov (&DWP($i+8,"edi"),"ecx");
1589 &or ("ebp","ecx");
1590 &mov (&DWP($i+12,"edi"),"edx");
1591 &or ("ebp","edx");
1592 }
1593 &xor ("ebx","ebx");
1594 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1595 &sub ("ebx","ebp");
1596 &lea ("esi",&DWP($in1_z,"esp"));
1597 &or ("ebx","ebp");
1598 &lea ("ebp",&DWP($in1_z,"esp"));
1599 &sar ("ebx",31);
1600 &lea ("edi",&DWP($Z1sqr,"esp"));
1601 &mov (&DWP(32*15+4,"esp"),"ebx"); # !in2infty
1602
1603 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Z1sqr, in1_z);
1604
1605 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1606 &lea ("esi",&DWP($in2_x,"esp"));
1607 &mov ("ebp","edi"); # %esi is stull &Z1sqr
1608 &lea ("edi",&DWP($U2,"esp"));
1609 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, Z1sqr, in2_x);
1610
1611 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1612 &lea ("esi",&DWP($in1_z,"esp"));
1613 &lea ("ebp",&DWP($Z1sqr,"esp"));
1614 &lea ("edi",&DWP($S2,"esp"));
1615 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Z1sqr, in1_z);
1616
1617 &lea ("esi",&DWP($U2,"esp"));
1618 &lea ("ebp",&DWP($in1_x,"esp"));
1619 &lea ("edi",&DWP($H,"esp"));
1620 &call ("_ecp_nistz256_sub"); # p256_sub(H, U2, in1_x);
1621
1622 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1623 &lea ("esi",&DWP($in2_y,"esp"));
1624 &lea ("ebp",&DWP($S2,"esp"));
1625 &lea ("edi",&DWP($S2,"esp"));
1626 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, S2, in2_y);
1627
1628 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1629 &lea ("esi",&DWP($in1_z,"esp"));
1630 &lea ("ebp",&DWP($H,"esp"));
1631 &lea ("edi",&DWP($res_z,"esp"));
1632 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_z, H, in1_z);
1633
1634 &lea ("esi",&DWP($S2,"esp"));
1635 &lea ("ebp",&DWP($in1_y,"esp"));
1636 &lea ("edi",&DWP($R,"esp"));
1637 &call ("_ecp_nistz256_sub"); # p256_sub(R, S2, in1_y);
1638
1639 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1640 &lea ("esi",&DWP($H,"esp"));
1641 &lea ("ebp",&DWP($H,"esp"));
1642 &lea ("edi",&DWP($Hsqr,"esp"));
1643 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Hsqr, H);
1644
1645 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1646 &lea ("esi",&DWP($R,"esp"));
1647 &lea ("ebp",&DWP($R,"esp"));
1648 &lea ("edi",&DWP($Rsqr,"esp"));
1649 &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Rsqr, R);
1650
1651 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1652 &lea ("esi",&DWP($in1_x,"esp"));
1653 &lea ("ebp",&DWP($Hsqr,"esp"));
1654 &lea ("edi",&DWP($U2,"esp"));
1655 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, in1_x, Hsqr);
1656
1657 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1658 &lea ("esi",&DWP($H,"esp"));
1659 &lea ("ebp",&DWP($Hsqr,"esp"));
1660 &lea ("edi",&DWP($Hcub,"esp"));
1661 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(Hcub, Hsqr, H);
1662
1663 &lea ("esi",&DWP($U2,"esp"));
1664 &lea ("ebp",&DWP($U2,"esp"));
1665 &lea ("edi",&DWP($Hsqr,"esp"));
1666 &call ("_ecp_nistz256_add"); # p256_mul_by_2(Hsqr, U2);
1667
1668 &lea ("esi",&DWP($Rsqr,"esp"));
1669 &lea ("ebp",&DWP($Hsqr,"esp"));
1670 &lea ("edi",&DWP($res_x,"esp"));
1671 &call ("_ecp_nistz256_sub"); # p256_sub(res_x, Rsqr, Hsqr);
1672
1673 &lea ("esi",&DWP($res_x,"esp"));
1674 &lea ("ebp",&DWP($Hcub,"esp"));
1675 &lea ("edi",&DWP($res_x,"esp"));
1676 &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, Hcub);
1677
1678 &lea ("esi",&DWP($U2,"esp"));
1679 &lea ("ebp",&DWP($res_x,"esp"));
1680 &lea ("edi",&DWP($res_y,"esp"));
1681 &call ("_ecp_nistz256_sub"); # p256_sub(res_y, U2, res_x);
1682
1683 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1684 &lea ("esi",&DWP($Hcub,"esp"));
1685 &lea ("ebp",&DWP($in1_y,"esp"));
1686 &lea ("edi",&DWP($S2,"esp"));
1687 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Hcub, in1_y);
1688
1689 &mov ("eax",&DWP(32*15+8,"esp")); # OPENSSL_ia32cap_P copy
1690 &lea ("esi",&DWP($R,"esp"));
1691 &lea ("ebp",&DWP($res_y,"esp"));
1692 &lea ("edi",&DWP($res_y,"esp"));
1693 &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_y, res_y, R);
1694
1695 &lea ("esi",&DWP($res_y,"esp"));
1696 &lea ("ebp",&DWP($S2,"esp"));
1697 &lea ("edi",&DWP($res_y,"esp"));
1698 &call ("_ecp_nistz256_sub"); # p256_sub(res_y, res_y, S2);
1699
1700 &mov ("ebp",&DWP(32*15+0,"esp")); # !in1infty
1701 &mov ("esi",&DWP(32*15+4,"esp")); # !in2infty
1702 &mov ("edi",&wparam(0));
1703 &mov ("edx","ebp");
1704 &not ("ebp");
1705 &and ("edx","esi");
1706 &and ("ebp","esi");
1707 &not ("esi");
1708
1709 ########################################
1710 # conditional moves
1711 for($i=64;$i<96;$i+=4) {
1712 my $one=@ONE_mont[($i-64)/4];
1713
1714 &mov ("eax","edx");
1715 &and ("eax",&DWP($res_x+$i,"esp"));
1716 &mov ("ebx","ebp") if ($one && $one!=-1);
1717 &and ("ebx",$one) if ($one && $one!=-1);
1718 &mov ("ecx","esi");
1719 &and ("ecx",&DWP($in1_x+$i,"esp"));
1720 &or ("eax",$one==-1?"ebp":"ebx") if ($one);
1721 &or ("eax","ecx");
1722 &mov (&DWP($i,"edi"),"eax");
1723 }
1724 for($i=0;$i<64;$i+=4) {
1725 &mov ("eax","edx");
1726 &and ("eax",&DWP($res_x+$i,"esp"));
1727 &mov ("ebx","ebp");
1728 &and ("ebx",&DWP($in2_x+$i,"esp"));
1729 &mov ("ecx","esi");
1730 &and ("ecx",&DWP($in1_x+$i,"esp"));
1731 &or ("eax","ebx");
1732 &or ("eax","ecx");
1733 &mov (&DWP($i,"edi"),"eax");
1734 }
1735 &stack_pop(8*15+3);
1736} &function_end("ecp_nistz256_point_add_affine");
1737
1738&asm_finish();
1739
1740close STDOUT;
diff --git a/src/lib/libcrypto/ec/asm/ecp_nistz256-x86_64.pl b/src/lib/libcrypto/ec/asm/ecp_nistz256-x86_64.pl
deleted file mode 100644
index b772aae742..0000000000
--- a/src/lib/libcrypto/ec/asm/ecp_nistz256-x86_64.pl
+++ /dev/null
@@ -1,1971 +0,0 @@
1#!/usr/bin/env perl
2# $OpenBSD: ecp_nistz256-x86_64.pl,v 1.1 2016/11/04 17:33:20 miod Exp $
3#
4# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
5#
6# Licensed under the OpenSSL license (the "License"). You may not use
7# this file except in compliance with the License. You can obtain a copy
8# in the file LICENSE in the source distribution or at
9# https://www.openssl.org/source/license.html
10
11# Copyright (c) 2014, Intel Corporation.
12#
13# Permission to use, copy, modify, and/or distribute this software for any
14# purpose with or without fee is hereby granted, provided that the above
15# copyright notice and this permission notice appear in all copies.
16#
17# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
18# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
19# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
21# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
22# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
23# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24
25# Developers and authors:
26# Shay Gueron (1, 2), and Vlad Krasnov (1)
27# (1) Intel Corporation, Israel Development Center
28# (2) University of Haifa
29
30# Reference:
31# S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
32# 256 Bit Primes"
33
34# Further optimization by <appro@openssl.org>:
35#
36# this/original with/without -DECP_NISTZ256_ASM(*)
37# Opteron +12-49% +110-150%
38# Bulldozer +14-45% +175-210%
39# P4 +18-46% n/a :-(
40# Westmere +12-34% +80-87%
41# Sandy Bridge +9-35% +110-120%
42# Ivy Bridge +9-35% +110-125%
43# Haswell +8-37% +140-160%
44# Broadwell +18-58% +145-210%
45# Atom +15-50% +130-180%
46# VIA Nano +43-160% +300-480%
47#
48# (*) "without -DECP_NISTZ256_ASM" refers to build with
49# "enable-ec_nistp_64_gcc_128";
50#
51# Ranges denote minimum and maximum improvement coefficients depending
52# on benchmark. Lower coefficients are for ECDSA sign, relatively fastest
53# server-side operation. Keep in mind that +100% means 2x improvement.
54
55$flavour = shift;
56$output = shift;
57if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
58
59$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
60
61$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
62( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
63( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
64die "can't locate x86_64-xlate.pl";
65
66open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
67*STDOUT=*OUT;
68
69$code.=<<___;
70.text
71
72# The polynomial
73.align 64
74.Lpoly:
75.quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001
76
77.LOne:
78.long 1,1,1,1,1,1,1,1
79.LTwo:
80.long 2,2,2,2,2,2,2,2
81.LThree:
82.long 3,3,3,3,3,3,3,3
83.LONE_mont:
84.quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe
85___
86
87{
88################################################################################
89# void ecp_nistz256_mul_by_2(uint64_t res[4], uint64_t a[4]);
90
91my ($a0,$a1,$a2,$a3)=map("%r$_",(8..11));
92my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rdx","%rcx","%r12","%r13");
93my ($r_ptr,$a_ptr,$b_ptr)=("%rdi","%rsi","%rdx");
94
95$code.=<<___;
96
97.globl ecp_nistz256_mul_by_2
98.type ecp_nistz256_mul_by_2,\@function,2
99.align 64
100ecp_nistz256_mul_by_2:
101 push %r12
102 push %r13
103
104 mov 8*0($a_ptr), $a0
105 mov 8*1($a_ptr), $a1
106 add $a0, $a0 # a0:a3+a0:a3
107 mov 8*2($a_ptr), $a2
108 adc $a1, $a1
109 mov 8*3($a_ptr), $a3
110 lea .Lpoly(%rip), $a_ptr
111 mov $a0, $t0
112 adc $a2, $a2
113 adc $a3, $a3
114 mov $a1, $t1
115 sbb $t4, $t4
116
117 sub 8*0($a_ptr), $a0
118 mov $a2, $t2
119 sbb 8*1($a_ptr), $a1
120 sbb 8*2($a_ptr), $a2
121 mov $a3, $t3
122 sbb 8*3($a_ptr), $a3
123 test $t4, $t4
124
125 cmovz $t0, $a0
126 cmovz $t1, $a1
127 mov $a0, 8*0($r_ptr)
128 cmovz $t2, $a2
129 mov $a1, 8*1($r_ptr)
130 cmovz $t3, $a3
131 mov $a2, 8*2($r_ptr)
132 mov $a3, 8*3($r_ptr)
133
134 pop %r13
135 pop %r12
136 ret
137.size ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
138
139################################################################################
140# void ecp_nistz256_neg(uint64_t res[4], uint64_t a[4]);
141.globl ecp_nistz256_neg
142.type ecp_nistz256_neg,\@function,2
143.align 32
144ecp_nistz256_neg:
145 push %r12
146 push %r13
147
148 xor $a0, $a0
149 xor $a1, $a1
150 xor $a2, $a2
151 xor $a3, $a3
152 xor $t4, $t4
153
154 sub 8*0($a_ptr), $a0
155 sbb 8*1($a_ptr), $a1
156 sbb 8*2($a_ptr), $a2
157 mov $a0, $t0
158 sbb 8*3($a_ptr), $a3
159 lea .Lpoly(%rip), $a_ptr
160 mov $a1, $t1
161 sbb \$0, $t4
162
163 add 8*0($a_ptr), $a0
164 mov $a2, $t2
165 adc 8*1($a_ptr), $a1
166 adc 8*2($a_ptr), $a2
167 mov $a3, $t3
168 adc 8*3($a_ptr), $a3
169 test $t4, $t4
170
171 cmovz $t0, $a0
172 cmovz $t1, $a1
173 mov $a0, 8*0($r_ptr)
174 cmovz $t2, $a2
175 mov $a1, 8*1($r_ptr)
176 cmovz $t3, $a3
177 mov $a2, 8*2($r_ptr)
178 mov $a3, 8*3($r_ptr)
179
180 pop %r13
181 pop %r12
182 ret
183.size ecp_nistz256_neg,.-ecp_nistz256_neg
184___
185}
186{
187my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx");
188my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15));
189my ($t0,$t1,$t2,$t3,$t4)=("%rcx","%rbp","%rbx","%rdx","%rax");
190my ($poly1,$poly3)=($acc6,$acc7);
191
192$code.=<<___;
193################################################################################
194# void ecp_nistz256_mul_mont(
195# uint64_t res[4],
196# uint64_t a[4],
197# uint64_t b[4]);
198
199.globl ecp_nistz256_mul_mont
200.type ecp_nistz256_mul_mont,\@function,3
201.align 32
202ecp_nistz256_mul_mont:
203.Lmul_mont:
204 push %rbp
205 push %rbx
206 push %r12
207 push %r13
208 push %r14
209 push %r15
210
211 mov $b_org, $b_ptr
212 mov 8*0($b_org), %rax
213 mov 8*0($a_ptr), $acc1
214 mov 8*1($a_ptr), $acc2
215 mov 8*2($a_ptr), $acc3
216 mov 8*3($a_ptr), $acc4
217
218 call __ecp_nistz256_mul_montq
219
220 pop %r15
221 pop %r14
222 pop %r13
223 pop %r12
224 pop %rbx
225 pop %rbp
226 ret
227.size ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
228
229.type __ecp_nistz256_mul_montq,\@abi-omnipotent
230.align 32
231__ecp_nistz256_mul_montq:
232 ########################################################################
233 # Multiply a by b[0]
234 mov %rax, $t1
235 mulq $acc1
236 mov .Lpoly+8*1(%rip),$poly1
237 mov %rax, $acc0
238 mov $t1, %rax
239 mov %rdx, $acc1
240
241 mulq $acc2
242 mov .Lpoly+8*3(%rip),$poly3
243 add %rax, $acc1
244 mov $t1, %rax
245 adc \$0, %rdx
246 mov %rdx, $acc2
247
248 mulq $acc3
249 add %rax, $acc2
250 mov $t1, %rax
251 adc \$0, %rdx
252 mov %rdx, $acc3
253
254 mulq $acc4
255 add %rax, $acc3
256 mov $acc0, %rax
257 adc \$0, %rdx
258 xor $acc5, $acc5
259 mov %rdx, $acc4
260
261 ########################################################################
262 # First reduction step
263 # Basically now we want to multiply acc[0] by p256,
264 # and add the result to the acc.
265 # Due to the special form of p256 we do some optimizations
266 #
267 # acc[0] x p256[0..1] = acc[0] x 2^96 - acc[0]
268 # then we add acc[0] and get acc[0] x 2^96
269
270 mov $acc0, $t1
271 shl \$32, $acc0
272 mulq $poly3
273 shr \$32, $t1
274 add $acc0, $acc1 # +=acc[0]<<96
275 adc $t1, $acc2
276 adc %rax, $acc3
277 mov 8*1($b_ptr), %rax
278 adc %rdx, $acc4
279 adc \$0, $acc5
280 xor $acc0, $acc0
281
282 ########################################################################
283 # Multiply by b[1]
284 mov %rax, $t1
285 mulq 8*0($a_ptr)
286 add %rax, $acc1
287 mov $t1, %rax
288 adc \$0, %rdx
289 mov %rdx, $t0
290
291 mulq 8*1($a_ptr)
292 add $t0, $acc2
293 adc \$0, %rdx
294 add %rax, $acc2
295 mov $t1, %rax
296 adc \$0, %rdx
297 mov %rdx, $t0
298
299 mulq 8*2($a_ptr)
300 add $t0, $acc3
301 adc \$0, %rdx
302 add %rax, $acc3
303 mov $t1, %rax
304 adc \$0, %rdx
305 mov %rdx, $t0
306
307 mulq 8*3($a_ptr)
308 add $t0, $acc4
309 adc \$0, %rdx
310 add %rax, $acc4
311 mov $acc1, %rax
312 adc %rdx, $acc5
313 adc \$0, $acc0
314
315 ########################################################################
316 # Second reduction step
317 mov $acc1, $t1
318 shl \$32, $acc1
319 mulq $poly3
320 shr \$32, $t1
321 add $acc1, $acc2
322 adc $t1, $acc3
323 adc %rax, $acc4
324 mov 8*2($b_ptr), %rax
325 adc %rdx, $acc5
326 adc \$0, $acc0
327 xor $acc1, $acc1
328
329 ########################################################################
330 # Multiply by b[2]
331 mov %rax, $t1
332 mulq 8*0($a_ptr)
333 add %rax, $acc2
334 mov $t1, %rax
335 adc \$0, %rdx
336 mov %rdx, $t0
337
338 mulq 8*1($a_ptr)
339 add $t0, $acc3
340 adc \$0, %rdx
341 add %rax, $acc3
342 mov $t1, %rax
343 adc \$0, %rdx
344 mov %rdx, $t0
345
346 mulq 8*2($a_ptr)
347 add $t0, $acc4
348 adc \$0, %rdx
349 add %rax, $acc4
350 mov $t1, %rax
351 adc \$0, %rdx
352 mov %rdx, $t0
353
354 mulq 8*3($a_ptr)
355 add $t0, $acc5
356 adc \$0, %rdx
357 add %rax, $acc5
358 mov $acc2, %rax
359 adc %rdx, $acc0
360 adc \$0, $acc1
361
362 ########################################################################
363 # Third reduction step
364 mov $acc2, $t1
365 shl \$32, $acc2
366 mulq $poly3
367 shr \$32, $t1
368 add $acc2, $acc3
369 adc $t1, $acc4
370 adc %rax, $acc5
371 mov 8*3($b_ptr), %rax
372 adc %rdx, $acc0
373 adc \$0, $acc1
374 xor $acc2, $acc2
375
376 ########################################################################
377 # Multiply by b[3]
378 mov %rax, $t1
379 mulq 8*0($a_ptr)
380 add %rax, $acc3
381 mov $t1, %rax
382 adc \$0, %rdx
383 mov %rdx, $t0
384
385 mulq 8*1($a_ptr)
386 add $t0, $acc4
387 adc \$0, %rdx
388 add %rax, $acc4
389 mov $t1, %rax
390 adc \$0, %rdx
391 mov %rdx, $t0
392
393 mulq 8*2($a_ptr)
394 add $t0, $acc5
395 adc \$0, %rdx
396 add %rax, $acc5
397 mov $t1, %rax
398 adc \$0, %rdx
399 mov %rdx, $t0
400
401 mulq 8*3($a_ptr)
402 add $t0, $acc0
403 adc \$0, %rdx
404 add %rax, $acc0
405 mov $acc3, %rax
406 adc %rdx, $acc1
407 adc \$0, $acc2
408
409 ########################################################################
410 # Final reduction step
411 mov $acc3, $t1
412 shl \$32, $acc3
413 mulq $poly3
414 shr \$32, $t1
415 add $acc3, $acc4
416 adc $t1, $acc5
417 mov $acc4, $t0
418 adc %rax, $acc0
419 adc %rdx, $acc1
420 mov $acc5, $t1
421 adc \$0, $acc2
422
423 ########################################################################
424 # Branch-less conditional subtraction of P
425 sub \$-1, $acc4 # .Lpoly[0]
426 mov $acc0, $t2
427 sbb $poly1, $acc5 # .Lpoly[1]
428 sbb \$0, $acc0 # .Lpoly[2]
429 mov $acc1, $t3
430 sbb $poly3, $acc1 # .Lpoly[3]
431 sbb \$0, $acc2
432
433 cmovc $t0, $acc4
434 cmovc $t1, $acc5
435 mov $acc4, 8*0($r_ptr)
436 cmovc $t2, $acc0
437 mov $acc5, 8*1($r_ptr)
438 cmovc $t3, $acc1
439 mov $acc0, 8*2($r_ptr)
440 mov $acc1, 8*3($r_ptr)
441
442 ret
443.size __ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq
444
445################################################################################
446# void ecp_nistz256_sqr_mont(
447# uint64_t res[4],
448# uint64_t a[4]);
449
450# we optimize the square according to S.Gueron and V.Krasnov,
451# "Speeding up Big-Number Squaring"
452.globl ecp_nistz256_sqr_mont
453.type ecp_nistz256_sqr_mont,\@function,2
454.align 32
455ecp_nistz256_sqr_mont:
456 push %rbp
457 push %rbx
458 push %r12
459 push %r13
460 push %r14
461 push %r15
462
463 mov 8*0($a_ptr), %rax
464 mov 8*1($a_ptr), $acc6
465 mov 8*2($a_ptr), $acc7
466 mov 8*3($a_ptr), $acc0
467
468 call __ecp_nistz256_sqr_montq
469
470 pop %r15
471 pop %r14
472 pop %r13
473 pop %r12
474 pop %rbx
475 pop %rbp
476 ret
477.size ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
478
479.type __ecp_nistz256_sqr_montq,\@abi-omnipotent
480.align 32
481__ecp_nistz256_sqr_montq:
482 mov %rax, $acc5
483 mulq $acc6 # a[1]*a[0]
484 mov %rax, $acc1
485 mov $acc7, %rax
486 mov %rdx, $acc2
487
488 mulq $acc5 # a[0]*a[2]
489 add %rax, $acc2
490 mov $acc0, %rax
491 adc \$0, %rdx
492 mov %rdx, $acc3
493
494 mulq $acc5 # a[0]*a[3]
495 add %rax, $acc3
496 mov $acc7, %rax
497 adc \$0, %rdx
498 mov %rdx, $acc4
499
500 #################################
501 mulq $acc6 # a[1]*a[2]
502 add %rax, $acc3
503 mov $acc0, %rax
504 adc \$0, %rdx
505 mov %rdx, $t1
506
507 mulq $acc6 # a[1]*a[3]
508 add %rax, $acc4
509 mov $acc0, %rax
510 adc \$0, %rdx
511 add $t1, $acc4
512 mov %rdx, $acc5
513 adc \$0, $acc5
514
515 #################################
516 mulq $acc7 # a[2]*a[3]
517 xor $acc7, $acc7
518 add %rax, $acc5
519 mov 8*0($a_ptr), %rax
520 mov %rdx, $acc6
521 adc \$0, $acc6
522
523 add $acc1, $acc1 # acc1:6<<1
524 adc $acc2, $acc2
525 adc $acc3, $acc3
526 adc $acc4, $acc4
527 adc $acc5, $acc5
528 adc $acc6, $acc6
529 adc \$0, $acc7
530
531 mulq %rax
532 mov %rax, $acc0
533 mov 8*1($a_ptr), %rax
534 mov %rdx, $t0
535
536 mulq %rax
537 add $t0, $acc1
538 adc %rax, $acc2
539 mov 8*2($a_ptr), %rax
540 adc \$0, %rdx
541 mov %rdx, $t0
542
543 mulq %rax
544 add $t0, $acc3
545 adc %rax, $acc4
546 mov 8*3($a_ptr), %rax
547 adc \$0, %rdx
548 mov %rdx, $t0
549
550 mulq %rax
551 add $t0, $acc5
552 adc %rax, $acc6
553 mov $acc0, %rax
554 adc %rdx, $acc7
555
556 mov .Lpoly+8*1(%rip), $a_ptr
557 mov .Lpoly+8*3(%rip), $t1
558
559 ##########################################
560 # Now the reduction
561 # First iteration
562 mov $acc0, $t0
563 shl \$32, $acc0
564 mulq $t1
565 shr \$32, $t0
566 add $acc0, $acc1 # +=acc[0]<<96
567 adc $t0, $acc2
568 adc %rax, $acc3
569 mov $acc1, %rax
570 adc \$0, %rdx
571
572 ##########################################
573 # Second iteration
574 mov $acc1, $t0
575 shl \$32, $acc1
576 mov %rdx, $acc0
577 mulq $t1
578 shr \$32, $t0
579 add $acc1, $acc2
580 adc $t0, $acc3
581 adc %rax, $acc0
582 mov $acc2, %rax
583 adc \$0, %rdx
584
585 ##########################################
586 # Third iteration
587 mov $acc2, $t0
588 shl \$32, $acc2
589 mov %rdx, $acc1
590 mulq $t1
591 shr \$32, $t0
592 add $acc2, $acc3
593 adc $t0, $acc0
594 adc %rax, $acc1
595 mov $acc3, %rax
596 adc \$0, %rdx
597
598 ###########################################
599 # Last iteration
600 mov $acc3, $t0
601 shl \$32, $acc3
602 mov %rdx, $acc2
603 mulq $t1
604 shr \$32, $t0
605 add $acc3, $acc0
606 adc $t0, $acc1
607 adc %rax, $acc2
608 adc \$0, %rdx
609 xor $acc3, $acc3
610
611 ############################################
612 # Add the rest of the acc
613 add $acc0, $acc4
614 adc $acc1, $acc5
615 mov $acc4, $acc0
616 adc $acc2, $acc6
617 adc %rdx, $acc7
618 mov $acc5, $acc1
619 adc \$0, $acc3
620
621 sub \$-1, $acc4 # .Lpoly[0]
622 mov $acc6, $acc2
623 sbb $a_ptr, $acc5 # .Lpoly[1]
624 sbb \$0, $acc6 # .Lpoly[2]
625 mov $acc7, $t0
626 sbb $t1, $acc7 # .Lpoly[3]
627 sbb \$0, $acc3
628
629 cmovc $acc0, $acc4
630 cmovc $acc1, $acc5
631 mov $acc4, 8*0($r_ptr)
632 cmovc $acc2, $acc6
633 mov $acc5, 8*1($r_ptr)
634 cmovc $t0, $acc7
635 mov $acc6, 8*2($r_ptr)
636 mov $acc7, 8*3($r_ptr)
637
638 ret
639.size __ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq
640___
641
642}
643{
644my ($r_ptr,$in_ptr)=("%rdi","%rsi");
645my ($acc0,$acc1,$acc2,$acc3)=map("%r$_",(8..11));
646my ($t0,$t1,$t2)=("%rcx","%r12","%r13");
647
648$code.=<<___;
649################################################################################
650# void ecp_nistz256_from_mont(
651# uint64_t res[4],
652# uint64_t in[4]);
653# This one performs Montgomery multiplication by 1, so we only need the reduction
654
655.globl ecp_nistz256_from_mont
656.type ecp_nistz256_from_mont,\@function,2
657.align 32
658ecp_nistz256_from_mont:
659 push %r12
660 push %r13
661
662 mov 8*0($in_ptr), %rax
663 mov .Lpoly+8*3(%rip), $t2
664 mov 8*1($in_ptr), $acc1
665 mov 8*2($in_ptr), $acc2
666 mov 8*3($in_ptr), $acc3
667 mov %rax, $acc0
668 mov .Lpoly+8*1(%rip), $t1
669
670 #########################################
671 # First iteration
672 mov %rax, $t0
673 shl \$32, $acc0
674 mulq $t2
675 shr \$32, $t0
676 add $acc0, $acc1
677 adc $t0, $acc2
678 adc %rax, $acc3
679 mov $acc1, %rax
680 adc \$0, %rdx
681
682 #########################################
683 # Second iteration
684 mov $acc1, $t0
685 shl \$32, $acc1
686 mov %rdx, $acc0
687 mulq $t2
688 shr \$32, $t0
689 add $acc1, $acc2
690 adc $t0, $acc3
691 adc %rax, $acc0
692 mov $acc2, %rax
693 adc \$0, %rdx
694
695 ##########################################
696 # Third iteration
697 mov $acc2, $t0
698 shl \$32, $acc2
699 mov %rdx, $acc1
700 mulq $t2
701 shr \$32, $t0
702 add $acc2, $acc3
703 adc $t0, $acc0
704 adc %rax, $acc1
705 mov $acc3, %rax
706 adc \$0, %rdx
707
708 ###########################################
709 # Last iteration
710 mov $acc3, $t0
711 shl \$32, $acc3
712 mov %rdx, $acc2
713 mulq $t2
714 shr \$32, $t0
715 add $acc3, $acc0
716 adc $t0, $acc1
717 mov $acc0, $t0
718 adc %rax, $acc2
719 mov $acc1, $in_ptr
720 adc \$0, %rdx
721
722 ###########################################
723 # Branch-less conditional subtraction
724 sub \$-1, $acc0
725 mov $acc2, %rax
726 sbb $t1, $acc1
727 sbb \$0, $acc2
728 mov %rdx, $acc3
729 sbb $t2, %rdx
730 sbb $t2, $t2
731
732 cmovnz $t0, $acc0
733 cmovnz $in_ptr, $acc1
734 mov $acc0, 8*0($r_ptr)
735 cmovnz %rax, $acc2
736 mov $acc1, 8*1($r_ptr)
737 cmovz %rdx, $acc3
738 mov $acc2, 8*2($r_ptr)
739 mov $acc3, 8*3($r_ptr)
740
741 pop %r13
742 pop %r12
743 ret
744.size ecp_nistz256_from_mont,.-ecp_nistz256_from_mont
745___
746}
747{
748my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx");
749my ($ONE,$INDEX,$Ra,$Rb,$Rc,$Rd,$Re,$Rf)=map("%xmm$_",(0..7));
750my ($M0,$T0a,$T0b,$T0c,$T0d,$T0e,$T0f,$TMP0)=map("%xmm$_",(8..15));
751my ($M1,$T2a,$T2b,$TMP2,$M2,$T2a,$T2b,$TMP2)=map("%xmm$_",(8..15));
752
753$code.=<<___;
754################################################################################
755# void ecp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index);
756.globl ecp_nistz256_select_w5
757.type ecp_nistz256_select_w5,\@abi-omnipotent
758.align 32
759ecp_nistz256_select_w5:
760___
761$code.=<<___ if ($win64);
762 lea -0x88(%rsp), %rax
763.LSEH_begin_ecp_nistz256_select_w5:
764 .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp
765 .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax)
766 .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax)
767 .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax)
768 .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax)
769 .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax)
770 .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax)
771 .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax)
772 .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax)
773 .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax)
774 .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax)
775___
776$code.=<<___;
777 movdqa .LOne(%rip), $ONE
778 movd $index, $INDEX
779
780 pxor $Ra, $Ra
781 pxor $Rb, $Rb
782 pxor $Rc, $Rc
783 pxor $Rd, $Rd
784 pxor $Re, $Re
785 pxor $Rf, $Rf
786
787 movdqa $ONE, $M0
788 pshufd \$0, $INDEX, $INDEX
789
790 mov \$16, %rax
791.Lselect_loop_sse_w5:
792
793 movdqa $M0, $TMP0
794 paddd $ONE, $M0
795 pcmpeqd $INDEX, $TMP0
796
797 movdqa 16*0($in_t), $T0a
798 movdqa 16*1($in_t), $T0b
799 movdqa 16*2($in_t), $T0c
800 movdqa 16*3($in_t), $T0d
801 movdqa 16*4($in_t), $T0e
802 movdqa 16*5($in_t), $T0f
803 lea 16*6($in_t), $in_t
804
805 pand $TMP0, $T0a
806 pand $TMP0, $T0b
807 por $T0a, $Ra
808 pand $TMP0, $T0c
809 por $T0b, $Rb
810 pand $TMP0, $T0d
811 por $T0c, $Rc
812 pand $TMP0, $T0e
813 por $T0d, $Rd
814 pand $TMP0, $T0f
815 por $T0e, $Re
816 por $T0f, $Rf
817
818 dec %rax
819 jnz .Lselect_loop_sse_w5
820
821 movdqu $Ra, 16*0($val)
822 movdqu $Rb, 16*1($val)
823 movdqu $Rc, 16*2($val)
824 movdqu $Rd, 16*3($val)
825 movdqu $Re, 16*4($val)
826 movdqu $Rf, 16*5($val)
827___
828$code.=<<___ if ($win64);
829 movaps (%rsp), %xmm6
830 movaps 0x10(%rsp), %xmm7
831 movaps 0x20(%rsp), %xmm8
832 movaps 0x30(%rsp), %xmm9
833 movaps 0x40(%rsp), %xmm10
834 movaps 0x50(%rsp), %xmm11
835 movaps 0x60(%rsp), %xmm12
836 movaps 0x70(%rsp), %xmm13
837 movaps 0x80(%rsp), %xmm14
838 movaps 0x90(%rsp), %xmm15
839 lea 0xa8(%rsp), %rsp
840.LSEH_end_ecp_nistz256_select_w5:
841___
842$code.=<<___;
843 ret
844.size ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
845
846################################################################################
847# void ecp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index);
848.globl ecp_nistz256_select_w7
849.type ecp_nistz256_select_w7,\@abi-omnipotent
850.align 32
851ecp_nistz256_select_w7:
852___
853$code.=<<___ if ($win64);
854 lea -0x88(%rsp), %rax
855.LSEH_begin_ecp_nistz256_select_w7:
856 .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp
857 .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax)
858 .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax)
859 .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax)
860 .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax)
861 .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax)
862 .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax)
863 .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax)
864 .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax)
865 .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax)
866 .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax)
867___
868$code.=<<___;
869 movdqa .LOne(%rip), $M0
870 movd $index, $INDEX
871
872 pxor $Ra, $Ra
873 pxor $Rb, $Rb
874 pxor $Rc, $Rc
875 pxor $Rd, $Rd
876
877 movdqa $M0, $ONE
878 pshufd \$0, $INDEX, $INDEX
879 mov \$64, %rax
880
881.Lselect_loop_sse_w7:
882 movdqa $M0, $TMP0
883 paddd $ONE, $M0
884 movdqa 16*0($in_t), $T0a
885 movdqa 16*1($in_t), $T0b
886 pcmpeqd $INDEX, $TMP0
887 movdqa 16*2($in_t), $T0c
888 movdqa 16*3($in_t), $T0d
889 lea 16*4($in_t), $in_t
890
891 pand $TMP0, $T0a
892 pand $TMP0, $T0b
893 por $T0a, $Ra
894 pand $TMP0, $T0c
895 por $T0b, $Rb
896 pand $TMP0, $T0d
897 por $T0c, $Rc
898 prefetcht0 255($in_t)
899 por $T0d, $Rd
900
901 dec %rax
902 jnz .Lselect_loop_sse_w7
903
904 movdqu $Ra, 16*0($val)
905 movdqu $Rb, 16*1($val)
906 movdqu $Rc, 16*2($val)
907 movdqu $Rd, 16*3($val)
908___
909$code.=<<___ if ($win64);
910 movaps (%rsp), %xmm6
911 movaps 0x10(%rsp), %xmm7
912 movaps 0x20(%rsp), %xmm8
913 movaps 0x30(%rsp), %xmm9
914 movaps 0x40(%rsp), %xmm10
915 movaps 0x50(%rsp), %xmm11
916 movaps 0x60(%rsp), %xmm12
917 movaps 0x70(%rsp), %xmm13
918 movaps 0x80(%rsp), %xmm14
919 movaps 0x90(%rsp), %xmm15
920 lea 0xa8(%rsp), %rsp
921.LSEH_end_ecp_nistz256_select_w7:
922___
923$code.=<<___;
924 ret
925.size ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
926___
927}
928{{{
929########################################################################
930# This block implements higher level point_double, point_add and
931# point_add_affine. The key to performance in this case is to allow
932# out-of-order execution logic to overlap computations from next step
933# with tail processing from current step. By using tailored calling
934# sequence we minimize inter-step overhead to give processor better
935# shot at overlapping operations...
936#
937# You will notice that input data is copied to stack. Trouble is that
938# there are no registers to spare for holding original pointers and
939# reloading them, pointers, would create undesired dependencies on
940# effective addresses calculation paths. In other words it's too done
941# to favour out-of-order execution logic.
942# <appro@openssl.org>
943
944my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx");
945my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15));
946my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rbp","%rcx",$acc4,$acc4);
947my ($poly1,$poly3)=($acc6,$acc7);
948
949sub load_for_mul () {
950my ($a,$b,$src0) = @_;
951my $bias = $src0 eq "%rax" ? 0 : -128;
952
953" mov $b, $src0
954 lea $b, $b_ptr
955 mov 8*0+$a, $acc1
956 mov 8*1+$a, $acc2
957 lea $bias+$a, $a_ptr
958 mov 8*2+$a, $acc3
959 mov 8*3+$a, $acc4"
960}
961
962sub load_for_sqr () {
963my ($a,$src0) = @_;
964my $bias = $src0 eq "%rax" ? 0 : -128;
965
966" mov 8*0+$a, $src0
967 mov 8*1+$a, $acc6
968 lea $bias+$a, $a_ptr
969 mov 8*2+$a, $acc7
970 mov 8*3+$a, $acc0"
971}
972
973 {
974########################################################################
975# operate in 4-5-0-1 "name space" that matches multiplication output
976#
977my ($a0,$a1,$a2,$a3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3);
978
979$code.=<<___;
980.type __ecp_nistz256_add_toq,\@abi-omnipotent
981.align 32
982__ecp_nistz256_add_toq:
983 add 8*0($b_ptr), $a0
984 adc 8*1($b_ptr), $a1
985 mov $a0, $t0
986 adc 8*2($b_ptr), $a2
987 adc 8*3($b_ptr), $a3
988 mov $a1, $t1
989 sbb $t4, $t4
990
991 sub \$-1, $a0
992 mov $a2, $t2
993 sbb $poly1, $a1
994 sbb \$0, $a2
995 mov $a3, $t3
996 sbb $poly3, $a3
997 test $t4, $t4
998
999 cmovz $t0, $a0
1000 cmovz $t1, $a1
1001 mov $a0, 8*0($r_ptr)
1002 cmovz $t2, $a2
1003 mov $a1, 8*1($r_ptr)
1004 cmovz $t3, $a3
1005 mov $a2, 8*2($r_ptr)
1006 mov $a3, 8*3($r_ptr)
1007
1008 ret
1009.size __ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq
1010
1011.type __ecp_nistz256_sub_fromq,\@abi-omnipotent
1012.align 32
1013__ecp_nistz256_sub_fromq:
1014 sub 8*0($b_ptr), $a0
1015 sbb 8*1($b_ptr), $a1
1016 mov $a0, $t0
1017 sbb 8*2($b_ptr), $a2
1018 sbb 8*3($b_ptr), $a3
1019 mov $a1, $t1
1020 sbb $t4, $t4
1021
1022 add \$-1, $a0
1023 mov $a2, $t2
1024 adc $poly1, $a1
1025 adc \$0, $a2
1026 mov $a3, $t3
1027 adc $poly3, $a3
1028 test $t4, $t4
1029
1030 cmovz $t0, $a0
1031 cmovz $t1, $a1
1032 mov $a0, 8*0($r_ptr)
1033 cmovz $t2, $a2
1034 mov $a1, 8*1($r_ptr)
1035 cmovz $t3, $a3
1036 mov $a2, 8*2($r_ptr)
1037 mov $a3, 8*3($r_ptr)
1038
1039 ret
1040.size __ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq
1041
1042.type __ecp_nistz256_subq,\@abi-omnipotent
1043.align 32
1044__ecp_nistz256_subq:
1045 sub $a0, $t0
1046 sbb $a1, $t1
1047 mov $t0, $a0
1048 sbb $a2, $t2
1049 sbb $a3, $t3
1050 mov $t1, $a1
1051 sbb $t4, $t4
1052
1053 add \$-1, $t0
1054 mov $t2, $a2
1055 adc $poly1, $t1
1056 adc \$0, $t2
1057 mov $t3, $a3
1058 adc $poly3, $t3
1059 test $t4, $t4
1060
1061 cmovnz $t0, $a0
1062 cmovnz $t1, $a1
1063 cmovnz $t2, $a2
1064 cmovnz $t3, $a3
1065
1066 ret
1067.size __ecp_nistz256_subq,.-__ecp_nistz256_subq
1068
1069.type __ecp_nistz256_mul_by_2q,\@abi-omnipotent
1070.align 32
1071__ecp_nistz256_mul_by_2q:
1072 add $a0, $a0 # a0:a3+a0:a3
1073 adc $a1, $a1
1074 mov $a0, $t0
1075 adc $a2, $a2
1076 adc $a3, $a3
1077 mov $a1, $t1
1078 sbb $t4, $t4
1079
1080 sub \$-1, $a0
1081 mov $a2, $t2
1082 sbb $poly1, $a1
1083 sbb \$0, $a2
1084 mov $a3, $t3
1085 sbb $poly3, $a3
1086 test $t4, $t4
1087
1088 cmovz $t0, $a0
1089 cmovz $t1, $a1
1090 mov $a0, 8*0($r_ptr)
1091 cmovz $t2, $a2
1092 mov $a1, 8*1($r_ptr)
1093 cmovz $t3, $a3
1094 mov $a2, 8*2($r_ptr)
1095 mov $a3, 8*3($r_ptr)
1096
1097 ret
1098.size __ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q
1099___
1100 }
1101sub gen_double () {
1102 my $x = shift;
1103 my ($src0,$sfx,$bias);
1104 my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4));
1105
1106 if ($x ne "x") {
1107 $src0 = "%rax";
1108 $sfx = "";
1109 $bias = 0;
1110
1111$code.=<<___;
1112.globl ecp_nistz256_point_double
1113.type ecp_nistz256_point_double,\@function,2
1114.align 32
1115ecp_nistz256_point_double:
1116___
1117 } else {
1118 $src0 = "%rdx";
1119 $sfx = "x";
1120 $bias = 128;
1121
1122$code.=<<___;
1123.type ecp_nistz256_point_doublex,\@function,2
1124.align 32
1125ecp_nistz256_point_doublex:
1126.Lpoint_doublex:
1127___
1128 }
1129$code.=<<___;
1130 push %rbp
1131 push %rbx
1132 push %r12
1133 push %r13
1134 push %r14
1135 push %r15
1136 sub \$32*5+8, %rsp
1137
1138.Lpoint_double_shortcut$x:
1139 movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr.x
1140 mov $a_ptr, $b_ptr # backup copy
1141 movdqu 0x10($a_ptr), %xmm1
1142 mov 0x20+8*0($a_ptr), $acc4 # load in_y in "5-4-0-1" order
1143 mov 0x20+8*1($a_ptr), $acc5
1144 mov 0x20+8*2($a_ptr), $acc0
1145 mov 0x20+8*3($a_ptr), $acc1
1146 mov .Lpoly+8*1(%rip), $poly1
1147 mov .Lpoly+8*3(%rip), $poly3
1148 movdqa %xmm0, $in_x(%rsp)
1149 movdqa %xmm1, $in_x+0x10(%rsp)
1150 lea 0x20($r_ptr), $acc2
1151 lea 0x40($r_ptr), $acc3
1152 movq $r_ptr, %xmm0
1153 movq $acc2, %xmm1
1154 movq $acc3, %xmm2
1155
1156 lea $S(%rsp), $r_ptr
1157 call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(S, in_y);
1158
1159 mov 0x40+8*0($a_ptr), $src0
1160 mov 0x40+8*1($a_ptr), $acc6
1161 mov 0x40+8*2($a_ptr), $acc7
1162 mov 0x40+8*3($a_ptr), $acc0
1163 lea 0x40-$bias($a_ptr), $a_ptr
1164 lea $Zsqr(%rsp), $r_ptr
1165 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Zsqr, in_z);
1166
1167 `&load_for_sqr("$S(%rsp)", "$src0")`
1168 lea $S(%rsp), $r_ptr
1169 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(S, S);
1170
1171 mov 0x20($b_ptr), $src0 # $b_ptr is still valid
1172 mov 0x40+8*0($b_ptr), $acc1
1173 mov 0x40+8*1($b_ptr), $acc2
1174 mov 0x40+8*2($b_ptr), $acc3
1175 mov 0x40+8*3($b_ptr), $acc4
1176 lea 0x40-$bias($b_ptr), $a_ptr
1177 lea 0x20($b_ptr), $b_ptr
1178 movq %xmm2, $r_ptr
1179 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, in_z, in_y);
1180 call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(res_z, res_z);
1181
1182 mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order
1183 mov $in_x+8*1(%rsp), $acc5
1184 lea $Zsqr(%rsp), $b_ptr
1185 mov $in_x+8*2(%rsp), $acc0
1186 mov $in_x+8*3(%rsp), $acc1
1187 lea $M(%rsp), $r_ptr
1188 call __ecp_nistz256_add_to$x # p256_add(M, in_x, Zsqr);
1189
1190 mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order
1191 mov $in_x+8*1(%rsp), $acc5
1192 lea $Zsqr(%rsp), $b_ptr
1193 mov $in_x+8*2(%rsp), $acc0
1194 mov $in_x+8*3(%rsp), $acc1
1195 lea $Zsqr(%rsp), $r_ptr
1196 call __ecp_nistz256_sub_from$x # p256_sub(Zsqr, in_x, Zsqr);
1197
1198 `&load_for_sqr("$S(%rsp)", "$src0")`
1199 movq %xmm1, $r_ptr
1200 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_y, S);
1201___
1202{
1203######## ecp_nistz256_div_by_2(res_y, res_y); ##########################
1204# operate in 4-5-6-7 "name space" that matches squaring output
1205#
1206my ($poly1,$poly3)=($a_ptr,$t1);
1207my ($a0,$a1,$a2,$a3,$t3,$t4,$t1)=($acc4,$acc5,$acc6,$acc7,$acc0,$acc1,$acc2);
1208
1209$code.=<<___;
1210 xor $t4, $t4
1211 mov $a0, $t0
1212 add \$-1, $a0
1213 mov $a1, $t1
1214 adc $poly1, $a1
1215 mov $a2, $t2
1216 adc \$0, $a2
1217 mov $a3, $t3
1218 adc $poly3, $a3
1219 adc \$0, $t4
1220 xor $a_ptr, $a_ptr # borrow $a_ptr
1221 test \$1, $t0
1222
1223 cmovz $t0, $a0
1224 cmovz $t1, $a1
1225 cmovz $t2, $a2
1226 cmovz $t3, $a3
1227 cmovz $a_ptr, $t4
1228
1229 mov $a1, $t0 # a0:a3>>1
1230 shr \$1, $a0
1231 shl \$63, $t0
1232 mov $a2, $t1
1233 shr \$1, $a1
1234 or $t0, $a0
1235 shl \$63, $t1
1236 mov $a3, $t2
1237 shr \$1, $a2
1238 or $t1, $a1
1239 shl \$63, $t2
1240 mov $a0, 8*0($r_ptr)
1241 shr \$1, $a3
1242 mov $a1, 8*1($r_ptr)
1243 shl \$63, $t4
1244 or $t2, $a2
1245 or $t4, $a3
1246 mov $a2, 8*2($r_ptr)
1247 mov $a3, 8*3($r_ptr)
1248___
1249}
1250$code.=<<___;
1251 `&load_for_mul("$M(%rsp)", "$Zsqr(%rsp)", "$src0")`
1252 lea $M(%rsp), $r_ptr
1253 call __ecp_nistz256_mul_mont$x # p256_mul_mont(M, M, Zsqr);
1254
1255 lea $tmp0(%rsp), $r_ptr
1256 call __ecp_nistz256_mul_by_2$x
1257
1258 lea $M(%rsp), $b_ptr
1259 lea $M(%rsp), $r_ptr
1260 call __ecp_nistz256_add_to$x # p256_mul_by_3(M, M);
1261
1262 `&load_for_mul("$S(%rsp)", "$in_x(%rsp)", "$src0")`
1263 lea $S(%rsp), $r_ptr
1264 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, in_x);
1265
1266 lea $tmp0(%rsp), $r_ptr
1267 call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(tmp0, S);
1268
1269 `&load_for_sqr("$M(%rsp)", "$src0")`
1270 movq %xmm0, $r_ptr
1271 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_x, M);
1272
1273 lea $tmp0(%rsp), $b_ptr
1274 mov $acc6, $acc0 # harmonize sqr output and sub input
1275 mov $acc7, $acc1
1276 mov $a_ptr, $poly1
1277 mov $t1, $poly3
1278 call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, tmp0);
1279
1280 mov $S+8*0(%rsp), $t0
1281 mov $S+8*1(%rsp), $t1
1282 mov $S+8*2(%rsp), $t2
1283 mov $S+8*3(%rsp), $acc2 # "4-5-0-1" order
1284 lea $S(%rsp), $r_ptr
1285 call __ecp_nistz256_sub$x # p256_sub(S, S, res_x);
1286
1287 mov $M(%rsp), $src0
1288 lea $M(%rsp), $b_ptr
1289 mov $acc4, $acc6 # harmonize sub output and mul input
1290 xor %ecx, %ecx
1291 mov $acc4, $S+8*0(%rsp) # have to save:-(
1292 mov $acc5, $acc2
1293 mov $acc5, $S+8*1(%rsp)
1294 cmovz $acc0, $acc3
1295 mov $acc0, $S+8*2(%rsp)
1296 lea $S-$bias(%rsp), $a_ptr
1297 cmovz $acc1, $acc4
1298 mov $acc1, $S+8*3(%rsp)
1299 mov $acc6, $acc1
1300 lea $S(%rsp), $r_ptr
1301 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, M);
1302
1303 movq %xmm1, $b_ptr
1304 movq %xmm1, $r_ptr
1305 call __ecp_nistz256_sub_from$x # p256_sub(res_y, S, res_y);
1306
1307 add \$32*5+8, %rsp
1308 pop %r15
1309 pop %r14
1310 pop %r13
1311 pop %r12
1312 pop %rbx
1313 pop %rbp
1314 ret
1315.size ecp_nistz256_point_double$sfx,.-ecp_nistz256_point_double$sfx
1316___
1317}
1318&gen_double("q");
1319
1320sub gen_add () {
1321 my $x = shift;
1322 my ($src0,$sfx,$bias);
1323 my ($H,$Hsqr,$R,$Rsqr,$Hcub,
1324 $U1,$U2,$S1,$S2,
1325 $res_x,$res_y,$res_z,
1326 $in1_x,$in1_y,$in1_z,
1327 $in2_x,$in2_y,$in2_z)=map(32*$_,(0..17));
1328 my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
1329
1330 if ($x ne "x") {
1331 $src0 = "%rax";
1332 $sfx = "";
1333 $bias = 0;
1334
1335$code.=<<___;
1336.globl ecp_nistz256_point_add
1337.type ecp_nistz256_point_add,\@function,3
1338.align 32
1339ecp_nistz256_point_add:
1340___
1341 } else {
1342 $src0 = "%rdx";
1343 $sfx = "x";
1344 $bias = 128;
1345 }
1346$code.=<<___;
1347 push %rbp
1348 push %rbx
1349 push %r12
1350 push %r13
1351 push %r14
1352 push %r15
1353 sub \$32*18+8, %rsp
1354
1355 movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr
1356 movdqu 0x10($a_ptr), %xmm1
1357 movdqu 0x20($a_ptr), %xmm2
1358 movdqu 0x30($a_ptr), %xmm3
1359 movdqu 0x40($a_ptr), %xmm4
1360 movdqu 0x50($a_ptr), %xmm5
1361 mov $a_ptr, $b_ptr # reassign
1362 mov $b_org, $a_ptr # reassign
1363 movdqa %xmm0, $in1_x(%rsp)
1364 movdqa %xmm1, $in1_x+0x10(%rsp)
1365 por %xmm0, %xmm1
1366 movdqa %xmm2, $in1_y(%rsp)
1367 movdqa %xmm3, $in1_y+0x10(%rsp)
1368 por %xmm2, %xmm3
1369 movdqa %xmm4, $in1_z(%rsp)
1370 movdqa %xmm5, $in1_z+0x10(%rsp)
1371 por %xmm1, %xmm3
1372
1373 movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$b_ptr
1374 pshufd \$0xb1, %xmm3, %xmm5
1375 movdqu 0x10($a_ptr), %xmm1
1376 movdqu 0x20($a_ptr), %xmm2
1377 por %xmm3, %xmm5
1378 movdqu 0x30($a_ptr), %xmm3
1379 mov 0x40+8*0($a_ptr), $src0 # load original in2_z
1380 mov 0x40+8*1($a_ptr), $acc6
1381 mov 0x40+8*2($a_ptr), $acc7
1382 mov 0x40+8*3($a_ptr), $acc0
1383 movdqa %xmm0, $in2_x(%rsp)
1384 pshufd \$0x1e, %xmm5, %xmm4
1385 movdqa %xmm1, $in2_x+0x10(%rsp)
1386 por %xmm0, %xmm1
1387 movq $r_ptr, %xmm0 # save $r_ptr
1388 movdqa %xmm2, $in2_y(%rsp)
1389 movdqa %xmm3, $in2_y+0x10(%rsp)
1390 por %xmm2, %xmm3
1391 por %xmm4, %xmm5
1392 pxor %xmm4, %xmm4
1393 por %xmm1, %xmm3
1394
1395 lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid
1396 mov $src0, $in2_z+8*0(%rsp) # make in2_z copy
1397 mov $acc6, $in2_z+8*1(%rsp)
1398 mov $acc7, $in2_z+8*2(%rsp)
1399 mov $acc0, $in2_z+8*3(%rsp)
1400 lea $Z2sqr(%rsp), $r_ptr # Z2^2
1401 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z2sqr, in2_z);
1402
1403 pcmpeqd %xmm4, %xmm5
1404 pshufd \$0xb1, %xmm3, %xmm4
1405 por %xmm3, %xmm4
1406 pshufd \$0, %xmm5, %xmm5 # in1infty
1407 pshufd \$0x1e, %xmm4, %xmm3
1408 por %xmm3, %xmm4
1409 pxor %xmm3, %xmm3
1410 pcmpeqd %xmm3, %xmm4
1411 pshufd \$0, %xmm4, %xmm4 # in2infty
1412 mov 0x40+8*0($b_ptr), $src0 # load original in1_z
1413 mov 0x40+8*1($b_ptr), $acc6
1414 mov 0x40+8*2($b_ptr), $acc7
1415 mov 0x40+8*3($b_ptr), $acc0
1416 movq $b_ptr, %xmm1
1417
1418 lea 0x40-$bias($b_ptr), $a_ptr
1419 lea $Z1sqr(%rsp), $r_ptr # Z1^2
1420 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z);
1421
1422 `&load_for_mul("$Z2sqr(%rsp)", "$in2_z(%rsp)", "$src0")`
1423 lea $S1(%rsp), $r_ptr # S1 = Z2^3
1424 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, Z2sqr, in2_z);
1425
1426 `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")`
1427 lea $S2(%rsp), $r_ptr # S2 = Z1^3
1428 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z);
1429
1430 `&load_for_mul("$S1(%rsp)", "$in1_y(%rsp)", "$src0")`
1431 lea $S1(%rsp), $r_ptr # S1 = Y1*Z2^3
1432 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, S1, in1_y);
1433
1434 `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")`
1435 lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3
1436 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y);
1437
1438 lea $S1(%rsp), $b_ptr
1439 lea $R(%rsp), $r_ptr # R = S2 - S1
1440 call __ecp_nistz256_sub_from$x # p256_sub(R, S2, S1);
1441
1442 or $acc5, $acc4 # see if result is zero
1443 movdqa %xmm4, %xmm2
1444 or $acc0, $acc4
1445 or $acc1, $acc4
1446 por %xmm5, %xmm2 # in1infty || in2infty
1447 movq $acc4, %xmm3
1448
1449 `&load_for_mul("$Z2sqr(%rsp)", "$in1_x(%rsp)", "$src0")`
1450 lea $U1(%rsp), $r_ptr # U1 = X1*Z2^2
1451 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U1, in1_x, Z2sqr);
1452
1453 `&load_for_mul("$Z1sqr(%rsp)", "$in2_x(%rsp)", "$src0")`
1454 lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2
1455 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in2_x, Z1sqr);
1456
1457 lea $U1(%rsp), $b_ptr
1458 lea $H(%rsp), $r_ptr # H = U2 - U1
1459 call __ecp_nistz256_sub_from$x # p256_sub(H, U2, U1);
1460
1461 or $acc5, $acc4 # see if result is zero
1462 or $acc0, $acc4
1463 or $acc1, $acc4
1464
1465 .byte 0x3e # predict taken
1466 jnz .Ladd_proceed$x # is_equal(U1,U2)?
1467 movq %xmm2, $acc0
1468 movq %xmm3, $acc1
1469 test $acc0, $acc0
1470 jnz .Ladd_proceed$x # (in1infty || in2infty)?
1471 test $acc1, $acc1
1472 jz .Ladd_double$x # is_equal(S1,S2)?
1473
1474 movq %xmm0, $r_ptr # restore $r_ptr
1475 pxor %xmm0, %xmm0
1476 movdqu %xmm0, 0x00($r_ptr)
1477 movdqu %xmm0, 0x10($r_ptr)
1478 movdqu %xmm0, 0x20($r_ptr)
1479 movdqu %xmm0, 0x30($r_ptr)
1480 movdqu %xmm0, 0x40($r_ptr)
1481 movdqu %xmm0, 0x50($r_ptr)
1482 jmp .Ladd_done$x
1483
1484.align 32
1485.Ladd_double$x:
1486 movq %xmm1, $a_ptr # restore $a_ptr
1487 movq %xmm0, $r_ptr # restore $r_ptr
1488 add \$`32*(18-5)`, %rsp # difference in frame sizes
1489 jmp .Lpoint_double_shortcut$x
1490
1491.align 32
1492.Ladd_proceed$x:
1493 `&load_for_sqr("$R(%rsp)", "$src0")`
1494 lea $Rsqr(%rsp), $r_ptr # R^2
1495 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R);
1496
1497 `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")`
1498 lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2
1499 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z);
1500
1501 `&load_for_sqr("$H(%rsp)", "$src0")`
1502 lea $Hsqr(%rsp), $r_ptr # H^2
1503 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H);
1504
1505 `&load_for_mul("$res_z(%rsp)", "$in2_z(%rsp)", "$src0")`
1506 lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2
1507 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, res_z, in2_z);
1508
1509 `&load_for_mul("$Hsqr(%rsp)", "$H(%rsp)", "$src0")`
1510 lea $Hcub(%rsp), $r_ptr # H^3
1511 call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H);
1512
1513 `&load_for_mul("$Hsqr(%rsp)", "$U1(%rsp)", "$src0")`
1514 lea $U2(%rsp), $r_ptr # U1*H^2
1515 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, U1, Hsqr);
1516___
1517{
1518#######################################################################
1519# operate in 4-5-0-1 "name space" that matches multiplication output
1520#
1521my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3);
1522my ($poly1, $poly3)=($acc6,$acc7);
1523
1524$code.=<<___;
1525 #lea $U2(%rsp), $a_ptr
1526 #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2
1527 #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2);
1528
1529 add $acc0, $acc0 # a0:a3+a0:a3
1530 lea $Rsqr(%rsp), $a_ptr
1531 adc $acc1, $acc1
1532 mov $acc0, $t0
1533 adc $acc2, $acc2
1534 adc $acc3, $acc3
1535 mov $acc1, $t1
1536 sbb $t4, $t4
1537
1538 sub \$-1, $acc0
1539 mov $acc2, $t2
1540 sbb $poly1, $acc1
1541 sbb \$0, $acc2
1542 mov $acc3, $t3
1543 sbb $poly3, $acc3
1544 test $t4, $t4
1545
1546 cmovz $t0, $acc0
1547 mov 8*0($a_ptr), $t0
1548 cmovz $t1, $acc1
1549 mov 8*1($a_ptr), $t1
1550 cmovz $t2, $acc2
1551 mov 8*2($a_ptr), $t2
1552 cmovz $t3, $acc3
1553 mov 8*3($a_ptr), $t3
1554
1555 call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr);
1556
1557 lea $Hcub(%rsp), $b_ptr
1558 lea $res_x(%rsp), $r_ptr
1559 call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub);
1560
1561 mov $U2+8*0(%rsp), $t0
1562 mov $U2+8*1(%rsp), $t1
1563 mov $U2+8*2(%rsp), $t2
1564 mov $U2+8*3(%rsp), $t3
1565 lea $res_y(%rsp), $r_ptr
1566
1567 call __ecp_nistz256_sub$x # p256_sub(res_y, U2, res_x);
1568
1569 mov $acc0, 8*0($r_ptr) # save the result, as
1570 mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't
1571 mov $acc2, 8*2($r_ptr)
1572 mov $acc3, 8*3($r_ptr)
1573___
1574}
1575$code.=<<___;
1576 `&load_for_mul("$S1(%rsp)", "$Hcub(%rsp)", "$src0")`
1577 lea $S2(%rsp), $r_ptr
1578 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S1, Hcub);
1579
1580 `&load_for_mul("$R(%rsp)", "$res_y(%rsp)", "$src0")`
1581 lea $res_y(%rsp), $r_ptr
1582 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_y, R, res_y);
1583
1584 lea $S2(%rsp), $b_ptr
1585 lea $res_y(%rsp), $r_ptr
1586 call __ecp_nistz256_sub_from$x # p256_sub(res_y, res_y, S2);
1587
1588 movq %xmm0, $r_ptr # restore $r_ptr
1589
1590 movdqa %xmm5, %xmm0 # copy_conditional(res_z, in2_z, in1infty);
1591 movdqa %xmm5, %xmm1
1592 pandn $res_z(%rsp), %xmm0
1593 movdqa %xmm5, %xmm2
1594 pandn $res_z+0x10(%rsp), %xmm1
1595 movdqa %xmm5, %xmm3
1596 pand $in2_z(%rsp), %xmm2
1597 pand $in2_z+0x10(%rsp), %xmm3
1598 por %xmm0, %xmm2
1599 por %xmm1, %xmm3
1600
1601 movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty);
1602 movdqa %xmm4, %xmm1
1603 pandn %xmm2, %xmm0
1604 movdqa %xmm4, %xmm2
1605 pandn %xmm3, %xmm1
1606 movdqa %xmm4, %xmm3
1607 pand $in1_z(%rsp), %xmm2
1608 pand $in1_z+0x10(%rsp), %xmm3
1609 por %xmm0, %xmm2
1610 por %xmm1, %xmm3
1611 movdqu %xmm2, 0x40($r_ptr)
1612 movdqu %xmm3, 0x50($r_ptr)
1613
1614 movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty);
1615 movdqa %xmm5, %xmm1
1616 pandn $res_x(%rsp), %xmm0
1617 movdqa %xmm5, %xmm2
1618 pandn $res_x+0x10(%rsp), %xmm1
1619 movdqa %xmm5, %xmm3
1620 pand $in2_x(%rsp), %xmm2
1621 pand $in2_x+0x10(%rsp), %xmm3
1622 por %xmm0, %xmm2
1623 por %xmm1, %xmm3
1624
1625 movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty);
1626 movdqa %xmm4, %xmm1
1627 pandn %xmm2, %xmm0
1628 movdqa %xmm4, %xmm2
1629 pandn %xmm3, %xmm1
1630 movdqa %xmm4, %xmm3
1631 pand $in1_x(%rsp), %xmm2
1632 pand $in1_x+0x10(%rsp), %xmm3
1633 por %xmm0, %xmm2
1634 por %xmm1, %xmm3
1635 movdqu %xmm2, 0x00($r_ptr)
1636 movdqu %xmm3, 0x10($r_ptr)
1637
1638 movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty);
1639 movdqa %xmm5, %xmm1
1640 pandn $res_y(%rsp), %xmm0
1641 movdqa %xmm5, %xmm2
1642 pandn $res_y+0x10(%rsp), %xmm1
1643 movdqa %xmm5, %xmm3
1644 pand $in2_y(%rsp), %xmm2
1645 pand $in2_y+0x10(%rsp), %xmm3
1646 por %xmm0, %xmm2
1647 por %xmm1, %xmm3
1648
1649 movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty);
1650 movdqa %xmm4, %xmm1
1651 pandn %xmm2, %xmm0
1652 movdqa %xmm4, %xmm2
1653 pandn %xmm3, %xmm1
1654 movdqa %xmm4, %xmm3
1655 pand $in1_y(%rsp), %xmm2
1656 pand $in1_y+0x10(%rsp), %xmm3
1657 por %xmm0, %xmm2
1658 por %xmm1, %xmm3
1659 movdqu %xmm2, 0x20($r_ptr)
1660 movdqu %xmm3, 0x30($r_ptr)
1661
1662.Ladd_done$x:
1663 add \$32*18+8, %rsp
1664 pop %r15
1665 pop %r14
1666 pop %r13
1667 pop %r12
1668 pop %rbx
1669 pop %rbp
1670 ret
1671.size ecp_nistz256_point_add$sfx,.-ecp_nistz256_point_add$sfx
1672___
1673}
1674&gen_add("q");
1675
1676sub gen_add_affine () {
1677 my $x = shift;
1678 my ($src0,$sfx,$bias);
1679 my ($U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr,
1680 $res_x,$res_y,$res_z,
1681 $in1_x,$in1_y,$in1_z,
1682 $in2_x,$in2_y)=map(32*$_,(0..14));
1683 my $Z1sqr = $S2;
1684
1685 if ($x ne "x") {
1686 $src0 = "%rax";
1687 $sfx = "";
1688 $bias = 0;
1689
1690$code.=<<___;
1691.globl ecp_nistz256_point_add_affine
1692.type ecp_nistz256_point_add_affine,\@function,3
1693.align 32
1694ecp_nistz256_point_add_affine:
1695___
1696 } else {
1697 $src0 = "%rdx";
1698 $sfx = "x";
1699 $bias = 128;
1700 }
1701$code.=<<___;
1702 push %rbp
1703 push %rbx
1704 push %r12
1705 push %r13
1706 push %r14
1707 push %r15
1708 sub \$32*15+8, %rsp
1709
1710 movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr
1711 mov $b_org, $b_ptr # reassign
1712 movdqu 0x10($a_ptr), %xmm1
1713 movdqu 0x20($a_ptr), %xmm2
1714 movdqu 0x30($a_ptr), %xmm3
1715 movdqu 0x40($a_ptr), %xmm4
1716 movdqu 0x50($a_ptr), %xmm5
1717 mov 0x40+8*0($a_ptr), $src0 # load original in1_z
1718 mov 0x40+8*1($a_ptr), $acc6
1719 mov 0x40+8*2($a_ptr), $acc7
1720 mov 0x40+8*3($a_ptr), $acc0
1721 movdqa %xmm0, $in1_x(%rsp)
1722 movdqa %xmm1, $in1_x+0x10(%rsp)
1723 por %xmm0, %xmm1
1724 movdqa %xmm2, $in1_y(%rsp)
1725 movdqa %xmm3, $in1_y+0x10(%rsp)
1726 por %xmm2, %xmm3
1727 movdqa %xmm4, $in1_z(%rsp)
1728 movdqa %xmm5, $in1_z+0x10(%rsp)
1729 por %xmm1, %xmm3
1730
1731 movdqu 0x00($b_ptr), %xmm0 # copy *(P256_POINT_AFFINE *)$b_ptr
1732 pshufd \$0xb1, %xmm3, %xmm5
1733 movdqu 0x10($b_ptr), %xmm1
1734 movdqu 0x20($b_ptr), %xmm2
1735 por %xmm3, %xmm5
1736 movdqu 0x30($b_ptr), %xmm3
1737 movdqa %xmm0, $in2_x(%rsp)
1738 pshufd \$0x1e, %xmm5, %xmm4
1739 movdqa %xmm1, $in2_x+0x10(%rsp)
1740 por %xmm0, %xmm1
1741 movq $r_ptr, %xmm0 # save $r_ptr
1742 movdqa %xmm2, $in2_y(%rsp)
1743 movdqa %xmm3, $in2_y+0x10(%rsp)
1744 por %xmm2, %xmm3
1745 por %xmm4, %xmm5
1746 pxor %xmm4, %xmm4
1747 por %xmm1, %xmm3
1748
1749 lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid
1750 lea $Z1sqr(%rsp), $r_ptr # Z1^2
1751 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z);
1752
1753 pcmpeqd %xmm4, %xmm5
1754 pshufd \$0xb1, %xmm3, %xmm4
1755 mov 0x00($b_ptr), $src0 # $b_ptr is still valid
1756 #lea 0x00($b_ptr), $b_ptr
1757 mov $acc4, $acc1 # harmonize sqr output and mul input
1758 por %xmm3, %xmm4
1759 pshufd \$0, %xmm5, %xmm5 # in1infty
1760 pshufd \$0x1e, %xmm4, %xmm3
1761 mov $acc5, $acc2
1762 por %xmm3, %xmm4
1763 pxor %xmm3, %xmm3
1764 mov $acc6, $acc3
1765 pcmpeqd %xmm3, %xmm4
1766 pshufd \$0, %xmm4, %xmm4 # in2infty
1767
1768 lea $Z1sqr-$bias(%rsp), $a_ptr
1769 mov $acc7, $acc4
1770 lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2
1771 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, Z1sqr, in2_x);
1772
1773 lea $in1_x(%rsp), $b_ptr
1774 lea $H(%rsp), $r_ptr # H = U2 - U1
1775 call __ecp_nistz256_sub_from$x # p256_sub(H, U2, in1_x);
1776
1777 `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")`
1778 lea $S2(%rsp), $r_ptr # S2 = Z1^3
1779 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z);
1780
1781 `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")`
1782 lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2
1783 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z);
1784
1785 `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")`
1786 lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3
1787 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y);
1788
1789 lea $in1_y(%rsp), $b_ptr
1790 lea $R(%rsp), $r_ptr # R = S2 - S1
1791 call __ecp_nistz256_sub_from$x # p256_sub(R, S2, in1_y);
1792
1793 `&load_for_sqr("$H(%rsp)", "$src0")`
1794 lea $Hsqr(%rsp), $r_ptr # H^2
1795 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H);
1796
1797 `&load_for_sqr("$R(%rsp)", "$src0")`
1798 lea $Rsqr(%rsp), $r_ptr # R^2
1799 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R);
1800
1801 `&load_for_mul("$H(%rsp)", "$Hsqr(%rsp)", "$src0")`
1802 lea $Hcub(%rsp), $r_ptr # H^3
1803 call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H);
1804
1805 `&load_for_mul("$Hsqr(%rsp)", "$in1_x(%rsp)", "$src0")`
1806 lea $U2(%rsp), $r_ptr # U1*H^2
1807 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in1_x, Hsqr);
1808___
1809{
1810#######################################################################
1811# operate in 4-5-0-1 "name space" that matches multiplication output
1812#
1813my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3);
1814my ($poly1, $poly3)=($acc6,$acc7);
1815
1816$code.=<<___;
1817 #lea $U2(%rsp), $a_ptr
1818 #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2
1819 #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2);
1820
1821 add $acc0, $acc0 # a0:a3+a0:a3
1822 lea $Rsqr(%rsp), $a_ptr
1823 adc $acc1, $acc1
1824 mov $acc0, $t0
1825 adc $acc2, $acc2
1826 adc $acc3, $acc3
1827 mov $acc1, $t1
1828 sbb $t4, $t4
1829
1830 sub \$-1, $acc0
1831 mov $acc2, $t2
1832 sbb $poly1, $acc1
1833 sbb \$0, $acc2
1834 mov $acc3, $t3
1835 sbb $poly3, $acc3
1836 test $t4, $t4
1837
1838 cmovz $t0, $acc0
1839 mov 8*0($a_ptr), $t0
1840 cmovz $t1, $acc1
1841 mov 8*1($a_ptr), $t1
1842 cmovz $t2, $acc2
1843 mov 8*2($a_ptr), $t2
1844 cmovz $t3, $acc3
1845 mov 8*3($a_ptr), $t3
1846
1847 call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr);
1848
1849 lea $Hcub(%rsp), $b_ptr
1850 lea $res_x(%rsp), $r_ptr
1851 call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub);
1852
1853 mov $U2+8*0(%rsp), $t0
1854 mov $U2+8*1(%rsp), $t1
1855 mov $U2+8*2(%rsp), $t2
1856 mov $U2+8*3(%rsp), $t3
1857 lea $H(%rsp), $r_ptr
1858
1859 call __ecp_nistz256_sub$x # p256_sub(H, U2, res_x);
1860
1861 mov $acc0, 8*0($r_ptr) # save the result, as
1862 mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't
1863 mov $acc2, 8*2($r_ptr)
1864 mov $acc3, 8*3($r_ptr)
1865___
1866}
1867$code.=<<___;
1868 `&load_for_mul("$Hcub(%rsp)", "$in1_y(%rsp)", "$src0")`
1869 lea $S2(%rsp), $r_ptr
1870 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Hcub, in1_y);
1871
1872 `&load_for_mul("$H(%rsp)", "$R(%rsp)", "$src0")`
1873 lea $H(%rsp), $r_ptr
1874 call __ecp_nistz256_mul_mont$x # p256_mul_mont(H, H, R);
1875
1876 lea $S2(%rsp), $b_ptr
1877 lea $res_y(%rsp), $r_ptr
1878 call __ecp_nistz256_sub_from$x # p256_sub(res_y, H, S2);
1879
1880 movq %xmm0, $r_ptr # restore $r_ptr
1881
1882 movdqa %xmm5, %xmm0 # copy_conditional(res_z, ONE, in1infty);
1883 movdqa %xmm5, %xmm1
1884 pandn $res_z(%rsp), %xmm0
1885 movdqa %xmm5, %xmm2
1886 pandn $res_z+0x10(%rsp), %xmm1
1887 movdqa %xmm5, %xmm3
1888 pand .LONE_mont(%rip), %xmm2
1889 pand .LONE_mont+0x10(%rip), %xmm3
1890 por %xmm0, %xmm2
1891 por %xmm1, %xmm3
1892
1893 movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty);
1894 movdqa %xmm4, %xmm1
1895 pandn %xmm2, %xmm0
1896 movdqa %xmm4, %xmm2
1897 pandn %xmm3, %xmm1
1898 movdqa %xmm4, %xmm3
1899 pand $in1_z(%rsp), %xmm2
1900 pand $in1_z+0x10(%rsp), %xmm3
1901 por %xmm0, %xmm2
1902 por %xmm1, %xmm3
1903 movdqu %xmm2, 0x40($r_ptr)
1904 movdqu %xmm3, 0x50($r_ptr)
1905
1906 movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty);
1907 movdqa %xmm5, %xmm1
1908 pandn $res_x(%rsp), %xmm0
1909 movdqa %xmm5, %xmm2
1910 pandn $res_x+0x10(%rsp), %xmm1
1911 movdqa %xmm5, %xmm3
1912 pand $in2_x(%rsp), %xmm2
1913 pand $in2_x+0x10(%rsp), %xmm3
1914 por %xmm0, %xmm2
1915 por %xmm1, %xmm3
1916
1917 movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty);
1918 movdqa %xmm4, %xmm1
1919 pandn %xmm2, %xmm0
1920 movdqa %xmm4, %xmm2
1921 pandn %xmm3, %xmm1
1922 movdqa %xmm4, %xmm3
1923 pand $in1_x(%rsp), %xmm2
1924 pand $in1_x+0x10(%rsp), %xmm3
1925 por %xmm0, %xmm2
1926 por %xmm1, %xmm3
1927 movdqu %xmm2, 0x00($r_ptr)
1928 movdqu %xmm3, 0x10($r_ptr)
1929
1930 movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty);
1931 movdqa %xmm5, %xmm1
1932 pandn $res_y(%rsp), %xmm0
1933 movdqa %xmm5, %xmm2
1934 pandn $res_y+0x10(%rsp), %xmm1
1935 movdqa %xmm5, %xmm3
1936 pand $in2_y(%rsp), %xmm2
1937 pand $in2_y+0x10(%rsp), %xmm3
1938 por %xmm0, %xmm2
1939 por %xmm1, %xmm3
1940
1941 movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty);
1942 movdqa %xmm4, %xmm1
1943 pandn %xmm2, %xmm0
1944 movdqa %xmm4, %xmm2
1945 pandn %xmm3, %xmm1
1946 movdqa %xmm4, %xmm3
1947 pand $in1_y(%rsp), %xmm2
1948 pand $in1_y+0x10(%rsp), %xmm3
1949 por %xmm0, %xmm2
1950 por %xmm1, %xmm3
1951 movdqu %xmm2, 0x20($r_ptr)
1952 movdqu %xmm3, 0x30($r_ptr)
1953
1954 add \$32*15+8, %rsp
1955 pop %r15
1956 pop %r14
1957 pop %r13
1958 pop %r12
1959 pop %rbx
1960 pop %rbp
1961 ret
1962.size ecp_nistz256_point_add_affine$sfx,.-ecp_nistz256_point_add_affine$sfx
1963___
1964}
1965&gen_add_affine("q");
1966
1967}}}
1968
1969$code =~ s/\`([^\`]*)\`/eval $1/gem;
1970print $code;
1971close STDOUT;
diff --git a/src/lib/libcrypto/ec/ecp_nistp224.c b/src/lib/libcrypto/ec/ecp_nistp224.c
deleted file mode 100644
index caa4c3facf..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistp224.c
+++ /dev/null
@@ -1,1690 +0,0 @@
1/* $OpenBSD: ecp_nistp224.c,v 1.30 2022/12/26 07:18:51 jmc Exp $ */
2/*
3 * Written by Emilia Kasper (Google) for the OpenSSL project.
4 */
5/*
6 * Copyright (c) 2011 Google Inc.
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21/*
22 * A 64-bit implementation of the NIST P-224 elliptic curve point multiplication
23 *
24 * Inspired by Daniel J. Bernstein's public domain nistp224 implementation
25 * and Adam Langley's public domain 64-bit C implementation of curve25519
26 */
27
28#include <stdint.h>
29#include <string.h>
30
31#include <openssl/opensslconf.h>
32
33#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
34
35#include <openssl/err.h>
36#include "ec_local.h"
37
38#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
39 /* even with gcc, the typedef won't work for 32-bit platforms */
40 typedef __uint128_t uint128_t; /* nonstandard; implemented by gcc on 64-bit platforms */
41#else
42 #error "Need GCC 3.1 or later to define type uint128_t"
43#endif
44
45typedef uint8_t u8;
46typedef uint64_t u64;
47typedef int64_t s64;
48
49
50/******************************************************************************/
51/* INTERNAL REPRESENTATION OF FIELD ELEMENTS
52 *
53 * Field elements are represented as a_0 + 2^56*a_1 + 2^112*a_2 + 2^168*a_3
54 * using 64-bit coefficients called 'limbs',
55 * and sometimes (for multiplication results) as
56 * b_0 + 2^56*b_1 + 2^112*b_2 + 2^168*b_3 + 2^224*b_4 + 2^280*b_5 + 2^336*b_6
57 * using 128-bit coefficients called 'widelimbs'.
58 * A 4-limb representation is an 'felem';
59 * a 7-widelimb representation is a 'widefelem'.
60 * Even within felems, bits of adjacent limbs overlap, and we don't always
61 * reduce the representations: we ensure that inputs to each felem
62 * multiplication satisfy a_i < 2^60, so outputs satisfy b_i < 4*2^60*2^60,
63 * and fit into a 128-bit word without overflow. The coefficients are then
64 * again partially reduced to obtain an felem satisfying a_i < 2^57.
65 * We only reduce to the unique minimal representation at the end of the
66 * computation.
67 */
68
69typedef uint64_t limb;
70typedef uint128_t widelimb;
71
72typedef limb felem[4];
73typedef widelimb widefelem[7];
74
75/* Field element represented as a byte array.
76 * 28*8 = 224 bits is also the group order size for the elliptic curve,
77 * and we also use this type for scalars for point multiplication.
78 */
79typedef u8 felem_bytearray[28];
80
81static const felem_bytearray nistp224_curve_params[5] = {
82 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /* p */
83 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
84 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
85 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /* a */
86 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,
87 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},
88 {0xB4,0x05,0x0A,0x85,0x0C,0x04,0xB3,0xAB,0xF5,0x41, /* b */
89 0x32,0x56,0x50,0x44,0xB0,0xB7,0xD7,0xBF,0xD8,0xBA,
90 0x27,0x0B,0x39,0x43,0x23,0x55,0xFF,0xB4},
91 {0xB7,0x0E,0x0C,0xBD,0x6B,0xB4,0xBF,0x7F,0x32,0x13, /* x */
92 0x90,0xB9,0x4A,0x03,0xC1,0xD3,0x56,0xC2,0x11,0x22,
93 0x34,0x32,0x80,0xD6,0x11,0x5C,0x1D,0x21},
94 {0xbd,0x37,0x63,0x88,0xb5,0xf7,0x23,0xfb,0x4c,0x22, /* y */
95 0xdf,0xe6,0xcd,0x43,0x75,0xa0,0x5a,0x07,0x47,0x64,
96 0x44,0xd5,0x81,0x99,0x85,0x00,0x7e,0x34}
97};
98
99/* Precomputed multiples of the standard generator
100 * Points are given in coordinates (X, Y, Z) where Z normally is 1
101 * (0 for the point at infinity).
102 * For each field element, slice a_0 is word 0, etc.
103 *
104 * The table has 2 * 16 elements, starting with the following:
105 * index | bits | point
106 * ------+---------+------------------------------
107 * 0 | 0 0 0 0 | 0G
108 * 1 | 0 0 0 1 | 1G
109 * 2 | 0 0 1 0 | 2^56G
110 * 3 | 0 0 1 1 | (2^56 + 1)G
111 * 4 | 0 1 0 0 | 2^112G
112 * 5 | 0 1 0 1 | (2^112 + 1)G
113 * 6 | 0 1 1 0 | (2^112 + 2^56)G
114 * 7 | 0 1 1 1 | (2^112 + 2^56 + 1)G
115 * 8 | 1 0 0 0 | 2^168G
116 * 9 | 1 0 0 1 | (2^168 + 1)G
117 * 10 | 1 0 1 0 | (2^168 + 2^56)G
118 * 11 | 1 0 1 1 | (2^168 + 2^56 + 1)G
119 * 12 | 1 1 0 0 | (2^168 + 2^112)G
120 * 13 | 1 1 0 1 | (2^168 + 2^112 + 1)G
121 * 14 | 1 1 1 0 | (2^168 + 2^112 + 2^56)G
122 * 15 | 1 1 1 1 | (2^168 + 2^112 + 2^56 + 1)G
123 * followed by a copy of this with each element multiplied by 2^28.
124 *
125 * The reason for this is so that we can clock bits into four different
126 * locations when doing simple scalar multiplies against the base point,
127 * and then another four locations using the second 16 elements.
128 */
129static const felem gmul[2][16][3] =
130{{{{0, 0, 0, 0},
131 {0, 0, 0, 0},
132 {0, 0, 0, 0}},
133 {{0x3280d6115c1d21, 0xc1d356c2112234, 0x7f321390b94a03, 0xb70e0cbd6bb4bf},
134 {0xd5819985007e34, 0x75a05a07476444, 0xfb4c22dfe6cd43, 0xbd376388b5f723},
135 {1, 0, 0, 0}},
136 {{0xfd9675666ebbe9, 0xbca7664d40ce5e, 0x2242df8d8a2a43, 0x1f49bbb0f99bc5},
137 {0x29e0b892dc9c43, 0xece8608436e662, 0xdc858f185310d0, 0x9812dd4eb8d321},
138 {1, 0, 0, 0}},
139 {{0x6d3e678d5d8eb8, 0x559eed1cb362f1, 0x16e9a3bbce8a3f, 0xeedcccd8c2a748},
140 {0xf19f90ed50266d, 0xabf2b4bf65f9df, 0x313865468fafec, 0x5cb379ba910a17},
141 {1, 0, 0, 0}},
142 {{0x0641966cab26e3, 0x91fb2991fab0a0, 0xefec27a4e13a0b, 0x0499aa8a5f8ebe},
143 {0x7510407766af5d, 0x84d929610d5450, 0x81d77aae82f706, 0x6916f6d4338c5b},
144 {1, 0, 0, 0}},
145 {{0xea95ac3b1f15c6, 0x086000905e82d4, 0xdd323ae4d1c8b1, 0x932b56be7685a3},
146 {0x9ef93dea25dbbf, 0x41665960f390f0, 0xfdec76dbe2a8a7, 0x523e80f019062a},
147 {1, 0, 0, 0}},
148 {{0x822fdd26732c73, 0xa01c83531b5d0f, 0x363f37347c1ba4, 0xc391b45c84725c},
149 {0xbbd5e1b2d6ad24, 0xddfbcde19dfaec, 0xc393da7e222a7f, 0x1efb7890ede244},
150 {1, 0, 0, 0}},
151 {{0x4c9e90ca217da1, 0xd11beca79159bb, 0xff8d33c2c98b7c, 0x2610b39409f849},
152 {0x44d1352ac64da0, 0xcdbb7b2c46b4fb, 0x966c079b753c89, 0xfe67e4e820b112},
153 {1, 0, 0, 0}},
154 {{0xe28cae2df5312d, 0xc71b61d16f5c6e, 0x79b7619a3e7c4c, 0x05c73240899b47},
155 {0x9f7f6382c73e3a, 0x18615165c56bda, 0x641fab2116fd56, 0x72855882b08394},
156 {1, 0, 0, 0}},
157 {{0x0469182f161c09, 0x74a98ca8d00fb5, 0xb89da93489a3e0, 0x41c98768fb0c1d},
158 {0xe5ea05fb32da81, 0x3dce9ffbca6855, 0x1cfe2d3fbf59e6, 0x0e5e03408738a7},
159 {1, 0, 0, 0}},
160 {{0xdab22b2333e87f, 0x4430137a5dd2f6, 0xe03ab9f738beb8, 0xcb0c5d0dc34f24},
161 {0x764a7df0c8fda5, 0x185ba5c3fa2044, 0x9281d688bcbe50, 0xc40331df893881},
162 {1, 0, 0, 0}},
163 {{0xb89530796f0f60, 0xade92bd26909a3, 0x1a0c83fb4884da, 0x1765bf22a5a984},
164 {0x772a9ee75db09e, 0x23bc6c67cec16f, 0x4c1edba8b14e2f, 0xe2a215d9611369},
165 {1, 0, 0, 0}},
166 {{0x571e509fb5efb3, 0xade88696410552, 0xc8ae85fada74fe, 0x6c7e4be83bbde3},
167 {0xff9f51160f4652, 0xb47ce2495a6539, 0xa2946c53b582f4, 0x286d2db3ee9a60},
168 {1, 0, 0, 0}},
169 {{0x40bbd5081a44af, 0x0995183b13926c, 0xbcefba6f47f6d0, 0x215619e9cc0057},
170 {0x8bc94d3b0df45e, 0xf11c54a3694f6f, 0x8631b93cdfe8b5, 0xe7e3f4b0982db9},
171 {1, 0, 0, 0}},
172 {{0xb17048ab3e1c7b, 0xac38f36ff8a1d8, 0x1c29819435d2c6, 0xc813132f4c07e9},
173 {0x2891425503b11f, 0x08781030579fea, 0xf5426ba5cc9674, 0x1e28ebf18562bc},
174 {1, 0, 0, 0}},
175 {{0x9f31997cc864eb, 0x06cd91d28b5e4c, 0xff17036691a973, 0xf1aef351497c58},
176 {0xdd1f2d600564ff, 0xdead073b1402db, 0x74a684435bd693, 0xeea7471f962558},
177 {1, 0, 0, 0}}},
178 {{{0, 0, 0, 0},
179 {0, 0, 0, 0},
180 {0, 0, 0, 0}},
181 {{0x9665266dddf554, 0x9613d78b60ef2d, 0xce27a34cdba417, 0xd35ab74d6afc31},
182 {0x85ccdd22deb15e, 0x2137e5783a6aab, 0xa141cffd8c93c6, 0x355a1830e90f2d},
183 {1, 0, 0, 0}},
184 {{0x1a494eadaade65, 0xd6da4da77fe53c, 0xe7992996abec86, 0x65c3553c6090e3},
185 {0xfa610b1fb09346, 0xf1c6540b8a4aaf, 0xc51a13ccd3cbab, 0x02995b1b18c28a},
186 {1, 0, 0, 0}},
187 {{0x7874568e7295ef, 0x86b419fbe38d04, 0xdc0690a7550d9a, 0xd3966a44beac33},
188 {0x2b7280ec29132f, 0xbeaa3b6a032df3, 0xdc7dd88ae41200, 0xd25e2513e3a100},
189 {1, 0, 0, 0}},
190 {{0x924857eb2efafd, 0xac2bce41223190, 0x8edaa1445553fc, 0x825800fd3562d5},
191 {0x8d79148ea96621, 0x23a01c3dd9ed8d, 0xaf8b219f9416b5, 0xd8db0cc277daea},
192 {1, 0, 0, 0}},
193 {{0x76a9c3b1a700f0, 0xe9acd29bc7e691, 0x69212d1a6b0327, 0x6322e97fe154be},
194 {0x469fc5465d62aa, 0x8d41ed18883b05, 0x1f8eae66c52b88, 0xe4fcbe9325be51},
195 {1, 0, 0, 0}},
196 {{0x825fdf583cac16, 0x020b857c7b023a, 0x683c17744b0165, 0x14ffd0a2daf2f1},
197 {0x323b36184218f9, 0x4944ec4e3b47d4, 0xc15b3080841acf, 0x0bced4b01a28bb},
198 {1, 0, 0, 0}},
199 {{0x92ac22230df5c4, 0x52f33b4063eda8, 0xcb3f19870c0c93, 0x40064f2ba65233},
200 {0xfe16f0924f8992, 0x012da25af5b517, 0x1a57bb24f723a6, 0x06f8bc76760def},
201 {1, 0, 0, 0}},
202 {{0x4a7084f7817cb9, 0xbcab0738ee9a78, 0x3ec11e11d9c326, 0xdc0fe90e0f1aae},
203 {0xcf639ea5f98390, 0x5c350aa22ffb74, 0x9afae98a4047b7, 0x956ec2d617fc45},
204 {1, 0, 0, 0}},
205 {{0x4306d648c1be6a, 0x9247cd8bc9a462, 0xf5595e377d2f2e, 0xbd1c3caff1a52e},
206 {0x045e14472409d0, 0x29f3e17078f773, 0x745a602b2d4f7d, 0x191837685cdfbb},
207 {1, 0, 0, 0}},
208 {{0x5b6ee254a8cb79, 0x4953433f5e7026, 0xe21faeb1d1def4, 0xc4c225785c09de},
209 {0x307ce7bba1e518, 0x31b125b1036db8, 0x47e91868839e8f, 0xc765866e33b9f3},
210 {1, 0, 0, 0}},
211 {{0x3bfece24f96906, 0x4794da641e5093, 0xde5df64f95db26, 0x297ecd89714b05},
212 {0x701bd3ebb2c3aa, 0x7073b4f53cb1d5, 0x13c5665658af16, 0x9895089d66fe58},
213 {1, 0, 0, 0}},
214 {{0x0fef05f78c4790, 0x2d773633b05d2e, 0x94229c3a951c94, 0xbbbd70df4911bb},
215 {0xb2c6963d2c1168, 0x105f47a72b0d73, 0x9fdf6111614080, 0x7b7e94b39e67b0},
216 {1, 0, 0, 0}},
217 {{0xad1a7d6efbe2b3, 0xf012482c0da69d, 0x6b3bdf12438345, 0x40d7558d7aa4d9},
218 {0x8a09fffb5c6d3d, 0x9a356e5d9ffd38, 0x5973f15f4f9b1c, 0xdcd5f59f63c3ea},
219 {1, 0, 0, 0}},
220 {{0xacf39f4c5ca7ab, 0x4c8071cc5fd737, 0xc64e3602cd1184, 0x0acd4644c9abba},
221 {0x6c011a36d8bf6e, 0xfecd87ba24e32a, 0x19f6f56574fad8, 0x050b204ced9405},
222 {1, 0, 0, 0}},
223 {{0xed4f1cae7d9a96, 0x5ceef7ad94c40a, 0x778e4a3bf3ef9b, 0x7405783dc3b55e},
224 {0x32477c61b6e8c6, 0xb46a97570f018b, 0x91176d0a7e95d1, 0x3df90fbc4c7d0e},
225 {1, 0, 0, 0}}}};
226
227/* Precomputation for the group generator. */
228typedef struct {
229 felem g_pre_comp[2][16][3];
230 int references;
231} NISTP224_PRE_COMP;
232
233const EC_METHOD *
234EC_GFp_nistp224_method(void)
235{
236 static const EC_METHOD ret = {
237 .flags = EC_FLAGS_DEFAULT_OCT,
238 .field_type = NID_X9_62_prime_field,
239 .group_init = ec_GFp_nistp224_group_init,
240 .group_finish = ec_GFp_simple_group_finish,
241 .group_clear_finish = ec_GFp_simple_group_clear_finish,
242 .group_copy = ec_GFp_nist_group_copy,
243 .group_set_curve = ec_GFp_nistp224_group_set_curve,
244 .group_get_curve = ec_GFp_simple_group_get_curve,
245 .group_get_degree = ec_GFp_simple_group_get_degree,
246 .group_order_bits = ec_group_simple_order_bits,
247 .group_check_discriminant =
248 ec_GFp_simple_group_check_discriminant,
249 .point_init = ec_GFp_simple_point_init,
250 .point_finish = ec_GFp_simple_point_finish,
251 .point_clear_finish = ec_GFp_simple_point_clear_finish,
252 .point_copy = ec_GFp_simple_point_copy,
253 .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity,
254 .point_set_Jprojective_coordinates =
255 ec_GFp_simple_set_Jprojective_coordinates,
256 .point_get_Jprojective_coordinates =
257 ec_GFp_simple_get_Jprojective_coordinates,
258 .point_set_affine_coordinates =
259 ec_GFp_simple_point_set_affine_coordinates,
260 .point_get_affine_coordinates =
261 ec_GFp_nistp224_point_get_affine_coordinates,
262 .add = ec_GFp_simple_add,
263 .dbl = ec_GFp_simple_dbl,
264 .invert = ec_GFp_simple_invert,
265 .is_at_infinity = ec_GFp_simple_is_at_infinity,
266 .is_on_curve = ec_GFp_simple_is_on_curve,
267 .point_cmp = ec_GFp_simple_cmp,
268 .make_affine = ec_GFp_simple_make_affine,
269 .points_make_affine = ec_GFp_simple_points_make_affine,
270 .mul = ec_GFp_nistp224_points_mul,
271 .precompute_mult = ec_GFp_nistp224_precompute_mult,
272 .have_precompute_mult = ec_GFp_nistp224_have_precompute_mult,
273 .field_mul = ec_GFp_nist_field_mul,
274 .field_sqr = ec_GFp_nist_field_sqr,
275 .blind_coordinates = NULL,
276 };
277
278 return &ret;
279}
280
281/* Helper functions to convert field elements to/from internal representation */
282static void
283bin28_to_felem(felem out, const u8 in[28])
284{
285 out[0] = *((const uint64_t *) (in)) & 0x00ffffffffffffff;
286 out[1] = (*((const uint64_t *) (in + 7))) & 0x00ffffffffffffff;
287 out[2] = (*((const uint64_t *) (in + 14))) & 0x00ffffffffffffff;
288 out[3] = (*((const uint64_t *) (in + 21))) & 0x00ffffffffffffff;
289}
290
291static void
292felem_to_bin28(u8 out[28], const felem in)
293{
294 unsigned i;
295 for (i = 0; i < 7; ++i) {
296 out[i] = in[0] >> (8 * i);
297 out[i + 7] = in[1] >> (8 * i);
298 out[i + 14] = in[2] >> (8 * i);
299 out[i + 21] = in[3] >> (8 * i);
300 }
301}
302
303/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
304static void
305flip_endian(u8 *out, const u8 *in, unsigned len)
306{
307 unsigned i;
308 for (i = 0; i < len; ++i)
309 out[i] = in[len - 1 - i];
310}
311
312/* From OpenSSL BIGNUM to internal representation */
313static int
314BN_to_felem(felem out, const BIGNUM *bn)
315{
316 felem_bytearray b_in;
317 felem_bytearray b_out;
318 unsigned num_bytes;
319
320 /* BN_bn2bin eats leading zeroes */
321 memset(b_out, 0, sizeof b_out);
322 num_bytes = BN_num_bytes(bn);
323 if (num_bytes > sizeof b_out) {
324 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
325 return 0;
326 }
327 if (BN_is_negative(bn)) {
328 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
329 return 0;
330 }
331 num_bytes = BN_bn2bin(bn, b_in);
332 flip_endian(b_out, b_in, num_bytes);
333 bin28_to_felem(out, b_out);
334 return 1;
335}
336
337/* From internal representation to OpenSSL BIGNUM */
338static BIGNUM *
339felem_to_BN(BIGNUM *out, const felem in)
340{
341 felem_bytearray b_in, b_out;
342 felem_to_bin28(b_in, in);
343 flip_endian(b_out, b_in, sizeof b_out);
344 return BN_bin2bn(b_out, sizeof b_out, out);
345}
346
347/******************************************************************************/
348/* FIELD OPERATIONS
349 *
350 * Field operations, using the internal representation of field elements.
351 * NB! These operations are specific to our point multiplication and cannot be
352 * expected to be correct in general - e.g., multiplication with a large scalar
353 * will cause an overflow.
354 *
355 */
356
357static void
358felem_one(felem out)
359{
360 out[0] = 1;
361 out[1] = 0;
362 out[2] = 0;
363 out[3] = 0;
364}
365
366static void
367felem_assign(felem out, const felem in)
368{
369 out[0] = in[0];
370 out[1] = in[1];
371 out[2] = in[2];
372 out[3] = in[3];
373}
374
375/* Sum two field elements: out += in */
376static void
377felem_sum(felem out, const felem in)
378{
379 out[0] += in[0];
380 out[1] += in[1];
381 out[2] += in[2];
382 out[3] += in[3];
383}
384
385/* Get negative value: out = -in */
386/* Assumes in[i] < 2^57 */
387static void
388felem_neg(felem out, const felem in)
389{
390 static const limb two58p2 = (((limb) 1) << 58) + (((limb) 1) << 2);
391 static const limb two58m2 = (((limb) 1) << 58) - (((limb) 1) << 2);
392 static const limb two58m42m2 = (((limb) 1) << 58) -
393 (((limb) 1) << 42) - (((limb) 1) << 2);
394
395 /* Set to 0 mod 2^224-2^96+1 to ensure out > in */
396 out[0] = two58p2 - in[0];
397 out[1] = two58m42m2 - in[1];
398 out[2] = two58m2 - in[2];
399 out[3] = two58m2 - in[3];
400}
401
402/* Subtract field elements: out -= in */
403/* Assumes in[i] < 2^57 */
404static void
405felem_diff(felem out, const felem in)
406{
407 static const limb two58p2 = (((limb) 1) << 58) + (((limb) 1) << 2);
408 static const limb two58m2 = (((limb) 1) << 58) - (((limb) 1) << 2);
409 static const limb two58m42m2 = (((limb) 1) << 58) -
410 (((limb) 1) << 42) - (((limb) 1) << 2);
411
412 /* Add 0 mod 2^224-2^96+1 to ensure out > in */
413 out[0] += two58p2;
414 out[1] += two58m42m2;
415 out[2] += two58m2;
416 out[3] += two58m2;
417
418 out[0] -= in[0];
419 out[1] -= in[1];
420 out[2] -= in[2];
421 out[3] -= in[3];
422}
423
424/* Subtract in unreduced 128-bit mode: out -= in */
425/* Assumes in[i] < 2^119 */
426static void
427widefelem_diff(widefelem out, const widefelem in)
428{
429 static const widelimb two120 = ((widelimb) 1) << 120;
430 static const widelimb two120m64 = (((widelimb) 1) << 120) -
431 (((widelimb) 1) << 64);
432 static const widelimb two120m104m64 = (((widelimb) 1) << 120) -
433 (((widelimb) 1) << 104) - (((widelimb) 1) << 64);
434
435 /* Add 0 mod 2^224-2^96+1 to ensure out > in */
436 out[0] += two120;
437 out[1] += two120m64;
438 out[2] += two120m64;
439 out[3] += two120;
440 out[4] += two120m104m64;
441 out[5] += two120m64;
442 out[6] += two120m64;
443
444 out[0] -= in[0];
445 out[1] -= in[1];
446 out[2] -= in[2];
447 out[3] -= in[3];
448 out[4] -= in[4];
449 out[5] -= in[5];
450 out[6] -= in[6];
451}
452
453/* Subtract in mixed mode: out128 -= in64 */
454/* in[i] < 2^63 */
455static void
456felem_diff_128_64(widefelem out, const felem in)
457{
458 static const widelimb two64p8 = (((widelimb) 1) << 64) +
459 (((widelimb) 1) << 8);
460 static const widelimb two64m8 = (((widelimb) 1) << 64) -
461 (((widelimb) 1) << 8);
462 static const widelimb two64m48m8 = (((widelimb) 1) << 64) -
463 (((widelimb) 1) << 48) - (((widelimb) 1) << 8);
464
465 /* Add 0 mod 2^224-2^96+1 to ensure out > in */
466 out[0] += two64p8;
467 out[1] += two64m48m8;
468 out[2] += two64m8;
469 out[3] += two64m8;
470
471 out[0] -= in[0];
472 out[1] -= in[1];
473 out[2] -= in[2];
474 out[3] -= in[3];
475}
476
477/* Multiply a field element by a scalar: out = out * scalar
478 * The scalars we actually use are small, so results fit without overflow */
479static void
480felem_scalar(felem out, const limb scalar)
481{
482 out[0] *= scalar;
483 out[1] *= scalar;
484 out[2] *= scalar;
485 out[3] *= scalar;
486}
487
488/* Multiply an unreduced field element by a scalar: out = out * scalar
489 * The scalars we actually use are small, so results fit without overflow */
490static void
491widefelem_scalar(widefelem out, const widelimb scalar)
492{
493 out[0] *= scalar;
494 out[1] *= scalar;
495 out[2] *= scalar;
496 out[3] *= scalar;
497 out[4] *= scalar;
498 out[5] *= scalar;
499 out[6] *= scalar;
500}
501
502/* Square a field element: out = in^2 */
503static void
504felem_square(widefelem out, const felem in)
505{
506 limb tmp0, tmp1, tmp2;
507 tmp0 = 2 * in[0];
508 tmp1 = 2 * in[1];
509 tmp2 = 2 * in[2];
510 out[0] = ((widelimb) in[0]) * in[0];
511 out[1] = ((widelimb) in[0]) * tmp1;
512 out[2] = ((widelimb) in[0]) * tmp2 + ((widelimb) in[1]) * in[1];
513 out[3] = ((widelimb) in[3]) * tmp0 +
514 ((widelimb) in[1]) * tmp2;
515 out[4] = ((widelimb) in[3]) * tmp1 + ((widelimb) in[2]) * in[2];
516 out[5] = ((widelimb) in[3]) * tmp2;
517 out[6] = ((widelimb) in[3]) * in[3];
518}
519
520/* Multiply two field elements: out = in1 * in2 */
521static void
522felem_mul(widefelem out, const felem in1, const felem in2)
523{
524 out[0] = ((widelimb) in1[0]) * in2[0];
525 out[1] = ((widelimb) in1[0]) * in2[1] + ((widelimb) in1[1]) * in2[0];
526 out[2] = ((widelimb) in1[0]) * in2[2] + ((widelimb) in1[1]) * in2[1] +
527 ((widelimb) in1[2]) * in2[0];
528 out[3] = ((widelimb) in1[0]) * in2[3] + ((widelimb) in1[1]) * in2[2] +
529 ((widelimb) in1[2]) * in2[1] + ((widelimb) in1[3]) * in2[0];
530 out[4] = ((widelimb) in1[1]) * in2[3] + ((widelimb) in1[2]) * in2[2] +
531 ((widelimb) in1[3]) * in2[1];
532 out[5] = ((widelimb) in1[2]) * in2[3] + ((widelimb) in1[3]) * in2[2];
533 out[6] = ((widelimb) in1[3]) * in2[3];
534}
535
536/* Reduce seven 128-bit coefficients to four 64-bit coefficients.
537 * Requires in[i] < 2^126,
538 * ensures out[0] < 2^56, out[1] < 2^56, out[2] < 2^56, out[3] <= 2^56 + 2^16 */
539static void
540felem_reduce(felem out, const widefelem in)
541{
542 static const widelimb two127p15 = (((widelimb) 1) << 127) +
543 (((widelimb) 1) << 15);
544 static const widelimb two127m71 = (((widelimb) 1) << 127) -
545 (((widelimb) 1) << 71);
546 static const widelimb two127m71m55 = (((widelimb) 1) << 127) -
547 (((widelimb) 1) << 71) - (((widelimb) 1) << 55);
548 widelimb output[5];
549
550 /* Add 0 mod 2^224-2^96+1 to ensure all differences are positive */
551 output[0] = in[0] + two127p15;
552 output[1] = in[1] + two127m71m55;
553 output[2] = in[2] + two127m71;
554 output[3] = in[3];
555 output[4] = in[4];
556
557 /* Eliminate in[4], in[5], in[6] */
558 output[4] += in[6] >> 16;
559 output[3] += (in[6] & 0xffff) << 40;
560 output[2] -= in[6];
561
562 output[3] += in[5] >> 16;
563 output[2] += (in[5] & 0xffff) << 40;
564 output[1] -= in[5];
565
566 output[2] += output[4] >> 16;
567 output[1] += (output[4] & 0xffff) << 40;
568 output[0] -= output[4];
569
570 /* Carry 2 -> 3 -> 4 */
571 output[3] += output[2] >> 56;
572 output[2] &= 0x00ffffffffffffff;
573
574 output[4] = output[3] >> 56;
575 output[3] &= 0x00ffffffffffffff;
576
577 /* Now output[2] < 2^56, output[3] < 2^56, output[4] < 2^72 */
578
579 /* Eliminate output[4] */
580 output[2] += output[4] >> 16;
581 /* output[2] < 2^56 + 2^56 = 2^57 */
582 output[1] += (output[4] & 0xffff) << 40;
583 output[0] -= output[4];
584
585 /* Carry 0 -> 1 -> 2 -> 3 */
586 output[1] += output[0] >> 56;
587 out[0] = output[0] & 0x00ffffffffffffff;
588
589 output[2] += output[1] >> 56;
590 /* output[2] < 2^57 + 2^72 */
591 out[1] = output[1] & 0x00ffffffffffffff;
592 output[3] += output[2] >> 56;
593 /* output[3] <= 2^56 + 2^16 */
594 out[2] = output[2] & 0x00ffffffffffffff;
595
596 /*
597 * out[0] < 2^56, out[1] < 2^56, out[2] < 2^56, out[3] <= 2^56 + 2^16
598 * (due to final carry), so out < 2*p
599 */
600 out[3] = output[3];
601}
602
603static void
604felem_square_reduce(felem out, const felem in)
605{
606 widefelem tmp;
607 felem_square(tmp, in);
608 felem_reduce(out, tmp);
609}
610
611static void
612felem_mul_reduce(felem out, const felem in1, const felem in2)
613{
614 widefelem tmp;
615 felem_mul(tmp, in1, in2);
616 felem_reduce(out, tmp);
617}
618
619/* Reduce to unique minimal representation.
620 * Requires 0 <= in < 2*p (always call felem_reduce first) */
621static void
622felem_contract(felem out, const felem in)
623{
624 static const int64_t two56 = ((limb) 1) << 56;
625 /* 0 <= in < 2*p, p = 2^224 - 2^96 + 1 */
626 /* if in > p , reduce in = in - 2^224 + 2^96 - 1 */
627 int64_t tmp[4], a;
628 tmp[0] = in[0];
629 tmp[1] = in[1];
630 tmp[2] = in[2];
631 tmp[3] = in[3];
632 /* Case 1: a = 1 iff in >= 2^224 */
633 a = (in[3] >> 56);
634 tmp[0] -= a;
635 tmp[1] += a << 40;
636 tmp[3] &= 0x00ffffffffffffff;
637 /*
638 * Case 2: a = 0 iff p <= in < 2^224, i.e., the high 128 bits are all
639 * 1 and the lower part is non-zero
640 */
641 a = ((in[3] & in[2] & (in[1] | 0x000000ffffffffff)) + 1) |
642 (((int64_t) (in[0] + (in[1] & 0x000000ffffffffff)) - 1) >> 63);
643 a &= 0x00ffffffffffffff;
644 /* turn a into an all-one mask (if a = 0) or an all-zero mask */
645 a = (a - 1) >> 63;
646 /* subtract 2^224 - 2^96 + 1 if a is all-one */
647 tmp[3] &= a ^ 0xffffffffffffffff;
648 tmp[2] &= a ^ 0xffffffffffffffff;
649 tmp[1] &= (a ^ 0xffffffffffffffff) | 0x000000ffffffffff;
650 tmp[0] -= 1 & a;
651
652 /*
653 * eliminate negative coefficients: if tmp[0] is negative, tmp[1]
654 * must be non-zero, so we only need one step
655 */
656 a = tmp[0] >> 63;
657 tmp[0] += two56 & a;
658 tmp[1] -= 1 & a;
659
660 /* carry 1 -> 2 -> 3 */
661 tmp[2] += tmp[1] >> 56;
662 tmp[1] &= 0x00ffffffffffffff;
663
664 tmp[3] += tmp[2] >> 56;
665 tmp[2] &= 0x00ffffffffffffff;
666
667 /* Now 0 <= out < p */
668 out[0] = tmp[0];
669 out[1] = tmp[1];
670 out[2] = tmp[2];
671 out[3] = tmp[3];
672}
673
674/* Zero-check: returns 1 if input is 0, and 0 otherwise.
675 * We know that field elements are reduced to in < 2^225,
676 * so we only need to check three cases: 0, 2^224 - 2^96 + 1,
677 * and 2^225 - 2^97 + 2 */
678static limb
679felem_is_zero(const felem in)
680{
681 limb zero, two224m96p1, two225m97p2;
682
683 zero = in[0] | in[1] | in[2] | in[3];
684 zero = (((int64_t) (zero) - 1) >> 63) & 1;
685 two224m96p1 = (in[0] ^ 1) | (in[1] ^ 0x00ffff0000000000)
686 | (in[2] ^ 0x00ffffffffffffff) | (in[3] ^ 0x00ffffffffffffff);
687 two224m96p1 = (((int64_t) (two224m96p1) - 1) >> 63) & 1;
688 two225m97p2 = (in[0] ^ 2) | (in[1] ^ 0x00fffe0000000000)
689 | (in[2] ^ 0x00ffffffffffffff) | (in[3] ^ 0x01ffffffffffffff);
690 two225m97p2 = (((int64_t) (two225m97p2) - 1) >> 63) & 1;
691 return (zero | two224m96p1 | two225m97p2);
692}
693
694static limb
695felem_is_zero_int(const felem in)
696{
697 return (int) (felem_is_zero(in) & ((limb) 1));
698}
699
700/* Invert a field element */
701/* Computation chain copied from djb's code */
702static void
703felem_inv(felem out, const felem in)
704{
705 felem ftmp, ftmp2, ftmp3, ftmp4;
706 widefelem tmp;
707 unsigned i;
708
709 felem_square(tmp, in);
710 felem_reduce(ftmp, tmp);/* 2 */
711 felem_mul(tmp, in, ftmp);
712 felem_reduce(ftmp, tmp);/* 2^2 - 1 */
713 felem_square(tmp, ftmp);
714 felem_reduce(ftmp, tmp);/* 2^3 - 2 */
715 felem_mul(tmp, in, ftmp);
716 felem_reduce(ftmp, tmp);/* 2^3 - 1 */
717 felem_square(tmp, ftmp);
718 felem_reduce(ftmp2, tmp); /* 2^4 - 2 */
719 felem_square(tmp, ftmp2);
720 felem_reduce(ftmp2, tmp); /* 2^5 - 4 */
721 felem_square(tmp, ftmp2);
722 felem_reduce(ftmp2, tmp); /* 2^6 - 8 */
723 felem_mul(tmp, ftmp2, ftmp);
724 felem_reduce(ftmp, tmp);/* 2^6 - 1 */
725 felem_square(tmp, ftmp);
726 felem_reduce(ftmp2, tmp); /* 2^7 - 2 */
727 for (i = 0; i < 5; ++i) { /* 2^12 - 2^6 */
728 felem_square(tmp, ftmp2);
729 felem_reduce(ftmp2, tmp);
730 }
731 felem_mul(tmp, ftmp2, ftmp);
732 felem_reduce(ftmp2, tmp); /* 2^12 - 1 */
733 felem_square(tmp, ftmp2);
734 felem_reduce(ftmp3, tmp); /* 2^13 - 2 */
735 for (i = 0; i < 11; ++i) { /* 2^24 - 2^12 */
736 felem_square(tmp, ftmp3);
737 felem_reduce(ftmp3, tmp);
738 }
739 felem_mul(tmp, ftmp3, ftmp2);
740 felem_reduce(ftmp2, tmp); /* 2^24 - 1 */
741 felem_square(tmp, ftmp2);
742 felem_reduce(ftmp3, tmp); /* 2^25 - 2 */
743 for (i = 0; i < 23; ++i) { /* 2^48 - 2^24 */
744 felem_square(tmp, ftmp3);
745 felem_reduce(ftmp3, tmp);
746 }
747 felem_mul(tmp, ftmp3, ftmp2);
748 felem_reduce(ftmp3, tmp); /* 2^48 - 1 */
749 felem_square(tmp, ftmp3);
750 felem_reduce(ftmp4, tmp); /* 2^49 - 2 */
751 for (i = 0; i < 47; ++i) { /* 2^96 - 2^48 */
752 felem_square(tmp, ftmp4);
753 felem_reduce(ftmp4, tmp);
754 }
755 felem_mul(tmp, ftmp3, ftmp4);
756 felem_reduce(ftmp3, tmp); /* 2^96 - 1 */
757 felem_square(tmp, ftmp3);
758 felem_reduce(ftmp4, tmp); /* 2^97 - 2 */
759 for (i = 0; i < 23; ++i) { /* 2^120 - 2^24 */
760 felem_square(tmp, ftmp4);
761 felem_reduce(ftmp4, tmp);
762 }
763 felem_mul(tmp, ftmp2, ftmp4);
764 felem_reduce(ftmp2, tmp); /* 2^120 - 1 */
765 for (i = 0; i < 6; ++i) { /* 2^126 - 2^6 */
766 felem_square(tmp, ftmp2);
767 felem_reduce(ftmp2, tmp);
768 }
769 felem_mul(tmp, ftmp2, ftmp);
770 felem_reduce(ftmp, tmp);/* 2^126 - 1 */
771 felem_square(tmp, ftmp);
772 felem_reduce(ftmp, tmp);/* 2^127 - 2 */
773 felem_mul(tmp, ftmp, in);
774 felem_reduce(ftmp, tmp);/* 2^127 - 1 */
775 for (i = 0; i < 97; ++i) { /* 2^224 - 2^97 */
776 felem_square(tmp, ftmp);
777 felem_reduce(ftmp, tmp);
778 }
779 felem_mul(tmp, ftmp, ftmp3);
780 felem_reduce(out, tmp); /* 2^224 - 2^96 - 1 */
781}
782
783/* Copy in constant time:
784 * if icopy == 1, copy in to out,
785 * if icopy == 0, copy out to itself. */
786static void
787copy_conditional(felem out, const felem in, limb icopy)
788{
789 unsigned i;
790 /* icopy is a (64-bit) 0 or 1, so copy is either all-zero or all-one */
791 const limb copy = -icopy;
792 for (i = 0; i < 4; ++i) {
793 const limb tmp = copy & (in[i] ^ out[i]);
794 out[i] ^= tmp;
795 }
796}
797
798/******************************************************************************/
799/* ELLIPTIC CURVE POINT OPERATIONS
800 *
801 * Points are represented in Jacobian projective coordinates:
802 * (X, Y, Z) corresponds to the affine point (X/Z^2, Y/Z^3),
803 * or to the point at infinity if Z == 0.
804 *
805 */
806
807/* Double an elliptic curve point:
808 * (X', Y', Z') = 2 * (X, Y, Z), where
809 * X' = (3 * (X - Z^2) * (X + Z^2))^2 - 8 * X * Y^2
810 * Y' = 3 * (X - Z^2) * (X + Z^2) * (4 * X * Y^2 - X') - 8 * Y^2
811 * Z' = (Y + Z)^2 - Y^2 - Z^2 = 2 * Y * Z
812 * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed,
813 * while x_out == y_in is not (maybe this works, but it's not tested). */
814static void
815point_double(felem x_out, felem y_out, felem z_out,
816 const felem x_in, const felem y_in, const felem z_in)
817{
818 widefelem tmp, tmp2;
819 felem delta, gamma, beta, alpha, ftmp, ftmp2;
820
821 felem_assign(ftmp, x_in);
822 felem_assign(ftmp2, x_in);
823
824 /* delta = z^2 */
825 felem_square(tmp, z_in);
826 felem_reduce(delta, tmp);
827
828 /* gamma = y^2 */
829 felem_square(tmp, y_in);
830 felem_reduce(gamma, tmp);
831
832 /* beta = x*gamma */
833 felem_mul(tmp, x_in, gamma);
834 felem_reduce(beta, tmp);
835
836 /* alpha = 3*(x-delta)*(x+delta) */
837 felem_diff(ftmp, delta);
838 /* ftmp[i] < 2^57 + 2^58 + 2 < 2^59 */
839 felem_sum(ftmp2, delta);
840 /* ftmp2[i] < 2^57 + 2^57 = 2^58 */
841 felem_scalar(ftmp2, 3);
842 /* ftmp2[i] < 3 * 2^58 < 2^60 */
843 felem_mul(tmp, ftmp, ftmp2);
844 /* tmp[i] < 2^60 * 2^59 * 4 = 2^121 */
845 felem_reduce(alpha, tmp);
846
847 /* x' = alpha^2 - 8*beta */
848 felem_square(tmp, alpha);
849 /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
850 felem_assign(ftmp, beta);
851 felem_scalar(ftmp, 8);
852 /* ftmp[i] < 8 * 2^57 = 2^60 */
853 felem_diff_128_64(tmp, ftmp);
854 /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
855 felem_reduce(x_out, tmp);
856
857 /* z' = (y + z)^2 - gamma - delta */
858 felem_sum(delta, gamma);
859 /* delta[i] < 2^57 + 2^57 = 2^58 */
860 felem_assign(ftmp, y_in);
861 felem_sum(ftmp, z_in);
862 /* ftmp[i] < 2^57 + 2^57 = 2^58 */
863 felem_square(tmp, ftmp);
864 /* tmp[i] < 4 * 2^58 * 2^58 = 2^118 */
865 felem_diff_128_64(tmp, delta);
866 /* tmp[i] < 2^118 + 2^64 + 8 < 2^119 */
867 felem_reduce(z_out, tmp);
868
869 /* y' = alpha*(4*beta - x') - 8*gamma^2 */
870 felem_scalar(beta, 4);
871 /* beta[i] < 4 * 2^57 = 2^59 */
872 felem_diff(beta, x_out);
873 /* beta[i] < 2^59 + 2^58 + 2 < 2^60 */
874 felem_mul(tmp, alpha, beta);
875 /* tmp[i] < 4 * 2^57 * 2^60 = 2^119 */
876 felem_square(tmp2, gamma);
877 /* tmp2[i] < 4 * 2^57 * 2^57 = 2^116 */
878 widefelem_scalar(tmp2, 8);
879 /* tmp2[i] < 8 * 2^116 = 2^119 */
880 widefelem_diff(tmp, tmp2);
881 /* tmp[i] < 2^119 + 2^120 < 2^121 */
882 felem_reduce(y_out, tmp);
883}
884
885/* Add two elliptic curve points:
886 * (X_1, Y_1, Z_1) + (X_2, Y_2, Z_2) = (X_3, Y_3, Z_3), where
887 * X_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1)^2 - (Z_1^2 * X_2 - Z_2^2 * X_1)^3 -
888 * 2 * Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2
889 * Y_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1) * (Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2 - X_3) -
890 * Z_2^3 * Y_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^3
891 * Z_3 = (Z_1^2 * X_2 - Z_2^2 * X_1) * (Z_1 * Z_2)
892 *
893 * This runs faster if 'mixed' is set, which requires Z_2 = 1 or Z_2 = 0.
894 */
895
896/* This function is not entirely constant-time:
897 * it includes a branch for checking whether the two input points are equal,
898 * (while not equal to the point at infinity).
899 * This case never happens during single point multiplication,
900 * so there is no timing leak for ECDH or ECDSA signing. */
901static void
902point_add(felem x3, felem y3, felem z3,
903 const felem x1, const felem y1, const felem z1,
904 const int mixed, const felem x2, const felem y2, const felem z2)
905{
906 felem ftmp, ftmp2, ftmp3, ftmp4, ftmp5, x_out, y_out, z_out;
907 widefelem tmp, tmp2;
908 limb z1_is_zero, z2_is_zero, x_equal, y_equal;
909
910 if (!mixed) {
911 /* ftmp2 = z2^2 */
912 felem_square(tmp, z2);
913 felem_reduce(ftmp2, tmp);
914
915 /* ftmp4 = z2^3 */
916 felem_mul(tmp, ftmp2, z2);
917 felem_reduce(ftmp4, tmp);
918
919 /* ftmp4 = z2^3*y1 */
920 felem_mul(tmp2, ftmp4, y1);
921 felem_reduce(ftmp4, tmp2);
922
923 /* ftmp2 = z2^2*x1 */
924 felem_mul(tmp2, ftmp2, x1);
925 felem_reduce(ftmp2, tmp2);
926 } else {
927 /* We'll assume z2 = 1 (special case z2 = 0 is handled later) */
928
929 /* ftmp4 = z2^3*y1 */
930 felem_assign(ftmp4, y1);
931
932 /* ftmp2 = z2^2*x1 */
933 felem_assign(ftmp2, x1);
934 }
935
936 /* ftmp = z1^2 */
937 felem_square(tmp, z1);
938 felem_reduce(ftmp, tmp);
939
940 /* ftmp3 = z1^3 */
941 felem_mul(tmp, ftmp, z1);
942 felem_reduce(ftmp3, tmp);
943
944 /* tmp = z1^3*y2 */
945 felem_mul(tmp, ftmp3, y2);
946 /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
947
948 /* ftmp3 = z1^3*y2 - z2^3*y1 */
949 felem_diff_128_64(tmp, ftmp4);
950 /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
951 felem_reduce(ftmp3, tmp);
952
953 /* tmp = z1^2*x2 */
954 felem_mul(tmp, ftmp, x2);
955 /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
956
957 /* ftmp = z1^2*x2 - z2^2*x1 */
958 felem_diff_128_64(tmp, ftmp2);
959 /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
960 felem_reduce(ftmp, tmp);
961
962 /*
963 * the formulae are incorrect if the points are equal so we check for
964 * this and do doubling if this happens
965 */
966 x_equal = felem_is_zero(ftmp);
967 y_equal = felem_is_zero(ftmp3);
968 z1_is_zero = felem_is_zero(z1);
969 z2_is_zero = felem_is_zero(z2);
970 /* In affine coordinates, (X_1, Y_1) == (X_2, Y_2) */
971 if (x_equal && y_equal && !z1_is_zero && !z2_is_zero) {
972 point_double(x3, y3, z3, x1, y1, z1);
973 return;
974 }
975 /* ftmp5 = z1*z2 */
976 if (!mixed) {
977 felem_mul(tmp, z1, z2);
978 felem_reduce(ftmp5, tmp);
979 } else {
980 /* special case z2 = 0 is handled later */
981 felem_assign(ftmp5, z1);
982 }
983
984 /* z_out = (z1^2*x2 - z2^2*x1)*(z1*z2) */
985 felem_mul(tmp, ftmp, ftmp5);
986 felem_reduce(z_out, tmp);
987
988 /* ftmp = (z1^2*x2 - z2^2*x1)^2 */
989 felem_assign(ftmp5, ftmp);
990 felem_square(tmp, ftmp);
991 felem_reduce(ftmp, tmp);
992
993 /* ftmp5 = (z1^2*x2 - z2^2*x1)^3 */
994 felem_mul(tmp, ftmp, ftmp5);
995 felem_reduce(ftmp5, tmp);
996
997 /* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
998 felem_mul(tmp, ftmp2, ftmp);
999 felem_reduce(ftmp2, tmp);
1000
1001 /* tmp = z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
1002 felem_mul(tmp, ftmp4, ftmp5);
1003 /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
1004
1005 /* tmp2 = (z1^3*y2 - z2^3*y1)^2 */
1006 felem_square(tmp2, ftmp3);
1007 /* tmp2[i] < 4 * 2^57 * 2^57 < 2^116 */
1008
1009 /* tmp2 = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 */
1010 felem_diff_128_64(tmp2, ftmp5);
1011 /* tmp2[i] < 2^116 + 2^64 + 8 < 2^117 */
1012
1013 /* ftmp5 = 2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
1014 felem_assign(ftmp5, ftmp2);
1015 felem_scalar(ftmp5, 2);
1016 /* ftmp5[i] < 2 * 2^57 = 2^58 */
1017
1018 /*
1019 * x_out = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 -
1020 * 2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2
1021 */
1022 felem_diff_128_64(tmp2, ftmp5);
1023 /* tmp2[i] < 2^117 + 2^64 + 8 < 2^118 */
1024 felem_reduce(x_out, tmp2);
1025
1026 /* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - x_out */
1027 felem_diff(ftmp2, x_out);
1028 /* ftmp2[i] < 2^57 + 2^58 + 2 < 2^59 */
1029
1030 /* tmp2 = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - x_out) */
1031 felem_mul(tmp2, ftmp3, ftmp2);
1032 /* tmp2[i] < 4 * 2^57 * 2^59 = 2^118 */
1033
1034 /*
1035 * y_out = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 -
1036 * x_out) - z2^3*y1*(z1^2*x2 - z2^2*x1)^3
1037 */
1038 widefelem_diff(tmp2, tmp);
1039 /* tmp2[i] < 2^118 + 2^120 < 2^121 */
1040 felem_reduce(y_out, tmp2);
1041
1042 /*
1043 * the result (x_out, y_out, z_out) is incorrect if one of the inputs
1044 * is the point at infinity, so we need to check for this separately
1045 */
1046
1047 /* if point 1 is at infinity, copy point 2 to output, and vice versa */
1048 copy_conditional(x_out, x2, z1_is_zero);
1049 copy_conditional(x_out, x1, z2_is_zero);
1050 copy_conditional(y_out, y2, z1_is_zero);
1051 copy_conditional(y_out, y1, z2_is_zero);
1052 copy_conditional(z_out, z2, z1_is_zero);
1053 copy_conditional(z_out, z1, z2_is_zero);
1054 felem_assign(x3, x_out);
1055 felem_assign(y3, y_out);
1056 felem_assign(z3, z_out);
1057}
1058
1059/* select_point selects the |idx|th point from a precomputation table and
1060 * copies it to out. */
1061static void
1062select_point(const u64 idx, unsigned int size, const felem pre_comp[ /* size */ ][3], felem out[3])
1063{
1064 unsigned i, j;
1065 limb *outlimbs = &out[0][0];
1066 memset(outlimbs, 0, 3 * sizeof(felem));
1067
1068 for (i = 0; i < size; i++) {
1069 const limb *inlimbs = &pre_comp[i][0][0];
1070 u64 mask = i ^ idx;
1071 mask |= mask >> 4;
1072 mask |= mask >> 2;
1073 mask |= mask >> 1;
1074 mask &= 1;
1075 mask--;
1076 for (j = 0; j < 4 * 3; j++)
1077 outlimbs[j] |= inlimbs[j] & mask;
1078 }
1079}
1080
1081/* get_bit returns the |i|th bit in |in| */
1082static char
1083get_bit(const felem_bytearray in, unsigned i)
1084{
1085 if (i >= 224)
1086 return 0;
1087 return (in[i >> 3] >> (i & 7)) & 1;
1088}
1089
1090/* Interleaved point multiplication using precomputed point multiples:
1091 * The small point multiples 0*P, 1*P, ..., 16*P are in pre_comp[],
1092 * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
1093 * of the generator, using certain (large) precomputed multiples in g_pre_comp.
1094 * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
1095static void
1096batch_mul(felem x_out, felem y_out, felem z_out,
1097 const felem_bytearray scalars[], const unsigned num_points, const u8 * g_scalar,
1098 const int mixed, const felem pre_comp[][17][3], const felem g_pre_comp[2][16][3])
1099{
1100 int i, skip;
1101 unsigned num;
1102 unsigned gen_mul = (g_scalar != NULL);
1103 felem nq[3], tmp[4];
1104 u64 bits;
1105 u8 sign, digit;
1106
1107 /* set nq to the point at infinity */
1108 memset(nq, 0, 3 * sizeof(felem));
1109
1110 /*
1111 * Loop over all scalars msb-to-lsb, interleaving additions of
1112 * multiples of the generator (two in each of the last 28 rounds) and
1113 * additions of other points multiples (every 5th round).
1114 */
1115 skip = 1; /* save two point operations in the first
1116 * round */
1117 for (i = (num_points ? 220 : 27); i >= 0; --i) {
1118 /* double */
1119 if (!skip)
1120 point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
1121
1122 /* add multiples of the generator */
1123 if (gen_mul && (i <= 27)) {
1124 /* first, look 28 bits upwards */
1125 bits = get_bit(g_scalar, i + 196) << 3;
1126 bits |= get_bit(g_scalar, i + 140) << 2;
1127 bits |= get_bit(g_scalar, i + 84) << 1;
1128 bits |= get_bit(g_scalar, i + 28);
1129 /* select the point to add, in constant time */
1130 select_point(bits, 16, g_pre_comp[1], tmp);
1131
1132 if (!skip) {
1133 point_add(nq[0], nq[1], nq[2],
1134 nq[0], nq[1], nq[2],
1135 1 /* mixed */ , tmp[0], tmp[1], tmp[2]);
1136 } else {
1137 memcpy(nq, tmp, 3 * sizeof(felem));
1138 skip = 0;
1139 }
1140
1141 /* second, look at the current position */
1142 bits = get_bit(g_scalar, i + 168) << 3;
1143 bits |= get_bit(g_scalar, i + 112) << 2;
1144 bits |= get_bit(g_scalar, i + 56) << 1;
1145 bits |= get_bit(g_scalar, i);
1146 /* select the point to add, in constant time */
1147 select_point(bits, 16, g_pre_comp[0], tmp);
1148 point_add(nq[0], nq[1], nq[2],
1149 nq[0], nq[1], nq[2],
1150 1 /* mixed */ , tmp[0], tmp[1], tmp[2]);
1151 }
1152 /* do other additions every 5 doublings */
1153 if (num_points && (i % 5 == 0)) {
1154 /* loop over all scalars */
1155 for (num = 0; num < num_points; ++num) {
1156 bits = get_bit(scalars[num], i + 4) << 5;
1157 bits |= get_bit(scalars[num], i + 3) << 4;
1158 bits |= get_bit(scalars[num], i + 2) << 3;
1159 bits |= get_bit(scalars[num], i + 1) << 2;
1160 bits |= get_bit(scalars[num], i) << 1;
1161 bits |= get_bit(scalars[num], i - 1);
1162 ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
1163
1164 /* select the point to add or subtract */
1165 select_point(digit, 17, pre_comp[num], tmp);
1166 felem_neg(tmp[3], tmp[1]); /* (X, -Y, Z) is the
1167 * negative point */
1168 copy_conditional(tmp[1], tmp[3], sign);
1169
1170 if (!skip) {
1171 point_add(nq[0], nq[1], nq[2],
1172 nq[0], nq[1], nq[2],
1173 mixed, tmp[0], tmp[1], tmp[2]);
1174 } else {
1175 memcpy(nq, tmp, 3 * sizeof(felem));
1176 skip = 0;
1177 }
1178 }
1179 }
1180 }
1181 felem_assign(x_out, nq[0]);
1182 felem_assign(y_out, nq[1]);
1183 felem_assign(z_out, nq[2]);
1184}
1185
1186/******************************************************************************/
1187/* FUNCTIONS TO MANAGE PRECOMPUTATION
1188 */
1189
1190static NISTP224_PRE_COMP *
1191nistp224_pre_comp_new()
1192{
1193 NISTP224_PRE_COMP *ret = NULL;
1194 ret = malloc(sizeof *ret);
1195 if (!ret) {
1196 ECerror(ERR_R_MALLOC_FAILURE);
1197 return ret;
1198 }
1199 memset(ret->g_pre_comp, 0, sizeof(ret->g_pre_comp));
1200 ret->references = 1;
1201 return ret;
1202}
1203
1204static void *
1205nistp224_pre_comp_dup(void *src_)
1206{
1207 NISTP224_PRE_COMP *src = src_;
1208
1209 /* no need to actually copy, these objects never change! */
1210 CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
1211
1212 return src_;
1213}
1214
1215static void
1216nistp224_pre_comp_free(void *pre_)
1217{
1218 int i;
1219 NISTP224_PRE_COMP *pre = pre_;
1220
1221 if (!pre)
1222 return;
1223
1224 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1225 if (i > 0)
1226 return;
1227
1228 free(pre);
1229}
1230
1231static void
1232nistp224_pre_comp_clear_free(void *pre_)
1233{
1234 int i;
1235 NISTP224_PRE_COMP *pre = pre_;
1236
1237 if (!pre)
1238 return;
1239
1240 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1241 if (i > 0)
1242 return;
1243
1244 freezero(pre, sizeof *pre);
1245}
1246
1247/******************************************************************************/
1248/* OPENSSL EC_METHOD FUNCTIONS
1249 */
1250
1251int
1252ec_GFp_nistp224_group_init(EC_GROUP *group)
1253{
1254 int ret;
1255 ret = ec_GFp_simple_group_init(group);
1256 group->a_is_minus3 = 1;
1257 return ret;
1258}
1259
1260int
1261ec_GFp_nistp224_group_set_curve(EC_GROUP *group, const BIGNUM *p,
1262 const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
1263{
1264 int ret = 0;
1265 BN_CTX *new_ctx = NULL;
1266 BIGNUM *curve_p, *curve_a, *curve_b;
1267
1268 if (ctx == NULL)
1269 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1270 return 0;
1271 BN_CTX_start(ctx);
1272 if (((curve_p = BN_CTX_get(ctx)) == NULL) ||
1273 ((curve_a = BN_CTX_get(ctx)) == NULL) ||
1274 ((curve_b = BN_CTX_get(ctx)) == NULL))
1275 goto err;
1276 BN_bin2bn(nistp224_curve_params[0], sizeof(felem_bytearray), curve_p);
1277 BN_bin2bn(nistp224_curve_params[1], sizeof(felem_bytearray), curve_a);
1278 BN_bin2bn(nistp224_curve_params[2], sizeof(felem_bytearray), curve_b);
1279 if ((BN_cmp(curve_p, p)) || (BN_cmp(curve_a, a)) ||
1280 (BN_cmp(curve_b, b))) {
1281 ECerror(EC_R_WRONG_CURVE_PARAMETERS);
1282 goto err;
1283 }
1284 group->field_mod_func = BN_nist_mod_224;
1285 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1286 err:
1287 BN_CTX_end(ctx);
1288 BN_CTX_free(new_ctx);
1289 return ret;
1290}
1291
1292/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
1293 * (X', Y') = (X/Z^2, Y/Z^3) */
1294int
1295ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
1296 const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
1297{
1298 felem z1, z2, x_in, y_in, x_out, y_out;
1299 widefelem tmp;
1300
1301 if (EC_POINT_is_at_infinity(group, point) > 0) {
1302 ECerror(EC_R_POINT_AT_INFINITY);
1303 return 0;
1304 }
1305 if ((!BN_to_felem(x_in, &point->X)) || (!BN_to_felem(y_in, &point->Y)) ||
1306 (!BN_to_felem(z1, &point->Z)))
1307 return 0;
1308 felem_inv(z2, z1);
1309 felem_square(tmp, z2);
1310 felem_reduce(z1, tmp);
1311 felem_mul(tmp, x_in, z1);
1312 felem_reduce(x_in, tmp);
1313 felem_contract(x_out, x_in);
1314 if (x != NULL) {
1315 if (!felem_to_BN(x, x_out)) {
1316 ECerror(ERR_R_BN_LIB);
1317 return 0;
1318 }
1319 }
1320 felem_mul(tmp, z1, z2);
1321 felem_reduce(z1, tmp);
1322 felem_mul(tmp, y_in, z1);
1323 felem_reduce(y_in, tmp);
1324 felem_contract(y_out, y_in);
1325 if (y != NULL) {
1326 if (!felem_to_BN(y, y_out)) {
1327 ECerror(ERR_R_BN_LIB);
1328 return 0;
1329 }
1330 }
1331 return 1;
1332}
1333
1334static void
1335make_points_affine(size_t num, felem points[ /* num */ ][3], felem tmp_felems[ /* num+1 */ ])
1336{
1337 /*
1338 * Runs in constant time, unless an input is the point at infinity
1339 * (which normally shouldn't happen).
1340 */
1341 ec_GFp_nistp_points_make_affine_internal(
1342 num,
1343 points,
1344 sizeof(felem),
1345 tmp_felems,
1346 (void (*) (void *)) felem_one,
1347 (int (*) (const void *)) felem_is_zero_int,
1348 (void (*) (void *, const void *)) felem_assign,
1349 (void (*) (void *, const void *)) felem_square_reduce,
1350 (void (*) (void *, const void *, const void *)) felem_mul_reduce,
1351 (void (*) (void *, const void *)) felem_inv,
1352 (void (*) (void *, const void *)) felem_contract);
1353}
1354
1355/* Computes scalar*generator + \sum scalars[i]*points[i], ignoring NULL values
1356 * Result is stored in r (r can equal one of the inputs). */
1357int
1358ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r,
1359 const BIGNUM *scalar, size_t num, const EC_POINT *points[],
1360 const BIGNUM *scalars[], BN_CTX *ctx)
1361{
1362 int ret = 0;
1363 int j;
1364 unsigned i;
1365 int mixed = 0;
1366 BN_CTX *new_ctx = NULL;
1367 BIGNUM *x, *y, *z, *tmp_scalar;
1368 felem_bytearray g_secret;
1369 felem_bytearray *secrets = NULL;
1370 felem(*pre_comp)[17][3] = NULL;
1371 felem *tmp_felems = NULL;
1372 felem_bytearray tmp;
1373 unsigned num_bytes;
1374 int have_pre_comp = 0;
1375 size_t num_points = num;
1376 felem x_in, y_in, z_in, x_out, y_out, z_out;
1377 NISTP224_PRE_COMP *pre = NULL;
1378 const felem(*g_pre_comp)[16][3] = NULL;
1379 EC_POINT *generator = NULL;
1380 const EC_POINT *p = NULL;
1381 const BIGNUM *p_scalar = NULL;
1382
1383 if (ctx == NULL)
1384 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1385 return 0;
1386 BN_CTX_start(ctx);
1387 if (((x = BN_CTX_get(ctx)) == NULL) ||
1388 ((y = BN_CTX_get(ctx)) == NULL) ||
1389 ((z = BN_CTX_get(ctx)) == NULL) ||
1390 ((tmp_scalar = BN_CTX_get(ctx)) == NULL))
1391 goto err;
1392
1393 if (scalar != NULL) {
1394 pre = EC_EX_DATA_get_data(group->extra_data,
1395 nistp224_pre_comp_dup, nistp224_pre_comp_free,
1396 nistp224_pre_comp_clear_free);
1397 if (pre)
1398 /* we have precomputation, try to use it */
1399 g_pre_comp = (const felem(*)[16][3]) pre->g_pre_comp;
1400 else
1401 /* try to use the standard precomputation */
1402 g_pre_comp = &gmul[0];
1403 generator = EC_POINT_new(group);
1404 if (generator == NULL)
1405 goto err;
1406 /* get the generator from precomputation */
1407 if (!felem_to_BN(x, g_pre_comp[0][1][0]) ||
1408 !felem_to_BN(y, g_pre_comp[0][1][1]) ||
1409 !felem_to_BN(z, g_pre_comp[0][1][2])) {
1410 ECerror(ERR_R_BN_LIB);
1411 goto err;
1412 }
1413 if (!EC_POINT_set_Jprojective_coordinates(group, generator,
1414 x, y, z, ctx))
1415 goto err;
1416 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
1417 /* precomputation matches generator */
1418 have_pre_comp = 1;
1419 else
1420 /*
1421 * we don't have valid precomputation: treat the
1422 * generator as a random point
1423 */
1424 num_points = num_points + 1;
1425 }
1426 if (num_points > 0) {
1427 if (num_points >= 3) {
1428 /*
1429 * unless we precompute multiples for just one or two
1430 * points, converting those into affine form is time
1431 * well spent
1432 */
1433 mixed = 1;
1434 }
1435 secrets = calloc(num_points, sizeof(felem_bytearray));
1436 pre_comp = calloc(num_points, 17 * 3 * sizeof(felem));
1437 if (mixed) {
1438 /* XXX should do more int overflow checking */
1439 tmp_felems = reallocarray(NULL,
1440 (num_points * 17 + 1), sizeof(felem));
1441 }
1442 if ((secrets == NULL) || (pre_comp == NULL) || (mixed && (tmp_felems == NULL))) {
1443 ECerror(ERR_R_MALLOC_FAILURE);
1444 goto err;
1445 }
1446 /*
1447 * we treat NULL scalars as 0, and NULL points as points at
1448 * infinity, i.e., they contribute nothing to the linear
1449 * combination
1450 */
1451 for (i = 0; i < num_points; ++i) {
1452 if (i == num)
1453 /* the generator */
1454 {
1455 p = EC_GROUP_get0_generator(group);
1456 p_scalar = scalar;
1457 } else
1458 /* the i^th point */
1459 {
1460 p = points[i];
1461 p_scalar = scalars[i];
1462 }
1463 if ((p_scalar != NULL) && (p != NULL)) {
1464 /* reduce scalar to 0 <= scalar < 2^224 */
1465 if ((BN_num_bits(p_scalar) > 224) || (BN_is_negative(p_scalar))) {
1466 /*
1467 * this is an unusual input, and we
1468 * don't guarantee constant-timeness
1469 */
1470 if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx)) {
1471 ECerror(ERR_R_BN_LIB);
1472 goto err;
1473 }
1474 num_bytes = BN_bn2bin(tmp_scalar, tmp);
1475 } else
1476 num_bytes = BN_bn2bin(p_scalar, tmp);
1477 flip_endian(secrets[i], tmp, num_bytes);
1478 /* precompute multiples */
1479 if ((!BN_to_felem(x_out, &p->X)) ||
1480 (!BN_to_felem(y_out, &p->Y)) ||
1481 (!BN_to_felem(z_out, &p->Z)))
1482 goto err;
1483 felem_assign(pre_comp[i][1][0], x_out);
1484 felem_assign(pre_comp[i][1][1], y_out);
1485 felem_assign(pre_comp[i][1][2], z_out);
1486 for (j = 2; j <= 16; ++j) {
1487 if (j & 1) {
1488 point_add(
1489 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
1490 pre_comp[i][1][0], pre_comp[i][1][1], pre_comp[i][1][2],
1491 0, pre_comp[i][j - 1][0], pre_comp[i][j - 1][1], pre_comp[i][j - 1][2]);
1492 } else {
1493 point_double(
1494 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
1495 pre_comp[i][j / 2][0], pre_comp[i][j / 2][1], pre_comp[i][j / 2][2]);
1496 }
1497 }
1498 }
1499 }
1500 if (mixed)
1501 make_points_affine(num_points * 17, pre_comp[0], tmp_felems);
1502 }
1503 /* the scalar for the generator */
1504 if ((scalar != NULL) && (have_pre_comp)) {
1505 memset(g_secret, 0, sizeof g_secret);
1506 /* reduce scalar to 0 <= scalar < 2^224 */
1507 if ((BN_num_bits(scalar) > 224) || (BN_is_negative(scalar))) {
1508 /*
1509 * this is an unusual input, and we don't guarantee
1510 * constant-timeness
1511 */
1512 if (!BN_nnmod(tmp_scalar, scalar, &group->order, ctx)) {
1513 ECerror(ERR_R_BN_LIB);
1514 goto err;
1515 }
1516 num_bytes = BN_bn2bin(tmp_scalar, tmp);
1517 } else
1518 num_bytes = BN_bn2bin(scalar, tmp);
1519 flip_endian(g_secret, tmp, num_bytes);
1520 /* do the multiplication with generator precomputation */
1521 batch_mul(x_out, y_out, z_out,
1522 (const felem_bytearray(*)) secrets, num_points,
1523 g_secret,
1524 mixed, (const felem(*)[17][3]) pre_comp,
1525 g_pre_comp);
1526 } else
1527 /* do the multiplication without generator precomputation */
1528 batch_mul(x_out, y_out, z_out,
1529 (const felem_bytearray(*)) secrets, num_points,
1530 NULL, mixed, (const felem(*)[17][3]) pre_comp, NULL);
1531 /* reduce the output to its unique minimal representation */
1532 felem_contract(x_in, x_out);
1533 felem_contract(y_in, y_out);
1534 felem_contract(z_in, z_out);
1535 if ((!felem_to_BN(x, x_in)) || (!felem_to_BN(y, y_in)) ||
1536 (!felem_to_BN(z, z_in))) {
1537 ECerror(ERR_R_BN_LIB);
1538 goto err;
1539 }
1540 ret = EC_POINT_set_Jprojective_coordinates(group, r, x, y, z, ctx);
1541
1542 err:
1543 BN_CTX_end(ctx);
1544 EC_POINT_free(generator);
1545 BN_CTX_free(new_ctx);
1546 free(secrets);
1547 free(pre_comp);
1548 free(tmp_felems);
1549 return ret;
1550}
1551
1552int
1553ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
1554{
1555 int ret = 0;
1556 NISTP224_PRE_COMP *pre = NULL;
1557 int i, j;
1558 BN_CTX *new_ctx = NULL;
1559 BIGNUM *x, *y;
1560 EC_POINT *generator = NULL;
1561 felem tmp_felems[32];
1562
1563 /* throw away old precomputation */
1564 EC_EX_DATA_free_data(&group->extra_data, nistp224_pre_comp_dup,
1565 nistp224_pre_comp_free, nistp224_pre_comp_clear_free);
1566 if (ctx == NULL)
1567 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1568 return 0;
1569 BN_CTX_start(ctx);
1570 if (((x = BN_CTX_get(ctx)) == NULL) ||
1571 ((y = BN_CTX_get(ctx)) == NULL))
1572 goto err;
1573 /* get the generator */
1574 if (group->generator == NULL)
1575 goto err;
1576 generator = EC_POINT_new(group);
1577 if (generator == NULL)
1578 goto err;
1579 BN_bin2bn(nistp224_curve_params[3], sizeof(felem_bytearray), x);
1580 BN_bin2bn(nistp224_curve_params[4], sizeof(felem_bytearray), y);
1581 if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
1582 goto err;
1583 if ((pre = nistp224_pre_comp_new()) == NULL)
1584 goto err;
1585 /* if the generator is the standard one, use built-in precomputation */
1586 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx)) {
1587 memcpy(pre->g_pre_comp, gmul, sizeof(pre->g_pre_comp));
1588 ret = 1;
1589 goto err;
1590 }
1591 if ((!BN_to_felem(pre->g_pre_comp[0][1][0], &group->generator->X)) ||
1592 (!BN_to_felem(pre->g_pre_comp[0][1][1], &group->generator->Y)) ||
1593 (!BN_to_felem(pre->g_pre_comp[0][1][2], &group->generator->Z)))
1594 goto err;
1595 /*
1596 * compute 2^56*G, 2^112*G, 2^168*G for the first table, 2^28*G,
1597 * 2^84*G, 2^140*G, 2^196*G for the second one
1598 */
1599 for (i = 1; i <= 8; i <<= 1) {
1600 point_double(
1601 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2],
1602 pre->g_pre_comp[0][i][0], pre->g_pre_comp[0][i][1], pre->g_pre_comp[0][i][2]);
1603 for (j = 0; j < 27; ++j) {
1604 point_double(
1605 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2],
1606 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2]);
1607 }
1608 if (i == 8)
1609 break;
1610 point_double(
1611 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2],
1612 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2]);
1613 for (j = 0; j < 27; ++j) {
1614 point_double(
1615 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2],
1616 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2]);
1617 }
1618 }
1619 for (i = 0; i < 2; i++) {
1620 /* g_pre_comp[i][0] is the point at infinity */
1621 memset(pre->g_pre_comp[i][0], 0, sizeof(pre->g_pre_comp[i][0]));
1622 /* the remaining multiples */
1623 /* 2^56*G + 2^112*G resp. 2^84*G + 2^140*G */
1624 point_add(
1625 pre->g_pre_comp[i][6][0], pre->g_pre_comp[i][6][1],
1626 pre->g_pre_comp[i][6][2], pre->g_pre_comp[i][4][0],
1627 pre->g_pre_comp[i][4][1], pre->g_pre_comp[i][4][2],
1628 0, pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1],
1629 pre->g_pre_comp[i][2][2]);
1630 /* 2^56*G + 2^168*G resp. 2^84*G + 2^196*G */
1631 point_add(
1632 pre->g_pre_comp[i][10][0], pre->g_pre_comp[i][10][1],
1633 pre->g_pre_comp[i][10][2], pre->g_pre_comp[i][8][0],
1634 pre->g_pre_comp[i][8][1], pre->g_pre_comp[i][8][2],
1635 0, pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1],
1636 pre->g_pre_comp[i][2][2]);
1637 /* 2^112*G + 2^168*G resp. 2^140*G + 2^196*G */
1638 point_add(
1639 pre->g_pre_comp[i][12][0], pre->g_pre_comp[i][12][1],
1640 pre->g_pre_comp[i][12][2], pre->g_pre_comp[i][8][0],
1641 pre->g_pre_comp[i][8][1], pre->g_pre_comp[i][8][2],
1642 0, pre->g_pre_comp[i][4][0], pre->g_pre_comp[i][4][1],
1643 pre->g_pre_comp[i][4][2]);
1644 /*
1645 * 2^56*G + 2^112*G + 2^168*G resp. 2^84*G + 2^140*G +
1646 * 2^196*G
1647 */
1648 point_add(
1649 pre->g_pre_comp[i][14][0], pre->g_pre_comp[i][14][1],
1650 pre->g_pre_comp[i][14][2], pre->g_pre_comp[i][12][0],
1651 pre->g_pre_comp[i][12][1], pre->g_pre_comp[i][12][2],
1652 0, pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1],
1653 pre->g_pre_comp[i][2][2]);
1654 for (j = 1; j < 8; ++j) {
1655 /* odd multiples: add G resp. 2^28*G */
1656 point_add(
1657 pre->g_pre_comp[i][2 * j + 1][0], pre->g_pre_comp[i][2 * j + 1][1],
1658 pre->g_pre_comp[i][2 * j + 1][2], pre->g_pre_comp[i][2 * j][0],
1659 pre->g_pre_comp[i][2 * j][1], pre->g_pre_comp[i][2 * j][2],
1660 0, pre->g_pre_comp[i][1][0], pre->g_pre_comp[i][1][1],
1661 pre->g_pre_comp[i][1][2]);
1662 }
1663 }
1664 make_points_affine(31, &(pre->g_pre_comp[0][1]), tmp_felems);
1665
1666 if (!EC_EX_DATA_set_data(&group->extra_data, pre, nistp224_pre_comp_dup,
1667 nistp224_pre_comp_free, nistp224_pre_comp_clear_free))
1668 goto err;
1669 ret = 1;
1670 pre = NULL;
1671 err:
1672 BN_CTX_end(ctx);
1673 EC_POINT_free(generator);
1674 BN_CTX_free(new_ctx);
1675 nistp224_pre_comp_free(pre);
1676 return ret;
1677}
1678
1679int
1680ec_GFp_nistp224_have_precompute_mult(const EC_GROUP *group)
1681{
1682 if (EC_EX_DATA_get_data(group->extra_data, nistp224_pre_comp_dup,
1683 nistp224_pre_comp_free, nistp224_pre_comp_clear_free)
1684 != NULL)
1685 return 1;
1686 else
1687 return 0;
1688}
1689
1690#endif
diff --git a/src/lib/libcrypto/ec/ecp_nistp256.c b/src/lib/libcrypto/ec/ecp_nistp256.c
deleted file mode 100644
index e218b0c68c..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistp256.c
+++ /dev/null
@@ -1,2236 +0,0 @@
1/* $OpenBSD: ecp_nistp256.c,v 1.29 2022/12/26 07:18:51 jmc Exp $ */
2/*
3 * Written by Adam Langley (Google) for the OpenSSL project
4 */
5/*
6 * Copyright (c) 2011 Google Inc.
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21/*
22 * A 64-bit implementation of the NIST P-256 elliptic curve point multiplication
23 *
24 * OpenSSL integration was taken from Emilia Kasper's work in ecp_nistp224.c.
25 * Otherwise based on Emilia's P224 work, which was inspired by my curve25519
26 * work which got its smarts from Daniel J. Bernstein's work on the same.
27 */
28
29#include <stdint.h>
30#include <string.h>
31
32#include <openssl/opensslconf.h>
33
34#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
35
36#include <openssl/err.h>
37#include "ec_local.h"
38
39#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
40 /* even with gcc, the typedef won't work for 32-bit platforms */
41 typedef __uint128_t uint128_t; /* nonstandard; implemented by gcc on 64-bit platforms */
42 typedef __int128_t int128_t;
43#else
44 #error "Need GCC 3.1 or later to define type uint128_t"
45#endif
46
47typedef uint8_t u8;
48typedef uint32_t u32;
49typedef uint64_t u64;
50typedef int64_t s64;
51
52/* The underlying field.
53 *
54 * P256 operates over GF(2^256-2^224+2^192+2^96-1). We can serialise an element
55 * of this field into 32 bytes. We call this an felem_bytearray. */
56
57typedef u8 felem_bytearray[32];
58
59/* These are the parameters of P256, taken from FIPS 186-3, page 86. These
60 * values are big-endian. */
61static const felem_bytearray nistp256_curve_params[5] = {
62 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, /* p */
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
65 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
66 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, /* a = -3 */
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
69 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc}, /* b */
70 {0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7,
71 0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc,
72 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
73 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b},
74 {0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, /* x */
75 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
76 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
77 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96},
78 {0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, /* y */
79 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16,
80 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
81 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5}
82};
83
84/* The representation of field elements.
85 * ------------------------------------
86 *
87 * We represent field elements with either four 128-bit values, eight 128-bit
88 * values, or four 64-bit values. The field element represented is:
89 * v[0]*2^0 + v[1]*2^64 + v[2]*2^128 + v[3]*2^192 (mod p)
90 * or:
91 * v[0]*2^0 + v[1]*2^64 + v[2]*2^128 + ... + v[8]*2^512 (mod p)
92 *
93 * 128-bit values are called 'limbs'. Since the limbs are spaced only 64 bits
94 * apart, but are 128-bits wide, the most significant bits of each limb overlap
95 * with the least significant bits of the next.
96 *
97 * A field element with four limbs is an 'felem'. One with eight limbs is a
98 * 'longfelem'
99 *
100 * A field element with four, 64-bit values is called a 'smallfelem'. Small
101 * values are used as intermediate values before multiplication.
102 */
103
104#define NLIMBS 4
105
106typedef uint128_t limb;
107typedef limb felem[NLIMBS];
108typedef limb longfelem[NLIMBS * 2];
109typedef u64 smallfelem[NLIMBS];
110
111/* This is the value of the prime as four 64-bit words, little-endian. */
112static const u64 kPrime[4] = {0xfffffffffffffffful, 0xffffffff, 0, 0xffffffff00000001ul};
113static const limb bottom32bits = 0xffffffff;
114static const u64 bottom63bits = 0x7ffffffffffffffful;
115
116/* bin32_to_felem takes a little-endian byte array and converts it into felem
117 * form. This assumes that the CPU is little-endian. */
118static void
119bin32_to_felem(felem out, const u8 in[32])
120{
121 out[0] = *((u64 *) & in[0]);
122 out[1] = *((u64 *) & in[8]);
123 out[2] = *((u64 *) & in[16]);
124 out[3] = *((u64 *) & in[24]);
125}
126
127/* smallfelem_to_bin32 takes a smallfelem and serialises into a little endian,
128 * 32 byte array. This assumes that the CPU is little-endian. */
129static void
130smallfelem_to_bin32(u8 out[32], const smallfelem in)
131{
132 *((u64 *) & out[0]) = in[0];
133 *((u64 *) & out[8]) = in[1];
134 *((u64 *) & out[16]) = in[2];
135 *((u64 *) & out[24]) = in[3];
136}
137
138/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
139static void
140flip_endian(u8 *out, const u8 *in, unsigned len)
141{
142 unsigned i;
143 for (i = 0; i < len; ++i)
144 out[i] = in[len - 1 - i];
145}
146
147/* BN_to_felem converts an OpenSSL BIGNUM into an felem */
148static int
149BN_to_felem(felem out, const BIGNUM *bn)
150{
151 felem_bytearray b_in;
152 felem_bytearray b_out;
153 unsigned num_bytes;
154
155 /* BN_bn2bin eats leading zeroes */
156 memset(b_out, 0, sizeof b_out);
157 num_bytes = BN_num_bytes(bn);
158 if (num_bytes > sizeof b_out) {
159 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
160 return 0;
161 }
162 if (BN_is_negative(bn)) {
163 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
164 return 0;
165 }
166 num_bytes = BN_bn2bin(bn, b_in);
167 flip_endian(b_out, b_in, num_bytes);
168 bin32_to_felem(out, b_out);
169 return 1;
170}
171
172/* felem_to_BN converts an felem into an OpenSSL BIGNUM */
173static BIGNUM *
174smallfelem_to_BN(BIGNUM *out, const smallfelem in)
175{
176 felem_bytearray b_in, b_out;
177 smallfelem_to_bin32(b_in, in);
178 flip_endian(b_out, b_in, sizeof b_out);
179 return BN_bin2bn(b_out, sizeof b_out, out);
180}
181
182
183/* Field operations
184 * ---------------- */
185
186static void
187smallfelem_one(smallfelem out)
188{
189 out[0] = 1;
190 out[1] = 0;
191 out[2] = 0;
192 out[3] = 0;
193}
194
195static void
196smallfelem_assign(smallfelem out, const smallfelem in)
197{
198 out[0] = in[0];
199 out[1] = in[1];
200 out[2] = in[2];
201 out[3] = in[3];
202}
203
204static void
205felem_assign(felem out, const felem in)
206{
207 out[0] = in[0];
208 out[1] = in[1];
209 out[2] = in[2];
210 out[3] = in[3];
211}
212
213/* felem_sum sets out = out + in. */
214static void
215felem_sum(felem out, const felem in)
216{
217 out[0] += in[0];
218 out[1] += in[1];
219 out[2] += in[2];
220 out[3] += in[3];
221}
222
223/* felem_small_sum sets out = out + in. */
224static void
225felem_small_sum(felem out, const smallfelem in)
226{
227 out[0] += in[0];
228 out[1] += in[1];
229 out[2] += in[2];
230 out[3] += in[3];
231}
232
233/* felem_scalar sets out = out * scalar */
234static void
235felem_scalar(felem out, const u64 scalar)
236{
237 out[0] *= scalar;
238 out[1] *= scalar;
239 out[2] *= scalar;
240 out[3] *= scalar;
241}
242
243/* longfelem_scalar sets out = out * scalar */
244static void
245longfelem_scalar(longfelem out, const u64 scalar)
246{
247 out[0] *= scalar;
248 out[1] *= scalar;
249 out[2] *= scalar;
250 out[3] *= scalar;
251 out[4] *= scalar;
252 out[5] *= scalar;
253 out[6] *= scalar;
254 out[7] *= scalar;
255}
256
257#define two105m41m9 (((limb)1) << 105) - (((limb)1) << 41) - (((limb)1) << 9)
258#define two105 (((limb)1) << 105)
259#define two105m41p9 (((limb)1) << 105) - (((limb)1) << 41) + (((limb)1) << 9)
260
261/* zero105 is 0 mod p */
262static const felem zero105 = {two105m41m9, two105, two105m41p9, two105m41p9};
263
264/* smallfelem_neg sets |out| to |-small|
265 * On exit:
266 * out[i] < out[i] + 2^105
267 */
268static void
269smallfelem_neg(felem out, const smallfelem small)
270{
271 /* In order to prevent underflow, we subtract from 0 mod p. */
272 out[0] = zero105[0] - small[0];
273 out[1] = zero105[1] - small[1];
274 out[2] = zero105[2] - small[2];
275 out[3] = zero105[3] - small[3];
276}
277
278/* felem_diff subtracts |in| from |out|
279 * On entry:
280 * in[i] < 2^104
281 * On exit:
282 * out[i] < out[i] + 2^105
283 */
284static void
285felem_diff(felem out, const felem in)
286{
287 /* In order to prevent underflow, we add 0 mod p before subtracting. */
288 out[0] += zero105[0];
289 out[1] += zero105[1];
290 out[2] += zero105[2];
291 out[3] += zero105[3];
292
293 out[0] -= in[0];
294 out[1] -= in[1];
295 out[2] -= in[2];
296 out[3] -= in[3];
297}
298
299#define two107m43m11 (((limb)1) << 107) - (((limb)1) << 43) - (((limb)1) << 11)
300#define two107 (((limb)1) << 107)
301#define two107m43p11 (((limb)1) << 107) - (((limb)1) << 43) + (((limb)1) << 11)
302
303/* zero107 is 0 mod p */
304static const felem zero107 = {two107m43m11, two107, two107m43p11, two107m43p11};
305
306/* An alternative felem_diff for larger inputs |in|
307 * felem_diff_zero107 subtracts |in| from |out|
308 * On entry:
309 * in[i] < 2^106
310 * On exit:
311 * out[i] < out[i] + 2^107
312 */
313static void
314felem_diff_zero107(felem out, const felem in)
315{
316 /* In order to prevent underflow, we add 0 mod p before subtracting. */
317 out[0] += zero107[0];
318 out[1] += zero107[1];
319 out[2] += zero107[2];
320 out[3] += zero107[3];
321
322 out[0] -= in[0];
323 out[1] -= in[1];
324 out[2] -= in[2];
325 out[3] -= in[3];
326}
327
328/* longfelem_diff subtracts |in| from |out|
329 * On entry:
330 * in[i] < 7*2^67
331 * On exit:
332 * out[i] < out[i] + 2^70 + 2^40
333 */
334static void
335longfelem_diff(longfelem out, const longfelem in)
336{
337 static const limb two70m8p6 = (((limb) 1) << 70) - (((limb) 1) << 8) + (((limb) 1) << 6);
338 static const limb two70p40 = (((limb) 1) << 70) + (((limb) 1) << 40);
339 static const limb two70 = (((limb) 1) << 70);
340 static const limb two70m40m38p6 = (((limb) 1) << 70) - (((limb) 1) << 40) - (((limb) 1) << 38) + (((limb) 1) << 6);
341 static const limb two70m6 = (((limb) 1) << 70) - (((limb) 1) << 6);
342
343 /* add 0 mod p to avoid underflow */
344 out[0] += two70m8p6;
345 out[1] += two70p40;
346 out[2] += two70;
347 out[3] += two70m40m38p6;
348 out[4] += two70m6;
349 out[5] += two70m6;
350 out[6] += two70m6;
351 out[7] += two70m6;
352
353 /* in[i] < 7*2^67 < 2^70 - 2^40 - 2^38 + 2^6 */
354 out[0] -= in[0];
355 out[1] -= in[1];
356 out[2] -= in[2];
357 out[3] -= in[3];
358 out[4] -= in[4];
359 out[5] -= in[5];
360 out[6] -= in[6];
361 out[7] -= in[7];
362}
363
364#define two64m0 (((limb)1) << 64) - 1
365#define two110p32m0 (((limb)1) << 110) + (((limb)1) << 32) - 1
366#define two64m46 (((limb)1) << 64) - (((limb)1) << 46)
367#define two64m32 (((limb)1) << 64) - (((limb)1) << 32)
368
369/* zero110 is 0 mod p */
370static const felem zero110 = {two64m0, two110p32m0, two64m46, two64m32};
371
372/* felem_shrink converts an felem into a smallfelem. The result isn't quite
373 * minimal as the value may be greater than p.
374 *
375 * On entry:
376 * in[i] < 2^109
377 * On exit:
378 * out[i] < 2^64
379 */
380static void
381felem_shrink(smallfelem out, const felem in)
382{
383 felem tmp;
384 u64 a, b, mask;
385 s64 high, low;
386 static const u64 kPrime3Test = 0x7fffffff00000001ul; /* 2^63 - 2^32 + 1 */
387
388 /* Carry 2->3 */
389 tmp[3] = zero110[3] + in[3] + ((u64) (in[2] >> 64));
390 /* tmp[3] < 2^110 */
391
392 tmp[2] = zero110[2] + (u64) in[2];
393 tmp[0] = zero110[0] + in[0];
394 tmp[1] = zero110[1] + in[1];
395 /* tmp[0] < 2**110, tmp[1] < 2^111, tmp[2] < 2**65 */
396
397 /*
398 * We perform two partial reductions where we eliminate the high-word
399 * of tmp[3]. We don't update the other words till the end.
400 */
401 a = tmp[3] >> 64; /* a < 2^46 */
402 tmp[3] = (u64) tmp[3];
403 tmp[3] -= a;
404 tmp[3] += ((limb) a) << 32;
405 /* tmp[3] < 2^79 */
406
407 b = a;
408 a = tmp[3] >> 64; /* a < 2^15 */
409 b += a; /* b < 2^46 + 2^15 < 2^47 */
410 tmp[3] = (u64) tmp[3];
411 tmp[3] -= a;
412 tmp[3] += ((limb) a) << 32;
413 /* tmp[3] < 2^64 + 2^47 */
414
415 /*
416 * This adjusts the other two words to complete the two partial
417 * reductions.
418 */
419 tmp[0] += b;
420 tmp[1] -= (((limb) b) << 32);
421
422 /*
423 * In order to make space in tmp[3] for the carry from 2 -> 3, we
424 * conditionally subtract kPrime if tmp[3] is large enough.
425 */
426 high = tmp[3] >> 64;
427 /* As tmp[3] < 2^65, high is either 1 or 0 */
428 high <<= 63;
429 high >>= 63;
430 /*
431 * high is: all ones if the high word of tmp[3] is 1 all zeros if
432 * the high word of tmp[3] if 0
433 */
434 low = tmp[3];
435 mask = low >> 63;
436 /*
437 * mask is: all ones if the MSB of low is 1 all zeros if the MSB
438 * of low if 0
439 */
440 low &= bottom63bits;
441 low -= kPrime3Test;
442 /* if low was greater than kPrime3Test then the MSB is zero */
443 low = ~low;
444 low >>= 63;
445 /*
446 * low is: all ones if low was > kPrime3Test all zeros if low was
447 * <= kPrime3Test
448 */
449 mask = (mask & low) | high;
450 tmp[0] -= mask & kPrime[0];
451 tmp[1] -= mask & kPrime[1];
452 /* kPrime[2] is zero, so omitted */
453 tmp[3] -= mask & kPrime[3];
454 /* tmp[3] < 2**64 - 2**32 + 1 */
455
456 tmp[1] += ((u64) (tmp[0] >> 64));
457 tmp[0] = (u64) tmp[0];
458 tmp[2] += ((u64) (tmp[1] >> 64));
459 tmp[1] = (u64) tmp[1];
460 tmp[3] += ((u64) (tmp[2] >> 64));
461 tmp[2] = (u64) tmp[2];
462 /* tmp[i] < 2^64 */
463
464 out[0] = tmp[0];
465 out[1] = tmp[1];
466 out[2] = tmp[2];
467 out[3] = tmp[3];
468}
469
470/* smallfelem_expand converts a smallfelem to an felem */
471static void
472smallfelem_expand(felem out, const smallfelem in)
473{
474 out[0] = in[0];
475 out[1] = in[1];
476 out[2] = in[2];
477 out[3] = in[3];
478}
479
480/* smallfelem_square sets |out| = |small|^2
481 * On entry:
482 * small[i] < 2^64
483 * On exit:
484 * out[i] < 7 * 2^64 < 2^67
485 */
486static void
487smallfelem_square(longfelem out, const smallfelem small)
488{
489 limb a;
490 u64 high, low;
491
492 a = ((uint128_t) small[0]) * small[0];
493 low = a;
494 high = a >> 64;
495 out[0] = low;
496 out[1] = high;
497
498 a = ((uint128_t) small[0]) * small[1];
499 low = a;
500 high = a >> 64;
501 out[1] += low;
502 out[1] += low;
503 out[2] = high;
504
505 a = ((uint128_t) small[0]) * small[2];
506 low = a;
507 high = a >> 64;
508 out[2] += low;
509 out[2] *= 2;
510 out[3] = high;
511
512 a = ((uint128_t) small[0]) * small[3];
513 low = a;
514 high = a >> 64;
515 out[3] += low;
516 out[4] = high;
517
518 a = ((uint128_t) small[1]) * small[2];
519 low = a;
520 high = a >> 64;
521 out[3] += low;
522 out[3] *= 2;
523 out[4] += high;
524
525 a = ((uint128_t) small[1]) * small[1];
526 low = a;
527 high = a >> 64;
528 out[2] += low;
529 out[3] += high;
530
531 a = ((uint128_t) small[1]) * small[3];
532 low = a;
533 high = a >> 64;
534 out[4] += low;
535 out[4] *= 2;
536 out[5] = high;
537
538 a = ((uint128_t) small[2]) * small[3];
539 low = a;
540 high = a >> 64;
541 out[5] += low;
542 out[5] *= 2;
543 out[6] = high;
544 out[6] += high;
545
546 a = ((uint128_t) small[2]) * small[2];
547 low = a;
548 high = a >> 64;
549 out[4] += low;
550 out[5] += high;
551
552 a = ((uint128_t) small[3]) * small[3];
553 low = a;
554 high = a >> 64;
555 out[6] += low;
556 out[7] = high;
557}
558
559/* felem_square sets |out| = |in|^2
560 * On entry:
561 * in[i] < 2^109
562 * On exit:
563 * out[i] < 7 * 2^64 < 2^67
564 */
565static void
566felem_square(longfelem out, const felem in)
567{
568 u64 small[4];
569 felem_shrink(small, in);
570 smallfelem_square(out, small);
571}
572
573/* smallfelem_mul sets |out| = |small1| * |small2|
574 * On entry:
575 * small1[i] < 2^64
576 * small2[i] < 2^64
577 * On exit:
578 * out[i] < 7 * 2^64 < 2^67
579 */
580static void
581smallfelem_mul(longfelem out, const smallfelem small1, const smallfelem small2)
582{
583 limb a;
584 u64 high, low;
585
586 a = ((uint128_t) small1[0]) * small2[0];
587 low = a;
588 high = a >> 64;
589 out[0] = low;
590 out[1] = high;
591
592
593 a = ((uint128_t) small1[0]) * small2[1];
594 low = a;
595 high = a >> 64;
596 out[1] += low;
597 out[2] = high;
598
599 a = ((uint128_t) small1[1]) * small2[0];
600 low = a;
601 high = a >> 64;
602 out[1] += low;
603 out[2] += high;
604
605
606 a = ((uint128_t) small1[0]) * small2[2];
607 low = a;
608 high = a >> 64;
609 out[2] += low;
610 out[3] = high;
611
612 a = ((uint128_t) small1[1]) * small2[1];
613 low = a;
614 high = a >> 64;
615 out[2] += low;
616 out[3] += high;
617
618 a = ((uint128_t) small1[2]) * small2[0];
619 low = a;
620 high = a >> 64;
621 out[2] += low;
622 out[3] += high;
623
624
625 a = ((uint128_t) small1[0]) * small2[3];
626 low = a;
627 high = a >> 64;
628 out[3] += low;
629 out[4] = high;
630
631 a = ((uint128_t) small1[1]) * small2[2];
632 low = a;
633 high = a >> 64;
634 out[3] += low;
635 out[4] += high;
636
637 a = ((uint128_t) small1[2]) * small2[1];
638 low = a;
639 high = a >> 64;
640 out[3] += low;
641 out[4] += high;
642
643 a = ((uint128_t) small1[3]) * small2[0];
644 low = a;
645 high = a >> 64;
646 out[3] += low;
647 out[4] += high;
648
649
650 a = ((uint128_t) small1[1]) * small2[3];
651 low = a;
652 high = a >> 64;
653 out[4] += low;
654 out[5] = high;
655
656 a = ((uint128_t) small1[2]) * small2[2];
657 low = a;
658 high = a >> 64;
659 out[4] += low;
660 out[5] += high;
661
662 a = ((uint128_t) small1[3]) * small2[1];
663 low = a;
664 high = a >> 64;
665 out[4] += low;
666 out[5] += high;
667
668
669 a = ((uint128_t) small1[2]) * small2[3];
670 low = a;
671 high = a >> 64;
672 out[5] += low;
673 out[6] = high;
674
675 a = ((uint128_t) small1[3]) * small2[2];
676 low = a;
677 high = a >> 64;
678 out[5] += low;
679 out[6] += high;
680
681
682 a = ((uint128_t) small1[3]) * small2[3];
683 low = a;
684 high = a >> 64;
685 out[6] += low;
686 out[7] = high;
687}
688
689/* felem_mul sets |out| = |in1| * |in2|
690 * On entry:
691 * in1[i] < 2^109
692 * in2[i] < 2^109
693 * On exit:
694 * out[i] < 7 * 2^64 < 2^67
695 */
696static void
697felem_mul(longfelem out, const felem in1, const felem in2)
698{
699 smallfelem small1, small2;
700 felem_shrink(small1, in1);
701 felem_shrink(small2, in2);
702 smallfelem_mul(out, small1, small2);
703}
704
705/* felem_small_mul sets |out| = |small1| * |in2|
706 * On entry:
707 * small1[i] < 2^64
708 * in2[i] < 2^109
709 * On exit:
710 * out[i] < 7 * 2^64 < 2^67
711 */
712static void
713felem_small_mul(longfelem out, const smallfelem small1, const felem in2)
714{
715 smallfelem small2;
716 felem_shrink(small2, in2);
717 smallfelem_mul(out, small1, small2);
718}
719
720#define two100m36m4 (((limb)1) << 100) - (((limb)1) << 36) - (((limb)1) << 4)
721#define two100 (((limb)1) << 100)
722#define two100m36p4 (((limb)1) << 100) - (((limb)1) << 36) + (((limb)1) << 4)
723/* zero100 is 0 mod p */
724static const felem zero100 = {two100m36m4, two100, two100m36p4, two100m36p4};
725
726/* Internal function for the different flavours of felem_reduce.
727 * felem_reduce_ reduces the higher coefficients in[4]-in[7].
728 * On entry:
729 * out[0] >= in[6] + 2^32*in[6] + in[7] + 2^32*in[7]
730 * out[1] >= in[7] + 2^32*in[4]
731 * out[2] >= in[5] + 2^32*in[5]
732 * out[3] >= in[4] + 2^32*in[5] + 2^32*in[6]
733 * On exit:
734 * out[0] <= out[0] + in[4] + 2^32*in[5]
735 * out[1] <= out[1] + in[5] + 2^33*in[6]
736 * out[2] <= out[2] + in[7] + 2*in[6] + 2^33*in[7]
737 * out[3] <= out[3] + 2^32*in[4] + 3*in[7]
738 */
739static void
740felem_reduce_(felem out, const longfelem in)
741{
742 int128_t c;
743 /* combine common terms from below */
744 c = in[4] + (in[5] << 32);
745 out[0] += c;
746 out[3] -= c;
747
748 c = in[5] - in[7];
749 out[1] += c;
750 out[2] -= c;
751
752 /* the remaining terms */
753 /* 256: [(0,1),(96,-1),(192,-1),(224,1)] */
754 out[1] -= (in[4] << 32);
755 out[3] += (in[4] << 32);
756
757 /* 320: [(32,1),(64,1),(128,-1),(160,-1),(224,-1)] */
758 out[2] -= (in[5] << 32);
759
760 /* 384: [(0,-1),(32,-1),(96,2),(128,2),(224,-1)] */
761 out[0] -= in[6];
762 out[0] -= (in[6] << 32);
763 out[1] += (in[6] << 33);
764 out[2] += (in[6] * 2);
765 out[3] -= (in[6] << 32);
766
767 /* 448: [(0,-1),(32,-1),(64,-1),(128,1),(160,2),(192,3)] */
768 out[0] -= in[7];
769 out[0] -= (in[7] << 32);
770 out[2] += (in[7] << 33);
771 out[3] += (in[7] * 3);
772}
773
774/* felem_reduce converts a longfelem into an felem.
775 * To be called directly after felem_square or felem_mul.
776 * On entry:
777 * in[0] < 2^64, in[1] < 3*2^64, in[2] < 5*2^64, in[3] < 7*2^64
778 * in[4] < 7*2^64, in[5] < 5*2^64, in[6] < 3*2^64, in[7] < 2*64
779 * On exit:
780 * out[i] < 2^101
781 */
782static void
783felem_reduce(felem out, const longfelem in)
784{
785 out[0] = zero100[0] + in[0];
786 out[1] = zero100[1] + in[1];
787 out[2] = zero100[2] + in[2];
788 out[3] = zero100[3] + in[3];
789
790 felem_reduce_(out, in);
791
792 /*
793 * out[0] > 2^100 - 2^36 - 2^4 - 3*2^64 - 3*2^96 - 2^64 - 2^96 > 0
794 * out[1] > 2^100 - 2^64 - 7*2^96 > 0 out[2] > 2^100 - 2^36 + 2^4 -
795 * 5*2^64 - 5*2^96 > 0 out[3] > 2^100 - 2^36 + 2^4 - 7*2^64 - 5*2^96
796 * - 3*2^96 > 0
797 *
798 * out[0] < 2^100 + 2^64 + 7*2^64 + 5*2^96 < 2^101 out[1] < 2^100 +
799 * 3*2^64 + 5*2^64 + 3*2^97 < 2^101 out[2] < 2^100 + 5*2^64 + 2^64 +
800 * 3*2^65 + 2^97 < 2^101 out[3] < 2^100 + 7*2^64 + 7*2^96 + 3*2^64 <
801 * 2^101
802 */
803}
804
805/* felem_reduce_zero105 converts a larger longfelem into an felem.
806 * On entry:
807 * in[0] < 2^71
808 * On exit:
809 * out[i] < 2^106
810 */
811static void
812felem_reduce_zero105(felem out, const longfelem in)
813{
814 out[0] = zero105[0] + in[0];
815 out[1] = zero105[1] + in[1];
816 out[2] = zero105[2] + in[2];
817 out[3] = zero105[3] + in[3];
818
819 felem_reduce_(out, in);
820
821 /*
822 * out[0] > 2^105 - 2^41 - 2^9 - 2^71 - 2^103 - 2^71 - 2^103 > 0
823 * out[1] > 2^105 - 2^71 - 2^103 > 0 out[2] > 2^105 - 2^41 + 2^9 -
824 * 2^71 - 2^103 > 0 out[3] > 2^105 - 2^41 + 2^9 - 2^71 - 2^103 -
825 * 2^103 > 0
826 *
827 * out[0] < 2^105 + 2^71 + 2^71 + 2^103 < 2^106 out[1] < 2^105 + 2^71 +
828 * 2^71 + 2^103 < 2^106 out[2] < 2^105 + 2^71 + 2^71 + 2^71 + 2^103 <
829 * 2^106 out[3] < 2^105 + 2^71 + 2^103 + 2^71 < 2^106
830 */
831}
832
833/* subtract_u64 sets *result = *result - v and *carry to one if the subtraction
834 * underflowed. */
835static void
836subtract_u64(u64 *result, u64 *carry, u64 v)
837{
838 uint128_t r = *result;
839 r -= v;
840 *carry = (r >> 64) & 1;
841 *result = (u64) r;
842}
843
844/* felem_contract converts |in| to its unique, minimal representation.
845 * On entry:
846 * in[i] < 2^109
847 */
848static void
849felem_contract(smallfelem out, const felem in)
850{
851 unsigned i;
852 u64 all_equal_so_far = 0, result = 0, carry;
853
854 felem_shrink(out, in);
855 /* small is minimal except that the value might be > p */
856
857 all_equal_so_far--;
858 /*
859 * We are doing a constant time test if out >= kPrime. We need to
860 * compare each u64, from most-significant to least significant. For
861 * each one, if all words so far have been equal (m is all ones) then
862 * a non-equal result is the answer. Otherwise we continue.
863 */
864 for (i = 3; i < 4; i--) {
865 u64 equal;
866 uint128_t a = ((uint128_t) kPrime[i]) - out[i];
867 /*
868 * if out[i] > kPrime[i] then a will underflow and the high
869 * 64-bits will all be set.
870 */
871 result |= all_equal_so_far & ((u64) (a >> 64));
872
873 /*
874 * if kPrime[i] == out[i] then |equal| will be all zeros and
875 * the decrement will make it all ones.
876 */
877 equal = kPrime[i] ^ out[i];
878 equal--;
879 equal &= equal << 32;
880 equal &= equal << 16;
881 equal &= equal << 8;
882 equal &= equal << 4;
883 equal &= equal << 2;
884 equal &= equal << 1;
885 equal = ((s64) equal) >> 63;
886
887 all_equal_so_far &= equal;
888 }
889
890 /*
891 * if all_equal_so_far is still all ones then the two values are
892 * equal and so out >= kPrime is true.
893 */
894 result |= all_equal_so_far;
895
896 /* if out >= kPrime then we subtract kPrime. */
897 subtract_u64(&out[0], &carry, result & kPrime[0]);
898 subtract_u64(&out[1], &carry, carry);
899 subtract_u64(&out[2], &carry, carry);
900 subtract_u64(&out[3], &carry, carry);
901
902 subtract_u64(&out[1], &carry, result & kPrime[1]);
903 subtract_u64(&out[2], &carry, carry);
904 subtract_u64(&out[3], &carry, carry);
905
906 subtract_u64(&out[2], &carry, result & kPrime[2]);
907 subtract_u64(&out[3], &carry, carry);
908
909 subtract_u64(&out[3], &carry, result & kPrime[3]);
910}
911
912static void
913smallfelem_square_contract(smallfelem out, const smallfelem in)
914{
915 longfelem longtmp;
916 felem tmp;
917
918 smallfelem_square(longtmp, in);
919 felem_reduce(tmp, longtmp);
920 felem_contract(out, tmp);
921}
922
923static void
924smallfelem_mul_contract(smallfelem out, const smallfelem in1, const smallfelem in2)
925{
926 longfelem longtmp;
927 felem tmp;
928
929 smallfelem_mul(longtmp, in1, in2);
930 felem_reduce(tmp, longtmp);
931 felem_contract(out, tmp);
932}
933
934/* felem_is_zero returns a limb with all bits set if |in| == 0 (mod p) and 0
935 * otherwise.
936 * On entry:
937 * small[i] < 2^64
938 */
939static limb
940smallfelem_is_zero(const smallfelem small)
941{
942 limb result;
943 u64 is_p;
944
945 u64 is_zero = small[0] | small[1] | small[2] | small[3];
946 is_zero--;
947 is_zero &= is_zero << 32;
948 is_zero &= is_zero << 16;
949 is_zero &= is_zero << 8;
950 is_zero &= is_zero << 4;
951 is_zero &= is_zero << 2;
952 is_zero &= is_zero << 1;
953 is_zero = ((s64) is_zero) >> 63;
954
955 is_p = (small[0] ^ kPrime[0]) |
956 (small[1] ^ kPrime[1]) |
957 (small[2] ^ kPrime[2]) |
958 (small[3] ^ kPrime[3]);
959 is_p--;
960 is_p &= is_p << 32;
961 is_p &= is_p << 16;
962 is_p &= is_p << 8;
963 is_p &= is_p << 4;
964 is_p &= is_p << 2;
965 is_p &= is_p << 1;
966 is_p = ((s64) is_p) >> 63;
967
968 is_zero |= is_p;
969
970 result = is_zero;
971 result |= ((limb) is_zero) << 64;
972 return result;
973}
974
975static int
976smallfelem_is_zero_int(const smallfelem small)
977{
978 return (int) (smallfelem_is_zero(small) & ((limb) 1));
979}
980
981/* felem_inv calculates |out| = |in|^{-1}
982 *
983 * Based on Fermat's Little Theorem:
984 * a^p = a (mod p)
985 * a^{p-1} = 1 (mod p)
986 * a^{p-2} = a^{-1} (mod p)
987 */
988static void
989felem_inv(felem out, const felem in)
990{
991 felem ftmp, ftmp2;
992 /* each e_I will hold |in|^{2^I - 1} */
993 felem e2, e4, e8, e16, e32, e64;
994 longfelem tmp;
995 unsigned i;
996
997 felem_square(tmp, in);
998 felem_reduce(ftmp, tmp);/* 2^1 */
999 felem_mul(tmp, in, ftmp);
1000 felem_reduce(ftmp, tmp);/* 2^2 - 2^0 */
1001 felem_assign(e2, ftmp);
1002 felem_square(tmp, ftmp);
1003 felem_reduce(ftmp, tmp);/* 2^3 - 2^1 */
1004 felem_square(tmp, ftmp);
1005 felem_reduce(ftmp, tmp);/* 2^4 - 2^2 */
1006 felem_mul(tmp, ftmp, e2);
1007 felem_reduce(ftmp, tmp);/* 2^4 - 2^0 */
1008 felem_assign(e4, ftmp);
1009 felem_square(tmp, ftmp);
1010 felem_reduce(ftmp, tmp);/* 2^5 - 2^1 */
1011 felem_square(tmp, ftmp);
1012 felem_reduce(ftmp, tmp);/* 2^6 - 2^2 */
1013 felem_square(tmp, ftmp);
1014 felem_reduce(ftmp, tmp);/* 2^7 - 2^3 */
1015 felem_square(tmp, ftmp);
1016 felem_reduce(ftmp, tmp);/* 2^8 - 2^4 */
1017 felem_mul(tmp, ftmp, e4);
1018 felem_reduce(ftmp, tmp);/* 2^8 - 2^0 */
1019 felem_assign(e8, ftmp);
1020 for (i = 0; i < 8; i++) {
1021 felem_square(tmp, ftmp);
1022 felem_reduce(ftmp, tmp);
1023 } /* 2^16 - 2^8 */
1024 felem_mul(tmp, ftmp, e8);
1025 felem_reduce(ftmp, tmp);/* 2^16 - 2^0 */
1026 felem_assign(e16, ftmp);
1027 for (i = 0; i < 16; i++) {
1028 felem_square(tmp, ftmp);
1029 felem_reduce(ftmp, tmp);
1030 } /* 2^32 - 2^16 */
1031 felem_mul(tmp, ftmp, e16);
1032 felem_reduce(ftmp, tmp);/* 2^32 - 2^0 */
1033 felem_assign(e32, ftmp);
1034 for (i = 0; i < 32; i++) {
1035 felem_square(tmp, ftmp);
1036 felem_reduce(ftmp, tmp);
1037 } /* 2^64 - 2^32 */
1038 felem_assign(e64, ftmp);
1039 felem_mul(tmp, ftmp, in);
1040 felem_reduce(ftmp, tmp);/* 2^64 - 2^32 + 2^0 */
1041 for (i = 0; i < 192; i++) {
1042 felem_square(tmp, ftmp);
1043 felem_reduce(ftmp, tmp);
1044 } /* 2^256 - 2^224 + 2^192 */
1045
1046 felem_mul(tmp, e64, e32);
1047 felem_reduce(ftmp2, tmp); /* 2^64 - 2^0 */
1048 for (i = 0; i < 16; i++) {
1049 felem_square(tmp, ftmp2);
1050 felem_reduce(ftmp2, tmp);
1051 } /* 2^80 - 2^16 */
1052 felem_mul(tmp, ftmp2, e16);
1053 felem_reduce(ftmp2, tmp); /* 2^80 - 2^0 */
1054 for (i = 0; i < 8; i++) {
1055 felem_square(tmp, ftmp2);
1056 felem_reduce(ftmp2, tmp);
1057 } /* 2^88 - 2^8 */
1058 felem_mul(tmp, ftmp2, e8);
1059 felem_reduce(ftmp2, tmp); /* 2^88 - 2^0 */
1060 for (i = 0; i < 4; i++) {
1061 felem_square(tmp, ftmp2);
1062 felem_reduce(ftmp2, tmp);
1063 } /* 2^92 - 2^4 */
1064 felem_mul(tmp, ftmp2, e4);
1065 felem_reduce(ftmp2, tmp); /* 2^92 - 2^0 */
1066 felem_square(tmp, ftmp2);
1067 felem_reduce(ftmp2, tmp); /* 2^93 - 2^1 */
1068 felem_square(tmp, ftmp2);
1069 felem_reduce(ftmp2, tmp); /* 2^94 - 2^2 */
1070 felem_mul(tmp, ftmp2, e2);
1071 felem_reduce(ftmp2, tmp); /* 2^94 - 2^0 */
1072 felem_square(tmp, ftmp2);
1073 felem_reduce(ftmp2, tmp); /* 2^95 - 2^1 */
1074 felem_square(tmp, ftmp2);
1075 felem_reduce(ftmp2, tmp); /* 2^96 - 2^2 */
1076 felem_mul(tmp, ftmp2, in);
1077 felem_reduce(ftmp2, tmp); /* 2^96 - 3 */
1078
1079 felem_mul(tmp, ftmp2, ftmp);
1080 felem_reduce(out, tmp); /* 2^256 - 2^224 + 2^192 + 2^96 - 3 */
1081}
1082
1083static void
1084smallfelem_inv_contract(smallfelem out, const smallfelem in)
1085{
1086 felem tmp;
1087
1088 smallfelem_expand(tmp, in);
1089 felem_inv(tmp, tmp);
1090 felem_contract(out, tmp);
1091}
1092
1093/* Group operations
1094 * ----------------
1095 *
1096 * Building on top of the field operations we have the operations on the
1097 * elliptic curve group itself. Points on the curve are represented in Jacobian
1098 * coordinates */
1099
1100/* point_double calculates 2*(x_in, y_in, z_in)
1101 *
1102 * The method is taken from:
1103 * http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
1104 *
1105 * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed.
1106 * while x_out == y_in is not (maybe this works, but it's not tested). */
1107static void
1108point_double(felem x_out, felem y_out, felem z_out,
1109 const felem x_in, const felem y_in, const felem z_in)
1110{
1111 longfelem tmp, tmp2;
1112 felem delta, gamma, beta, alpha, ftmp, ftmp2;
1113 smallfelem small1, small2;
1114
1115 felem_assign(ftmp, x_in);
1116 /* ftmp[i] < 2^106 */
1117 felem_assign(ftmp2, x_in);
1118 /* ftmp2[i] < 2^106 */
1119
1120 /* delta = z^2 */
1121 felem_square(tmp, z_in);
1122 felem_reduce(delta, tmp);
1123 /* delta[i] < 2^101 */
1124
1125 /* gamma = y^2 */
1126 felem_square(tmp, y_in);
1127 felem_reduce(gamma, tmp);
1128 /* gamma[i] < 2^101 */
1129 felem_shrink(small1, gamma);
1130
1131 /* beta = x*gamma */
1132 felem_small_mul(tmp, small1, x_in);
1133 felem_reduce(beta, tmp);
1134 /* beta[i] < 2^101 */
1135
1136 /* alpha = 3*(x-delta)*(x+delta) */
1137 felem_diff(ftmp, delta);
1138 /* ftmp[i] < 2^105 + 2^106 < 2^107 */
1139 felem_sum(ftmp2, delta);
1140 /* ftmp2[i] < 2^105 + 2^106 < 2^107 */
1141 felem_scalar(ftmp2, 3);
1142 /* ftmp2[i] < 3 * 2^107 < 2^109 */
1143 felem_mul(tmp, ftmp, ftmp2);
1144 felem_reduce(alpha, tmp);
1145 /* alpha[i] < 2^101 */
1146 felem_shrink(small2, alpha);
1147
1148 /* x' = alpha^2 - 8*beta */
1149 smallfelem_square(tmp, small2);
1150 felem_reduce(x_out, tmp);
1151 felem_assign(ftmp, beta);
1152 felem_scalar(ftmp, 8);
1153 /* ftmp[i] < 8 * 2^101 = 2^104 */
1154 felem_diff(x_out, ftmp);
1155 /* x_out[i] < 2^105 + 2^101 < 2^106 */
1156
1157 /* z' = (y + z)^2 - gamma - delta */
1158 felem_sum(delta, gamma);
1159 /* delta[i] < 2^101 + 2^101 = 2^102 */
1160 felem_assign(ftmp, y_in);
1161 felem_sum(ftmp, z_in);
1162 /* ftmp[i] < 2^106 + 2^106 = 2^107 */
1163 felem_square(tmp, ftmp);
1164 felem_reduce(z_out, tmp);
1165 felem_diff(z_out, delta);
1166 /* z_out[i] < 2^105 + 2^101 < 2^106 */
1167
1168 /* y' = alpha*(4*beta - x') - 8*gamma^2 */
1169 felem_scalar(beta, 4);
1170 /* beta[i] < 4 * 2^101 = 2^103 */
1171 felem_diff_zero107(beta, x_out);
1172 /* beta[i] < 2^107 + 2^103 < 2^108 */
1173 felem_small_mul(tmp, small2, beta);
1174 /* tmp[i] < 7 * 2^64 < 2^67 */
1175 smallfelem_square(tmp2, small1);
1176 /* tmp2[i] < 7 * 2^64 */
1177 longfelem_scalar(tmp2, 8);
1178 /* tmp2[i] < 8 * 7 * 2^64 = 7 * 2^67 */
1179 longfelem_diff(tmp, tmp2);
1180 /* tmp[i] < 2^67 + 2^70 + 2^40 < 2^71 */
1181 felem_reduce_zero105(y_out, tmp);
1182 /* y_out[i] < 2^106 */
1183}
1184
1185/* point_double_small is the same as point_double, except that it operates on
1186 * smallfelems */
1187static void
1188point_double_small(smallfelem x_out, smallfelem y_out, smallfelem z_out,
1189 const smallfelem x_in, const smallfelem y_in, const smallfelem z_in)
1190{
1191 felem felem_x_out, felem_y_out, felem_z_out;
1192 felem felem_x_in, felem_y_in, felem_z_in;
1193
1194 smallfelem_expand(felem_x_in, x_in);
1195 smallfelem_expand(felem_y_in, y_in);
1196 smallfelem_expand(felem_z_in, z_in);
1197 point_double(felem_x_out, felem_y_out, felem_z_out,
1198 felem_x_in, felem_y_in, felem_z_in);
1199 felem_shrink(x_out, felem_x_out);
1200 felem_shrink(y_out, felem_y_out);
1201 felem_shrink(z_out, felem_z_out);
1202}
1203
1204/* copy_conditional copies in to out iff mask is all ones. */
1205static void
1206copy_conditional(felem out, const felem in, limb mask)
1207{
1208 unsigned i;
1209 for (i = 0; i < NLIMBS; ++i) {
1210 const limb tmp = mask & (in[i] ^ out[i]);
1211 out[i] ^= tmp;
1212 }
1213}
1214
1215/* copy_small_conditional copies in to out iff mask is all ones. */
1216static void
1217copy_small_conditional(felem out, const smallfelem in, limb mask)
1218{
1219 unsigned i;
1220 const u64 mask64 = mask;
1221 for (i = 0; i < NLIMBS; ++i) {
1222 out[i] = ((limb) (in[i] & mask64)) | (out[i] & ~mask);
1223 }
1224}
1225
1226/* point_add calculates (x1, y1, z1) + (x2, y2, z2)
1227 *
1228 * The method is taken from:
1229 * http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl,
1230 * adapted for mixed addition (z2 = 1, or z2 = 0 for the point at infinity).
1231 *
1232 * This function includes a branch for checking whether the two input points
1233 * are equal, (while not equal to the point at infinity). This case never
1234 * happens during single point multiplication, so there is no timing leak for
1235 * ECDH or ECDSA signing. */
1236static void
1237point_add(felem x3, felem y3, felem z3,
1238 const felem x1, const felem y1, const felem z1,
1239 const int mixed, const smallfelem x2, const smallfelem y2, const smallfelem z2)
1240{
1241 felem ftmp, ftmp2, ftmp3, ftmp4, ftmp5, ftmp6, x_out, y_out, z_out;
1242 longfelem tmp, tmp2;
1243 smallfelem small1, small2, small3, small4, small5;
1244 limb x_equal, y_equal, z1_is_zero, z2_is_zero;
1245
1246 felem_shrink(small3, z1);
1247
1248 z1_is_zero = smallfelem_is_zero(small3);
1249 z2_is_zero = smallfelem_is_zero(z2);
1250
1251 /* ftmp = z1z1 = z1**2 */
1252 smallfelem_square(tmp, small3);
1253 felem_reduce(ftmp, tmp);
1254 /* ftmp[i] < 2^101 */
1255 felem_shrink(small1, ftmp);
1256
1257 if (!mixed) {
1258 /* ftmp2 = z2z2 = z2**2 */
1259 smallfelem_square(tmp, z2);
1260 felem_reduce(ftmp2, tmp);
1261 /* ftmp2[i] < 2^101 */
1262 felem_shrink(small2, ftmp2);
1263
1264 felem_shrink(small5, x1);
1265
1266 /* u1 = ftmp3 = x1*z2z2 */
1267 smallfelem_mul(tmp, small5, small2);
1268 felem_reduce(ftmp3, tmp);
1269 /* ftmp3[i] < 2^101 */
1270
1271 /* ftmp5 = z1 + z2 */
1272 felem_assign(ftmp5, z1);
1273 felem_small_sum(ftmp5, z2);
1274 /* ftmp5[i] < 2^107 */
1275
1276 /* ftmp5 = (z1 + z2)**2 - (z1z1 + z2z2) = 2z1z2 */
1277 felem_square(tmp, ftmp5);
1278 felem_reduce(ftmp5, tmp);
1279 /* ftmp2 = z2z2 + z1z1 */
1280 felem_sum(ftmp2, ftmp);
1281 /* ftmp2[i] < 2^101 + 2^101 = 2^102 */
1282 felem_diff(ftmp5, ftmp2);
1283 /* ftmp5[i] < 2^105 + 2^101 < 2^106 */
1284
1285 /* ftmp2 = z2 * z2z2 */
1286 smallfelem_mul(tmp, small2, z2);
1287 felem_reduce(ftmp2, tmp);
1288
1289 /* s1 = ftmp2 = y1 * z2**3 */
1290 felem_mul(tmp, y1, ftmp2);
1291 felem_reduce(ftmp6, tmp);
1292 /* ftmp6[i] < 2^101 */
1293 } else {
1294 /* We'll assume z2 = 1 (special case z2 = 0 is handled later) */
1295
1296 /* u1 = ftmp3 = x1*z2z2 */
1297 felem_assign(ftmp3, x1);
1298 /* ftmp3[i] < 2^106 */
1299
1300 /* ftmp5 = 2z1z2 */
1301 felem_assign(ftmp5, z1);
1302 felem_scalar(ftmp5, 2);
1303 /* ftmp5[i] < 2*2^106 = 2^107 */
1304
1305 /* s1 = ftmp2 = y1 * z2**3 */
1306 felem_assign(ftmp6, y1);
1307 /* ftmp6[i] < 2^106 */
1308 }
1309
1310 /* u2 = x2*z1z1 */
1311 smallfelem_mul(tmp, x2, small1);
1312 felem_reduce(ftmp4, tmp);
1313
1314 /* h = ftmp4 = u2 - u1 */
1315 felem_diff_zero107(ftmp4, ftmp3);
1316 /* ftmp4[i] < 2^107 + 2^101 < 2^108 */
1317 felem_shrink(small4, ftmp4);
1318
1319 x_equal = smallfelem_is_zero(small4);
1320
1321 /* z_out = ftmp5 * h */
1322 felem_small_mul(tmp, small4, ftmp5);
1323 felem_reduce(z_out, tmp);
1324 /* z_out[i] < 2^101 */
1325
1326 /* ftmp = z1 * z1z1 */
1327 smallfelem_mul(tmp, small1, small3);
1328 felem_reduce(ftmp, tmp);
1329
1330 /* s2 = tmp = y2 * z1**3 */
1331 felem_small_mul(tmp, y2, ftmp);
1332 felem_reduce(ftmp5, tmp);
1333
1334 /* r = ftmp5 = (s2 - s1)*2 */
1335 felem_diff_zero107(ftmp5, ftmp6);
1336 /* ftmp5[i] < 2^107 + 2^107 = 2^108 */
1337 felem_scalar(ftmp5, 2);
1338 /* ftmp5[i] < 2^109 */
1339 felem_shrink(small1, ftmp5);
1340 y_equal = smallfelem_is_zero(small1);
1341
1342 if (x_equal && y_equal && !z1_is_zero && !z2_is_zero) {
1343 point_double(x3, y3, z3, x1, y1, z1);
1344 return;
1345 }
1346 /* I = ftmp = (2h)**2 */
1347 felem_assign(ftmp, ftmp4);
1348 felem_scalar(ftmp, 2);
1349 /* ftmp[i] < 2*2^108 = 2^109 */
1350 felem_square(tmp, ftmp);
1351 felem_reduce(ftmp, tmp);
1352
1353 /* J = ftmp2 = h * I */
1354 felem_mul(tmp, ftmp4, ftmp);
1355 felem_reduce(ftmp2, tmp);
1356
1357 /* V = ftmp4 = U1 * I */
1358 felem_mul(tmp, ftmp3, ftmp);
1359 felem_reduce(ftmp4, tmp);
1360
1361 /* x_out = r**2 - J - 2V */
1362 smallfelem_square(tmp, small1);
1363 felem_reduce(x_out, tmp);
1364 felem_assign(ftmp3, ftmp4);
1365 felem_scalar(ftmp4, 2);
1366 felem_sum(ftmp4, ftmp2);
1367 /* ftmp4[i] < 2*2^101 + 2^101 < 2^103 */
1368 felem_diff(x_out, ftmp4);
1369 /* x_out[i] < 2^105 + 2^101 */
1370
1371 /* y_out = r(V-x_out) - 2 * s1 * J */
1372 felem_diff_zero107(ftmp3, x_out);
1373 /* ftmp3[i] < 2^107 + 2^101 < 2^108 */
1374 felem_small_mul(tmp, small1, ftmp3);
1375 felem_mul(tmp2, ftmp6, ftmp2);
1376 longfelem_scalar(tmp2, 2);
1377 /* tmp2[i] < 2*2^67 = 2^68 */
1378 longfelem_diff(tmp, tmp2);
1379 /* tmp[i] < 2^67 + 2^70 + 2^40 < 2^71 */
1380 felem_reduce_zero105(y_out, tmp);
1381 /* y_out[i] < 2^106 */
1382
1383 copy_small_conditional(x_out, x2, z1_is_zero);
1384 copy_conditional(x_out, x1, z2_is_zero);
1385 copy_small_conditional(y_out, y2, z1_is_zero);
1386 copy_conditional(y_out, y1, z2_is_zero);
1387 copy_small_conditional(z_out, z2, z1_is_zero);
1388 copy_conditional(z_out, z1, z2_is_zero);
1389 felem_assign(x3, x_out);
1390 felem_assign(y3, y_out);
1391 felem_assign(z3, z_out);
1392}
1393
1394/* point_add_small is the same as point_add, except that it operates on
1395 * smallfelems */
1396static void
1397point_add_small(smallfelem x3, smallfelem y3, smallfelem z3,
1398 smallfelem x1, smallfelem y1, smallfelem z1,
1399 smallfelem x2, smallfelem y2, smallfelem z2)
1400{
1401 felem felem_x3, felem_y3, felem_z3;
1402 felem felem_x1, felem_y1, felem_z1;
1403 smallfelem_expand(felem_x1, x1);
1404 smallfelem_expand(felem_y1, y1);
1405 smallfelem_expand(felem_z1, z1);
1406 point_add(felem_x3, felem_y3, felem_z3, felem_x1, felem_y1, felem_z1, 0, x2, y2, z2);
1407 felem_shrink(x3, felem_x3);
1408 felem_shrink(y3, felem_y3);
1409 felem_shrink(z3, felem_z3);
1410}
1411
1412/* Base point pre computation
1413 * --------------------------
1414 *
1415 * Two different sorts of precomputed tables are used in the following code.
1416 * Each contain various points on the curve, where each point is three field
1417 * elements (x, y, z).
1418 *
1419 * For the base point table, z is usually 1 (0 for the point at infinity).
1420 * This table has 2 * 16 elements, starting with the following:
1421 * index | bits | point
1422 * ------+---------+------------------------------
1423 * 0 | 0 0 0 0 | 0G
1424 * 1 | 0 0 0 1 | 1G
1425 * 2 | 0 0 1 0 | 2^64G
1426 * 3 | 0 0 1 1 | (2^64 + 1)G
1427 * 4 | 0 1 0 0 | 2^128G
1428 * 5 | 0 1 0 1 | (2^128 + 1)G
1429 * 6 | 0 1 1 0 | (2^128 + 2^64)G
1430 * 7 | 0 1 1 1 | (2^128 + 2^64 + 1)G
1431 * 8 | 1 0 0 0 | 2^192G
1432 * 9 | 1 0 0 1 | (2^192 + 1)G
1433 * 10 | 1 0 1 0 | (2^192 + 2^64)G
1434 * 11 | 1 0 1 1 | (2^192 + 2^64 + 1)G
1435 * 12 | 1 1 0 0 | (2^192 + 2^128)G
1436 * 13 | 1 1 0 1 | (2^192 + 2^128 + 1)G
1437 * 14 | 1 1 1 0 | (2^192 + 2^128 + 2^64)G
1438 * 15 | 1 1 1 1 | (2^192 + 2^128 + 2^64 + 1)G
1439 * followed by a copy of this with each element multiplied by 2^32.
1440 *
1441 * The reason for this is so that we can clock bits into four different
1442 * locations when doing simple scalar multiplies against the base point,
1443 * and then another four locations using the second 16 elements.
1444 *
1445 * Tables for other points have table[i] = iG for i in 0 .. 16. */
1446
1447/* gmul is the table of precomputed base points */
1448static const smallfelem gmul[2][16][3] =
1449{{{{0, 0, 0, 0},
1450{0, 0, 0, 0},
1451{0, 0, 0, 0}},
1452{{0xf4a13945d898c296, 0x77037d812deb33a0, 0xf8bce6e563a440f2, 0x6b17d1f2e12c4247},
1453{0xcbb6406837bf51f5, 0x2bce33576b315ece, 0x8ee7eb4a7c0f9e16, 0x4fe342e2fe1a7f9b},
1454{1, 0, 0, 0}},
1455{{0x90e75cb48e14db63, 0x29493baaad651f7e, 0x8492592e326e25de, 0x0fa822bc2811aaa5},
1456{0xe41124545f462ee7, 0x34b1a65050fe82f5, 0x6f4ad4bcb3df188b, 0xbff44ae8f5dba80d},
1457{1, 0, 0, 0}},
1458{{0x93391ce2097992af, 0xe96c98fd0d35f1fa, 0xb257c0de95e02789, 0x300a4bbc89d6726f},
1459{0xaa54a291c08127a0, 0x5bb1eeada9d806a5, 0x7f1ddb25ff1e3c6f, 0x72aac7e0d09b4644},
1460{1, 0, 0, 0}},
1461{{0x57c84fc9d789bd85, 0xfc35ff7dc297eac3, 0xfb982fd588c6766e, 0x447d739beedb5e67},
1462{0x0c7e33c972e25b32, 0x3d349b95a7fae500, 0xe12e9d953a4aaff7, 0x2d4825ab834131ee},
1463{1, 0, 0, 0}},
1464{{0x13949c932a1d367f, 0xef7fbd2b1a0a11b7, 0xddc6068bb91dfc60, 0xef9519328a9c72ff},
1465{0x196035a77376d8a8, 0x23183b0895ca1740, 0xc1ee9807022c219c, 0x611e9fc37dbb2c9b},
1466{1, 0, 0, 0}},
1467{{0xcae2b1920b57f4bc, 0x2936df5ec6c9bc36, 0x7dea6482e11238bf, 0x550663797b51f5d8},
1468{0x44ffe216348a964c, 0x9fb3d576dbdefbe1, 0x0afa40018d9d50e5, 0x157164848aecb851},
1469{1, 0, 0, 0}},
1470{{0xe48ecafffc5cde01, 0x7ccd84e70d715f26, 0xa2e8f483f43e4391, 0xeb5d7745b21141ea},
1471{0xcac917e2731a3479, 0x85f22cfe2844b645, 0x0990e6a158006cee, 0xeafd72ebdbecc17b},
1472{1, 0, 0, 0}},
1473{{0x6cf20ffb313728be, 0x96439591a3c6b94a, 0x2736ff8344315fc5, 0xa6d39677a7849276},
1474{0xf2bab833c357f5f4, 0x824a920c2284059b, 0x66b8babd2d27ecdf, 0x674f84749b0b8816},
1475{1, 0, 0, 0}},
1476{{0x2df48c04677c8a3e, 0x74e02f080203a56b, 0x31855f7db8c7fedb, 0x4e769e7672c9ddad},
1477{0xa4c36165b824bbb0, 0xfb9ae16f3b9122a5, 0x1ec0057206947281, 0x42b99082de830663},
1478{1, 0, 0, 0}},
1479{{0x6ef95150dda868b9, 0xd1f89e799c0ce131, 0x7fdc1ca008a1c478, 0x78878ef61c6ce04d},
1480{0x9c62b9121fe0d976, 0x6ace570ebde08d4f, 0xde53142c12309def, 0xb6cb3f5d7b72c321},
1481{1, 0, 0, 0}},
1482{{0x7f991ed2c31a3573, 0x5b82dd5bd54fb496, 0x595c5220812ffcae, 0x0c88bc4d716b1287},
1483{0x3a57bf635f48aca8, 0x7c8181f4df2564f3, 0x18d1b5b39c04e6aa, 0xdd5ddea3f3901dc6},
1484{1, 0, 0, 0}},
1485{{0xe96a79fb3e72ad0c, 0x43a0a28c42ba792f, 0xefe0a423083e49f3, 0x68f344af6b317466},
1486{0xcdfe17db3fb24d4a, 0x668bfc2271f5c626, 0x604ed93c24d67ff3, 0x31b9c405f8540a20},
1487{1, 0, 0, 0}},
1488{{0xd36b4789a2582e7f, 0x0d1a10144ec39c28, 0x663c62c3edbad7a0, 0x4052bf4b6f461db9},
1489{0x235a27c3188d25eb, 0xe724f33999bfcc5b, 0x862be6bd71d70cc8, 0xfecf4d5190b0fc61},
1490{1, 0, 0, 0}},
1491{{0x74346c10a1d4cfac, 0xafdf5cc08526a7a4, 0x123202a8f62bff7a, 0x1eddbae2c802e41a},
1492{0x8fa0af2dd603f844, 0x36e06b7e4c701917, 0x0c45f45273db33a0, 0x43104d86560ebcfc},
1493{1, 0, 0, 0}},
1494{{0x9615b5110d1d78e5, 0x66b0de3225c4744b, 0x0a4a46fb6aaf363a, 0xb48e26b484f7a21c},
1495{0x06ebb0f621a01b2d, 0xc004e4048b7b0f98, 0x64131bcdfed6f668, 0xfac015404d4d3dab},
1496{1, 0, 0, 0}}},
1497{{{0, 0, 0, 0},
1498{0, 0, 0, 0},
1499{0, 0, 0, 0}},
1500{{0x3a5a9e22185a5943, 0x1ab919365c65dfb6, 0x21656b32262c71da, 0x7fe36b40af22af89},
1501{0xd50d152c699ca101, 0x74b3d5867b8af212, 0x9f09f40407dca6f1, 0xe697d45825b63624},
1502{1, 0, 0, 0}},
1503{{0xa84aa9397512218e, 0xe9a521b074ca0141, 0x57880b3a18a2e902, 0x4a5b506612a677a6},
1504{0x0beada7a4c4f3840, 0x626db15419e26d9d, 0xc42604fbe1627d40, 0xeb13461ceac089f1},
1505{1, 0, 0, 0}},
1506{{0xf9faed0927a43281, 0x5e52c4144103ecbc, 0xc342967aa815c857, 0x0781b8291c6a220a},
1507{0x5a8343ceeac55f80, 0x88f80eeee54a05e3, 0x97b2a14f12916434, 0x690cde8df0151593},
1508{1, 0, 0, 0}},
1509{{0xaee9c75df7f82f2a, 0x9e4c35874afdf43a, 0xf5622df437371326, 0x8a535f566ec73617},
1510{0xc5f9a0ac223094b7, 0xcde533864c8c7669, 0x37e02819085a92bf, 0x0455c08468b08bd7},
1511{1, 0, 0, 0}},
1512{{0x0c0a6e2c9477b5d9, 0xf9a4bf62876dc444, 0x5050a949b6cdc279, 0x06bada7ab77f8276},
1513{0xc8b4aed1ea48dac9, 0xdebd8a4b7ea1070f, 0x427d49101366eb70, 0x5b476dfd0e6cb18a},
1514{1, 0, 0, 0}},
1515{{0x7c5c3e44278c340a, 0x4d54606812d66f3b, 0x29a751b1ae23c5d8, 0x3e29864e8a2ec908},
1516{0x142d2a6626dbb850, 0xad1744c4765bd780, 0x1f150e68e322d1ed, 0x239b90ea3dc31e7e},
1517{1, 0, 0, 0}},
1518{{0x78c416527a53322a, 0x305dde6709776f8e, 0xdbcab759f8862ed4, 0x820f4dd949f72ff7},
1519{0x6cc544a62b5debd4, 0x75be5d937b4e8cc4, 0x1b481b1b215c14d3, 0x140406ec783a05ec},
1520{1, 0, 0, 0}},
1521{{0x6a703f10e895df07, 0xfd75f3fa01876bd8, 0xeb5b06e70ce08ffe, 0x68f6b8542783dfee},
1522{0x90c76f8a78712655, 0xcf5293d2f310bf7f, 0xfbc8044dfda45028, 0xcbe1feba92e40ce6},
1523{1, 0, 0, 0}},
1524{{0xe998ceea4396e4c1, 0xfc82ef0b6acea274, 0x230f729f2250e927, 0xd0b2f94d2f420109},
1525{0x4305adddb38d4966, 0x10b838f8624c3b45, 0x7db2636658954e7a, 0x971459828b0719e5},
1526{1, 0, 0, 0}},
1527{{0x4bd6b72623369fc9, 0x57f2929e53d0b876, 0xc2d5cba4f2340687, 0x961610004a866aba},
1528{0x49997bcd2e407a5e, 0x69ab197d92ddcb24, 0x2cf1f2438fe5131c, 0x7acb9fadcee75e44},
1529{1, 0, 0, 0}},
1530{{0x254e839423d2d4c0, 0xf57f0c917aea685b, 0xa60d880f6f75aaea, 0x24eb9acca333bf5b},
1531{0xe3de4ccb1cda5dea, 0xfeef9341c51a6b4f, 0x743125f88bac4c4d, 0x69f891c5acd079cc},
1532{1, 0, 0, 0}},
1533{{0xeee44b35702476b5, 0x7ed031a0e45c2258, 0xb422d1e7bd6f8514, 0xe51f547c5972a107},
1534{0xa25bcd6fc9cf343d, 0x8ca922ee097c184e, 0xa62f98b3a9fe9a06, 0x1c309a2b25bb1387},
1535{1, 0, 0, 0}},
1536{{0x9295dbeb1967c459, 0xb00148833472c98e, 0xc504977708011828, 0x20b87b8aa2c4e503},
1537{0x3063175de057c277, 0x1bd539338fe582dd, 0x0d11adef5f69a044, 0xf5c6fa49919776be},
1538{1, 0, 0, 0}},
1539{{0x8c944e760fd59e11, 0x3876cba1102fad5f, 0xa454c3fad83faa56, 0x1ed7d1b9332010b9},
1540{0xa1011a270024b889, 0x05e4d0dcac0cd344, 0x52b520f0eb6a2a24, 0x3a2b03f03217257a},
1541{1, 0, 0, 0}},
1542{{0xf20fc2afdf1d043d, 0xf330240db58d5a62, 0xfc7d229ca0058c3b, 0x15fee545c78dd9f6},
1543{0x501e82885bc98cda, 0x41ef80e5d046ac04, 0x557d9f49461210fb, 0x4ab5b6b2b8753f81},
1544{1, 0, 0, 0}}}};
1545
1546/* select_point selects the |idx|th point from a precomputation table and
1547 * copies it to out. */
1548static void
1549select_point(const u64 idx, unsigned int size, const smallfelem pre_comp[16][3], smallfelem out[3])
1550{
1551 unsigned i, j;
1552 u64 *outlimbs = &out[0][0];
1553 memset(outlimbs, 0, 3 * sizeof(smallfelem));
1554
1555 for (i = 0; i < size; i++) {
1556 const u64 *inlimbs = (u64 *) & pre_comp[i][0][0];
1557 u64 mask = i ^ idx;
1558 mask |= mask >> 4;
1559 mask |= mask >> 2;
1560 mask |= mask >> 1;
1561 mask &= 1;
1562 mask--;
1563 for (j = 0; j < NLIMBS * 3; j++)
1564 outlimbs[j] |= inlimbs[j] & mask;
1565 }
1566}
1567
1568/* get_bit returns the |i|th bit in |in| */
1569static char
1570get_bit(const felem_bytearray in, int i)
1571{
1572 if ((i < 0) || (i >= 256))
1573 return 0;
1574 return (in[i >> 3] >> (i & 7)) & 1;
1575}
1576
1577/* Interleaved point multiplication using precomputed point multiples:
1578 * The small point multiples 0*P, 1*P, ..., 17*P are in pre_comp[],
1579 * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
1580 * of the generator, using certain (large) precomputed multiples in g_pre_comp.
1581 * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
1582static void
1583batch_mul(felem x_out, felem y_out, felem z_out,
1584 const felem_bytearray scalars[], const unsigned num_points, const u8 *g_scalar,
1585 const int mixed, const smallfelem pre_comp[][17][3], const smallfelem g_pre_comp[2][16][3])
1586{
1587 int i, skip;
1588 unsigned num, gen_mul = (g_scalar != NULL);
1589 felem nq[3], ftmp;
1590 smallfelem tmp[3];
1591 u64 bits;
1592 u8 sign, digit;
1593
1594 /* set nq to the point at infinity */
1595 memset(nq, 0, 3 * sizeof(felem));
1596
1597 /*
1598 * Loop over all scalars msb-to-lsb, interleaving additions of
1599 * multiples of the generator (two in each of the last 32 rounds) and
1600 * additions of other points multiples (every 5th round).
1601 */
1602 skip = 1; /* save two point operations in the first
1603 * round */
1604 for (i = (num_points ? 255 : 31); i >= 0; --i) {
1605 /* double */
1606 if (!skip)
1607 point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
1608
1609 /* add multiples of the generator */
1610 if (gen_mul && (i <= 31)) {
1611 /* first, look 32 bits upwards */
1612 bits = get_bit(g_scalar, i + 224) << 3;
1613 bits |= get_bit(g_scalar, i + 160) << 2;
1614 bits |= get_bit(g_scalar, i + 96) << 1;
1615 bits |= get_bit(g_scalar, i + 32);
1616 /* select the point to add, in constant time */
1617 select_point(bits, 16, g_pre_comp[1], tmp);
1618
1619 if (!skip) {
1620 point_add(nq[0], nq[1], nq[2],
1621 nq[0], nq[1], nq[2],
1622 1 /* mixed */ , tmp[0], tmp[1], tmp[2]);
1623 } else {
1624 smallfelem_expand(nq[0], tmp[0]);
1625 smallfelem_expand(nq[1], tmp[1]);
1626 smallfelem_expand(nq[2], tmp[2]);
1627 skip = 0;
1628 }
1629
1630 /* second, look at the current position */
1631 bits = get_bit(g_scalar, i + 192) << 3;
1632 bits |= get_bit(g_scalar, i + 128) << 2;
1633 bits |= get_bit(g_scalar, i + 64) << 1;
1634 bits |= get_bit(g_scalar, i);
1635 /* select the point to add, in constant time */
1636 select_point(bits, 16, g_pre_comp[0], tmp);
1637 point_add(nq[0], nq[1], nq[2],
1638 nq[0], nq[1], nq[2],
1639 1 /* mixed */ , tmp[0], tmp[1], tmp[2]);
1640 }
1641 /* do other additions every 5 doublings */
1642 if (num_points && (i % 5 == 0)) {
1643 /* loop over all scalars */
1644 for (num = 0; num < num_points; ++num) {
1645 bits = get_bit(scalars[num], i + 4) << 5;
1646 bits |= get_bit(scalars[num], i + 3) << 4;
1647 bits |= get_bit(scalars[num], i + 2) << 3;
1648 bits |= get_bit(scalars[num], i + 1) << 2;
1649 bits |= get_bit(scalars[num], i) << 1;
1650 bits |= get_bit(scalars[num], i - 1);
1651 ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
1652
1653 /*
1654 * select the point to add or subtract, in
1655 * constant time
1656 */
1657 select_point(digit, 17, pre_comp[num], tmp);
1658 smallfelem_neg(ftmp, tmp[1]); /* (X, -Y, Z) is the
1659 * negative point */
1660 copy_small_conditional(ftmp, tmp[1], (((limb) sign) - 1));
1661 felem_contract(tmp[1], ftmp);
1662
1663 if (!skip) {
1664 point_add(nq[0], nq[1], nq[2],
1665 nq[0], nq[1], nq[2],
1666 mixed, tmp[0], tmp[1], tmp[2]);
1667 } else {
1668 smallfelem_expand(nq[0], tmp[0]);
1669 smallfelem_expand(nq[1], tmp[1]);
1670 smallfelem_expand(nq[2], tmp[2]);
1671 skip = 0;
1672 }
1673 }
1674 }
1675 }
1676 felem_assign(x_out, nq[0]);
1677 felem_assign(y_out, nq[1]);
1678 felem_assign(z_out, nq[2]);
1679}
1680
1681/* Precomputation for the group generator. */
1682typedef struct {
1683 smallfelem g_pre_comp[2][16][3];
1684 int references;
1685} NISTP256_PRE_COMP;
1686
1687const EC_METHOD *
1688EC_GFp_nistp256_method(void)
1689{
1690 static const EC_METHOD ret = {
1691 .flags = EC_FLAGS_DEFAULT_OCT,
1692 .field_type = NID_X9_62_prime_field,
1693 .group_init = ec_GFp_nistp256_group_init,
1694 .group_finish = ec_GFp_simple_group_finish,
1695 .group_clear_finish = ec_GFp_simple_group_clear_finish,
1696 .group_copy = ec_GFp_nist_group_copy,
1697 .group_set_curve = ec_GFp_nistp256_group_set_curve,
1698 .group_get_curve = ec_GFp_simple_group_get_curve,
1699 .group_get_degree = ec_GFp_simple_group_get_degree,
1700 .group_order_bits = ec_group_simple_order_bits,
1701 .group_check_discriminant =
1702 ec_GFp_simple_group_check_discriminant,
1703 .point_init = ec_GFp_simple_point_init,
1704 .point_finish = ec_GFp_simple_point_finish,
1705 .point_clear_finish = ec_GFp_simple_point_clear_finish,
1706 .point_copy = ec_GFp_simple_point_copy,
1707 .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity,
1708 .point_set_Jprojective_coordinates =
1709 ec_GFp_simple_set_Jprojective_coordinates,
1710 .point_get_Jprojective_coordinates =
1711 ec_GFp_simple_get_Jprojective_coordinates,
1712 .point_set_affine_coordinates =
1713 ec_GFp_simple_point_set_affine_coordinates,
1714 .point_get_affine_coordinates =
1715 ec_GFp_nistp256_point_get_affine_coordinates,
1716 .add = ec_GFp_simple_add,
1717 .dbl = ec_GFp_simple_dbl,
1718 .invert = ec_GFp_simple_invert,
1719 .is_at_infinity = ec_GFp_simple_is_at_infinity,
1720 .is_on_curve = ec_GFp_simple_is_on_curve,
1721 .point_cmp = ec_GFp_simple_cmp,
1722 .make_affine = ec_GFp_simple_make_affine,
1723 .points_make_affine = ec_GFp_simple_points_make_affine,
1724 .mul = ec_GFp_nistp256_points_mul,
1725 .precompute_mult = ec_GFp_nistp256_precompute_mult,
1726 .have_precompute_mult = ec_GFp_nistp256_have_precompute_mult,
1727 .field_mul = ec_GFp_nist_field_mul,
1728 .field_sqr = ec_GFp_nist_field_sqr,
1729 .blind_coordinates = NULL,
1730 };
1731
1732 return &ret;
1733}
1734
1735/******************************************************************************/
1736/* FUNCTIONS TO MANAGE PRECOMPUTATION
1737 */
1738
1739static NISTP256_PRE_COMP *
1740nistp256_pre_comp_new()
1741{
1742 NISTP256_PRE_COMP *ret = NULL;
1743 ret = malloc(sizeof *ret);
1744 if (!ret) {
1745 ECerror(ERR_R_MALLOC_FAILURE);
1746 return ret;
1747 }
1748 memset(ret->g_pre_comp, 0, sizeof(ret->g_pre_comp));
1749 ret->references = 1;
1750 return ret;
1751}
1752
1753static void *
1754nistp256_pre_comp_dup(void *src_)
1755{
1756 NISTP256_PRE_COMP *src = src_;
1757
1758 /* no need to actually copy, these objects never change! */
1759 CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
1760
1761 return src_;
1762}
1763
1764static void
1765nistp256_pre_comp_free(void *pre_)
1766{
1767 int i;
1768 NISTP256_PRE_COMP *pre = pre_;
1769
1770 if (!pre)
1771 return;
1772
1773 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1774 if (i > 0)
1775 return;
1776
1777 free(pre);
1778}
1779
1780static void
1781nistp256_pre_comp_clear_free(void *pre_)
1782{
1783 int i;
1784 NISTP256_PRE_COMP *pre = pre_;
1785
1786 if (!pre)
1787 return;
1788
1789 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1790 if (i > 0)
1791 return;
1792
1793 freezero(pre, sizeof *pre);
1794}
1795
1796/******************************************************************************/
1797/* OPENSSL EC_METHOD FUNCTIONS
1798 */
1799
1800int
1801ec_GFp_nistp256_group_init(EC_GROUP *group)
1802{
1803 int ret;
1804 ret = ec_GFp_simple_group_init(group);
1805 group->a_is_minus3 = 1;
1806 return ret;
1807}
1808
1809int
1810ec_GFp_nistp256_group_set_curve(EC_GROUP *group, const BIGNUM *p,
1811 const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
1812{
1813 int ret = 0;
1814 BN_CTX *new_ctx = NULL;
1815 BIGNUM *curve_p, *curve_a, *curve_b;
1816
1817 if (ctx == NULL)
1818 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1819 return 0;
1820 BN_CTX_start(ctx);
1821 if (((curve_p = BN_CTX_get(ctx)) == NULL) ||
1822 ((curve_a = BN_CTX_get(ctx)) == NULL) ||
1823 ((curve_b = BN_CTX_get(ctx)) == NULL))
1824 goto err;
1825 BN_bin2bn(nistp256_curve_params[0], sizeof(felem_bytearray), curve_p);
1826 BN_bin2bn(nistp256_curve_params[1], sizeof(felem_bytearray), curve_a);
1827 BN_bin2bn(nistp256_curve_params[2], sizeof(felem_bytearray), curve_b);
1828 if ((BN_cmp(curve_p, p)) || (BN_cmp(curve_a, a)) ||
1829 (BN_cmp(curve_b, b))) {
1830 ECerror(EC_R_WRONG_CURVE_PARAMETERS);
1831 goto err;
1832 }
1833 group->field_mod_func = BN_nist_mod_256;
1834 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1835 err:
1836 BN_CTX_end(ctx);
1837 BN_CTX_free(new_ctx);
1838 return ret;
1839}
1840
1841/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
1842 * (X', Y') = (X/Z^2, Y/Z^3) */
1843int
1844ec_GFp_nistp256_point_get_affine_coordinates(const EC_GROUP *group,
1845 const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
1846{
1847 felem z1, z2, x_in, y_in;
1848 smallfelem x_out, y_out;
1849 longfelem tmp;
1850
1851 if (EC_POINT_is_at_infinity(group, point) > 0) {
1852 ECerror(EC_R_POINT_AT_INFINITY);
1853 return 0;
1854 }
1855 if ((!BN_to_felem(x_in, &point->X)) || (!BN_to_felem(y_in, &point->Y)) ||
1856 (!BN_to_felem(z1, &point->Z)))
1857 return 0;
1858 felem_inv(z2, z1);
1859 felem_square(tmp, z2);
1860 felem_reduce(z1, tmp);
1861 felem_mul(tmp, x_in, z1);
1862 felem_reduce(x_in, tmp);
1863 felem_contract(x_out, x_in);
1864 if (x != NULL) {
1865 if (!smallfelem_to_BN(x, x_out)) {
1866 ECerror(ERR_R_BN_LIB);
1867 return 0;
1868 }
1869 }
1870 felem_mul(tmp, z1, z2);
1871 felem_reduce(z1, tmp);
1872 felem_mul(tmp, y_in, z1);
1873 felem_reduce(y_in, tmp);
1874 felem_contract(y_out, y_in);
1875 if (y != NULL) {
1876 if (!smallfelem_to_BN(y, y_out)) {
1877 ECerror(ERR_R_BN_LIB);
1878 return 0;
1879 }
1880 }
1881 return 1;
1882}
1883
1884static void
1885make_points_affine(size_t num, smallfelem points[ /* num */ ][3], smallfelem tmp_smallfelems[ /* num+1 */ ])
1886{
1887 /*
1888 * Runs in constant time, unless an input is the point at infinity
1889 * (which normally shouldn't happen).
1890 */
1891 ec_GFp_nistp_points_make_affine_internal(
1892 num,
1893 points,
1894 sizeof(smallfelem),
1895 tmp_smallfelems,
1896 (void (*) (void *)) smallfelem_one,
1897 (int (*) (const void *)) smallfelem_is_zero_int,
1898 (void (*) (void *, const void *)) smallfelem_assign,
1899 (void (*) (void *, const void *)) smallfelem_square_contract,
1900 (void (*) (void *, const void *, const void *)) smallfelem_mul_contract,
1901 (void (*) (void *, const void *)) smallfelem_inv_contract,
1902 (void (*) (void *, const void *)) smallfelem_assign /* nothing to contract */ );
1903}
1904
1905/* Computes scalar*generator + \sum scalars[i]*points[i], ignoring NULL values
1906 * Result is stored in r (r can equal one of the inputs). */
1907int
1908ec_GFp_nistp256_points_mul(const EC_GROUP *group, EC_POINT *r,
1909 const BIGNUM *scalar, size_t num, const EC_POINT *points[],
1910 const BIGNUM *scalars[], BN_CTX *ctx)
1911{
1912 int ret = 0;
1913 int j;
1914 int mixed = 0;
1915 BN_CTX *new_ctx = NULL;
1916 BIGNUM *x, *y, *z, *tmp_scalar;
1917 felem_bytearray g_secret;
1918 felem_bytearray *secrets = NULL;
1919 smallfelem(*pre_comp)[17][3] = NULL;
1920 smallfelem *tmp_smallfelems = NULL;
1921 felem_bytearray tmp;
1922 unsigned i, num_bytes;
1923 int have_pre_comp = 0;
1924 size_t num_points = num;
1925 smallfelem x_in, y_in, z_in;
1926 felem x_out, y_out, z_out;
1927 NISTP256_PRE_COMP *pre = NULL;
1928 const smallfelem(*g_pre_comp)[16][3] = NULL;
1929 EC_POINT *generator = NULL;
1930 const EC_POINT *p = NULL;
1931 const BIGNUM *p_scalar = NULL;
1932
1933 if (ctx == NULL)
1934 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1935 return 0;
1936 BN_CTX_start(ctx);
1937 if (((x = BN_CTX_get(ctx)) == NULL) ||
1938 ((y = BN_CTX_get(ctx)) == NULL) ||
1939 ((z = BN_CTX_get(ctx)) == NULL) ||
1940 ((tmp_scalar = BN_CTX_get(ctx)) == NULL))
1941 goto err;
1942
1943 if (scalar != NULL) {
1944 pre = EC_EX_DATA_get_data(group->extra_data,
1945 nistp256_pre_comp_dup, nistp256_pre_comp_free,
1946 nistp256_pre_comp_clear_free);
1947 if (pre)
1948 /* we have precomputation, try to use it */
1949 g_pre_comp = (const smallfelem(*)[16][3]) pre->g_pre_comp;
1950 else
1951 /* try to use the standard precomputation */
1952 g_pre_comp = &gmul[0];
1953 generator = EC_POINT_new(group);
1954 if (generator == NULL)
1955 goto err;
1956 /* get the generator from precomputation */
1957 if (!smallfelem_to_BN(x, g_pre_comp[0][1][0]) ||
1958 !smallfelem_to_BN(y, g_pre_comp[0][1][1]) ||
1959 !smallfelem_to_BN(z, g_pre_comp[0][1][2])) {
1960 ECerror(ERR_R_BN_LIB);
1961 goto err;
1962 }
1963 if (!EC_POINT_set_Jprojective_coordinates(group, generator,
1964 x, y, z, ctx))
1965 goto err;
1966 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
1967 /* precomputation matches generator */
1968 have_pre_comp = 1;
1969 else
1970 /*
1971 * we don't have valid precomputation: treat the
1972 * generator as a random point
1973 */
1974 num_points++;
1975 }
1976 if (num_points > 0) {
1977 if (num_points >= 3) {
1978 /*
1979 * unless we precompute multiples for just one or two
1980 * points, converting those into affine form is time
1981 * well spent
1982 */
1983 mixed = 1;
1984 }
1985 secrets = calloc(num_points, sizeof(felem_bytearray));
1986 pre_comp = calloc(num_points, 17 * 3 * sizeof(smallfelem));
1987 if (mixed) {
1988 /* XXX should do more int overflow checking */
1989 tmp_smallfelems = reallocarray(NULL,
1990 (num_points * 17 + 1), sizeof(smallfelem));
1991 }
1992 if ((secrets == NULL) || (pre_comp == NULL) || (mixed && (tmp_smallfelems == NULL))) {
1993 ECerror(ERR_R_MALLOC_FAILURE);
1994 goto err;
1995 }
1996 /*
1997 * we treat NULL scalars as 0, and NULL points as points at
1998 * infinity, i.e., they contribute nothing to the linear
1999 * combination
2000 */
2001 for (i = 0; i < num_points; ++i) {
2002 if (i == num)
2003 /*
2004 * we didn't have a valid precomputation, so
2005 * we pick the generator
2006 */
2007 {
2008 p = EC_GROUP_get0_generator(group);
2009 p_scalar = scalar;
2010 } else
2011 /* the i^th point */
2012 {
2013 p = points[i];
2014 p_scalar = scalars[i];
2015 }
2016 if ((p_scalar != NULL) && (p != NULL)) {
2017 /* reduce scalar to 0 <= scalar < 2^256 */
2018 if ((BN_num_bits(p_scalar) > 256) || (BN_is_negative(p_scalar))) {
2019 /*
2020 * this is an unusual input, and we
2021 * don't guarantee constant-timeness
2022 */
2023 if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx)) {
2024 ECerror(ERR_R_BN_LIB);
2025 goto err;
2026 }
2027 num_bytes = BN_bn2bin(tmp_scalar, tmp);
2028 } else
2029 num_bytes = BN_bn2bin(p_scalar, tmp);
2030 flip_endian(secrets[i], tmp, num_bytes);
2031 /* precompute multiples */
2032 if ((!BN_to_felem(x_out, &p->X)) ||
2033 (!BN_to_felem(y_out, &p->Y)) ||
2034 (!BN_to_felem(z_out, &p->Z)))
2035 goto err;
2036 felem_shrink(pre_comp[i][1][0], x_out);
2037 felem_shrink(pre_comp[i][1][1], y_out);
2038 felem_shrink(pre_comp[i][1][2], z_out);
2039 for (j = 2; j <= 16; ++j) {
2040 if (j & 1) {
2041 point_add_small(
2042 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
2043 pre_comp[i][1][0], pre_comp[i][1][1], pre_comp[i][1][2],
2044 pre_comp[i][j - 1][0], pre_comp[i][j - 1][1], pre_comp[i][j - 1][2]);
2045 } else {
2046 point_double_small(
2047 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
2048 pre_comp[i][j / 2][0], pre_comp[i][j / 2][1], pre_comp[i][j / 2][2]);
2049 }
2050 }
2051 }
2052 }
2053 if (mixed)
2054 make_points_affine(num_points * 17, pre_comp[0], tmp_smallfelems);
2055 }
2056 /* the scalar for the generator */
2057 if ((scalar != NULL) && (have_pre_comp)) {
2058 memset(g_secret, 0, sizeof(g_secret));
2059 /* reduce scalar to 0 <= scalar < 2^256 */
2060 if ((BN_num_bits(scalar) > 256) || (BN_is_negative(scalar))) {
2061 /*
2062 * this is an unusual input, and we don't guarantee
2063 * constant-timeness
2064 */
2065 if (!BN_nnmod(tmp_scalar, scalar, &group->order, ctx)) {
2066 ECerror(ERR_R_BN_LIB);
2067 goto err;
2068 }
2069 num_bytes = BN_bn2bin(tmp_scalar, tmp);
2070 } else
2071 num_bytes = BN_bn2bin(scalar, tmp);
2072 flip_endian(g_secret, tmp, num_bytes);
2073 /* do the multiplication with generator precomputation */
2074 batch_mul(x_out, y_out, z_out,
2075 (const felem_bytearray(*)) secrets, num_points,
2076 g_secret,
2077 mixed, (const smallfelem(*)[17][3]) pre_comp,
2078 g_pre_comp);
2079 } else
2080 /* do the multiplication without generator precomputation */
2081 batch_mul(x_out, y_out, z_out,
2082 (const felem_bytearray(*)) secrets, num_points,
2083 NULL, mixed, (const smallfelem(*)[17][3]) pre_comp, NULL);
2084 /* reduce the output to its unique minimal representation */
2085 felem_contract(x_in, x_out);
2086 felem_contract(y_in, y_out);
2087 felem_contract(z_in, z_out);
2088 if ((!smallfelem_to_BN(x, x_in)) || (!smallfelem_to_BN(y, y_in)) ||
2089 (!smallfelem_to_BN(z, z_in))) {
2090 ECerror(ERR_R_BN_LIB);
2091 goto err;
2092 }
2093 ret = EC_POINT_set_Jprojective_coordinates(group, r, x, y, z, ctx);
2094
2095 err:
2096 BN_CTX_end(ctx);
2097 EC_POINT_free(generator);
2098 BN_CTX_free(new_ctx);
2099 free(secrets);
2100 free(pre_comp);
2101 free(tmp_smallfelems);
2102 return ret;
2103}
2104
2105int
2106ec_GFp_nistp256_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
2107{
2108 int ret = 0;
2109 NISTP256_PRE_COMP *pre = NULL;
2110 int i, j;
2111 BN_CTX *new_ctx = NULL;
2112 BIGNUM *x, *y;
2113 EC_POINT *generator = NULL;
2114 smallfelem tmp_smallfelems[32];
2115 felem x_tmp, y_tmp, z_tmp;
2116
2117 /* throw away old precomputation */
2118 EC_EX_DATA_free_data(&group->extra_data, nistp256_pre_comp_dup,
2119 nistp256_pre_comp_free, nistp256_pre_comp_clear_free);
2120 if (ctx == NULL)
2121 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
2122 return 0;
2123 BN_CTX_start(ctx);
2124 if (((x = BN_CTX_get(ctx)) == NULL) ||
2125 ((y = BN_CTX_get(ctx)) == NULL))
2126 goto err;
2127 /* get the generator */
2128 if (group->generator == NULL)
2129 goto err;
2130 generator = EC_POINT_new(group);
2131 if (generator == NULL)
2132 goto err;
2133 BN_bin2bn(nistp256_curve_params[3], sizeof(felem_bytearray), x);
2134 BN_bin2bn(nistp256_curve_params[4], sizeof(felem_bytearray), y);
2135 if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
2136 goto err;
2137 if ((pre = nistp256_pre_comp_new()) == NULL)
2138 goto err;
2139 /* if the generator is the standard one, use built-in precomputation */
2140 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx)) {
2141 memcpy(pre->g_pre_comp, gmul, sizeof(pre->g_pre_comp));
2142 ret = 1;
2143 goto err;
2144 }
2145 if ((!BN_to_felem(x_tmp, &group->generator->X)) ||
2146 (!BN_to_felem(y_tmp, &group->generator->Y)) ||
2147 (!BN_to_felem(z_tmp, &group->generator->Z)))
2148 goto err;
2149 felem_shrink(pre->g_pre_comp[0][1][0], x_tmp);
2150 felem_shrink(pre->g_pre_comp[0][1][1], y_tmp);
2151 felem_shrink(pre->g_pre_comp[0][1][2], z_tmp);
2152 /*
2153 * compute 2^64*G, 2^128*G, 2^192*G for the first table, 2^32*G,
2154 * 2^96*G, 2^160*G, 2^224*G for the second one
2155 */
2156 for (i = 1; i <= 8; i <<= 1) {
2157 point_double_small(
2158 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2],
2159 pre->g_pre_comp[0][i][0], pre->g_pre_comp[0][i][1], pre->g_pre_comp[0][i][2]);
2160 for (j = 0; j < 31; ++j) {
2161 point_double_small(
2162 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2],
2163 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2]);
2164 }
2165 if (i == 8)
2166 break;
2167 point_double_small(
2168 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2],
2169 pre->g_pre_comp[1][i][0], pre->g_pre_comp[1][i][1], pre->g_pre_comp[1][i][2]);
2170 for (j = 0; j < 31; ++j) {
2171 point_double_small(
2172 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2],
2173 pre->g_pre_comp[0][2 * i][0], pre->g_pre_comp[0][2 * i][1], pre->g_pre_comp[0][2 * i][2]);
2174 }
2175 }
2176 for (i = 0; i < 2; i++) {
2177 /* g_pre_comp[i][0] is the point at infinity */
2178 memset(pre->g_pre_comp[i][0], 0, sizeof(pre->g_pre_comp[i][0]));
2179 /* the remaining multiples */
2180 /* 2^64*G + 2^128*G resp. 2^96*G + 2^160*G */
2181 point_add_small(
2182 pre->g_pre_comp[i][6][0], pre->g_pre_comp[i][6][1], pre->g_pre_comp[i][6][2],
2183 pre->g_pre_comp[i][4][0], pre->g_pre_comp[i][4][1], pre->g_pre_comp[i][4][2],
2184 pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1], pre->g_pre_comp[i][2][2]);
2185 /* 2^64*G + 2^192*G resp. 2^96*G + 2^224*G */
2186 point_add_small(
2187 pre->g_pre_comp[i][10][0], pre->g_pre_comp[i][10][1], pre->g_pre_comp[i][10][2],
2188 pre->g_pre_comp[i][8][0], pre->g_pre_comp[i][8][1], pre->g_pre_comp[i][8][2],
2189 pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1], pre->g_pre_comp[i][2][2]);
2190 /* 2^128*G + 2^192*G resp. 2^160*G + 2^224*G */
2191 point_add_small(
2192 pre->g_pre_comp[i][12][0], pre->g_pre_comp[i][12][1], pre->g_pre_comp[i][12][2],
2193 pre->g_pre_comp[i][8][0], pre->g_pre_comp[i][8][1], pre->g_pre_comp[i][8][2],
2194 pre->g_pre_comp[i][4][0], pre->g_pre_comp[i][4][1], pre->g_pre_comp[i][4][2]);
2195 /*
2196 * 2^64*G + 2^128*G + 2^192*G resp. 2^96*G + 2^160*G +
2197 * 2^224*G
2198 */
2199 point_add_small(
2200 pre->g_pre_comp[i][14][0], pre->g_pre_comp[i][14][1], pre->g_pre_comp[i][14][2],
2201 pre->g_pre_comp[i][12][0], pre->g_pre_comp[i][12][1], pre->g_pre_comp[i][12][2],
2202 pre->g_pre_comp[i][2][0], pre->g_pre_comp[i][2][1], pre->g_pre_comp[i][2][2]);
2203 for (j = 1; j < 8; ++j) {
2204 /* odd multiples: add G resp. 2^32*G */
2205 point_add_small(
2206 pre->g_pre_comp[i][2 * j + 1][0], pre->g_pre_comp[i][2 * j + 1][1], pre->g_pre_comp[i][2 * j + 1][2],
2207 pre->g_pre_comp[i][2 * j][0], pre->g_pre_comp[i][2 * j][1], pre->g_pre_comp[i][2 * j][2],
2208 pre->g_pre_comp[i][1][0], pre->g_pre_comp[i][1][1], pre->g_pre_comp[i][1][2]);
2209 }
2210 }
2211 make_points_affine(31, &(pre->g_pre_comp[0][1]), tmp_smallfelems);
2212
2213 if (!EC_EX_DATA_set_data(&group->extra_data, pre, nistp256_pre_comp_dup,
2214 nistp256_pre_comp_free, nistp256_pre_comp_clear_free))
2215 goto err;
2216 ret = 1;
2217 pre = NULL;
2218 err:
2219 BN_CTX_end(ctx);
2220 EC_POINT_free(generator);
2221 BN_CTX_free(new_ctx);
2222 nistp256_pre_comp_free(pre);
2223 return ret;
2224}
2225
2226int
2227ec_GFp_nistp256_have_precompute_mult(const EC_GROUP *group)
2228{
2229 if (EC_EX_DATA_get_data(group->extra_data, nistp256_pre_comp_dup,
2230 nistp256_pre_comp_free, nistp256_pre_comp_clear_free)
2231 != NULL)
2232 return 1;
2233 else
2234 return 0;
2235}
2236#endif
diff --git a/src/lib/libcrypto/ec/ecp_nistp521.c b/src/lib/libcrypto/ec/ecp_nistp521.c
deleted file mode 100644
index caeea14911..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistp521.c
+++ /dev/null
@@ -1,2112 +0,0 @@
1/* $OpenBSD: ecp_nistp521.c,v 1.30 2022/12/26 07:18:51 jmc Exp $ */
2/*
3 * Written by Adam Langley (Google) for the OpenSSL project
4 */
5/*
6 * Copyright (c) 2011 Google Inc.
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21/*
22 * A 64-bit implementation of the NIST P-521 elliptic curve point multiplication
23 *
24 * OpenSSL integration was taken from Emilia Kasper's work in ecp_nistp224.c.
25 * Otherwise based on Emilia's P224 work, which was inspired by my curve25519
26 * work which got its smarts from Daniel J. Bernstein's work on the same.
27 */
28
29#include <stdint.h>
30#include <string.h>
31
32#include <openssl/opensslconf.h>
33
34#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
35
36#include <openssl/err.h>
37#include "ec_local.h"
38
39#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
40 /* even with gcc, the typedef won't work for 32-bit platforms */
41 typedef __uint128_t uint128_t; /* nonstandard; implemented by gcc on 64-bit platforms */
42#else
43 #error "Need GCC 3.1 or later to define type uint128_t"
44#endif
45
46typedef uint8_t u8;
47typedef uint64_t u64;
48typedef int64_t s64;
49
50/* The underlying field.
51 *
52 * P521 operates over GF(2^521-1). We can serialise an element of this field
53 * into 66 bytes where the most significant byte contains only a single bit. We
54 * call this an felem_bytearray. */
55
56typedef u8 felem_bytearray[66];
57
58/* These are the parameters of P521, taken from FIPS 186-3, section D.1.2.5.
59 * These values are big-endian. */
60static const felem_bytearray nistp521_curve_params[5] =
61 {
62 {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* p */
63 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
64 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
66 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
67 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
68 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
69 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
70 0xff, 0xff},
71 {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* a = -3 */
72 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
73 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
74 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
75 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
76 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
77 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
78 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
79 0xff, 0xfc},
80 {0x00, 0x51, 0x95, 0x3e, 0xb9, 0x61, 0x8e, 0x1c, /* b */
81 0x9a, 0x1f, 0x92, 0x9a, 0x21, 0xa0, 0xb6, 0x85,
82 0x40, 0xee, 0xa2, 0xda, 0x72, 0x5b, 0x99, 0xb3,
83 0x15, 0xf3, 0xb8, 0xb4, 0x89, 0x91, 0x8e, 0xf1,
84 0x09, 0xe1, 0x56, 0x19, 0x39, 0x51, 0xec, 0x7e,
85 0x93, 0x7b, 0x16, 0x52, 0xc0, 0xbd, 0x3b, 0xb1,
86 0xbf, 0x07, 0x35, 0x73, 0xdf, 0x88, 0x3d, 0x2c,
87 0x34, 0xf1, 0xef, 0x45, 0x1f, 0xd4, 0x6b, 0x50,
88 0x3f, 0x00},
89 {0x00, 0xc6, 0x85, 0x8e, 0x06, 0xb7, 0x04, 0x04, /* x */
90 0xe9, 0xcd, 0x9e, 0x3e, 0xcb, 0x66, 0x23, 0x95,
91 0xb4, 0x42, 0x9c, 0x64, 0x81, 0x39, 0x05, 0x3f,
92 0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60, 0x6b, 0x4d,
93 0x3d, 0xba, 0xa1, 0x4b, 0x5e, 0x77, 0xef, 0xe7,
94 0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff,
95 0xa8, 0xde, 0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a,
96 0x42, 0x9b, 0xf9, 0x7e, 0x7e, 0x31, 0xc2, 0xe5,
97 0xbd, 0x66},
98 {0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, /* y */
99 0xc0, 0x04, 0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d,
100 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b,
101 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e,
102 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4,
103 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad,
104 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72,
105 0xc2, 0x40, 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1,
106 0x66, 0x50}
107 };
108
109/* The representation of field elements.
110 * ------------------------------------
111 *
112 * We represent field elements with nine values. These values are either 64 or
113 * 128 bits and the field element represented is:
114 * v[0]*2^0 + v[1]*2^58 + v[2]*2^116 + ... + v[8]*2^464 (mod p)
115 * Each of the nine values is called a 'limb'. Since the limbs are spaced only
116 * 58 bits apart, but are greater than 58 bits in length, the most significant
117 * bits of each limb overlap with the least significant bits of the next.
118 *
119 * A field element with 64-bit limbs is an 'felem'. One with 128-bit limbs is a
120 * 'largefelem' */
121
122#define NLIMBS 9
123
124typedef uint64_t limb;
125typedef limb felem[NLIMBS];
126typedef uint128_t largefelem[NLIMBS];
127
128static const limb bottom57bits = 0x1ffffffffffffff;
129static const limb bottom58bits = 0x3ffffffffffffff;
130
131/* bin66_to_felem takes a little-endian byte array and converts it into felem
132 * form. This assumes that the CPU is little-endian. */
133static void
134bin66_to_felem(felem out, const u8 in[66])
135{
136 out[0] = (*((limb *) & in[0])) & bottom58bits;
137 out[1] = (*((limb *) & in[7]) >> 2) & bottom58bits;
138 out[2] = (*((limb *) & in[14]) >> 4) & bottom58bits;
139 out[3] = (*((limb *) & in[21]) >> 6) & bottom58bits;
140 out[4] = (*((limb *) & in[29])) & bottom58bits;
141 out[5] = (*((limb *) & in[36]) >> 2) & bottom58bits;
142 out[6] = (*((limb *) & in[43]) >> 4) & bottom58bits;
143 out[7] = (*((limb *) & in[50]) >> 6) & bottom58bits;
144 out[8] = (*((limb *) & in[58])) & bottom57bits;
145}
146
147/* felem_to_bin66 takes an felem and serialises into a little endian, 66 byte
148 * array. This assumes that the CPU is little-endian. */
149static void
150felem_to_bin66(u8 out[66], const felem in)
151{
152 memset(out, 0, 66);
153 (*((limb *) & out[0])) = in[0];
154 (*((limb *) & out[7])) |= in[1] << 2;
155 (*((limb *) & out[14])) |= in[2] << 4;
156 (*((limb *) & out[21])) |= in[3] << 6;
157 (*((limb *) & out[29])) = in[4];
158 (*((limb *) & out[36])) |= in[5] << 2;
159 (*((limb *) & out[43])) |= in[6] << 4;
160 (*((limb *) & out[50])) |= in[7] << 6;
161 (*((limb *) & out[58])) = in[8];
162}
163
164/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
165static void
166flip_endian(u8 *out, const u8 *in, unsigned len)
167{
168 unsigned i;
169 for (i = 0; i < len; ++i)
170 out[i] = in[len - 1 - i];
171}
172
173/* BN_to_felem converts an OpenSSL BIGNUM into an felem */
174static int
175BN_to_felem(felem out, const BIGNUM *bn)
176{
177 felem_bytearray b_in;
178 felem_bytearray b_out;
179 unsigned num_bytes;
180
181 /* BN_bn2bin eats leading zeroes */
182 memset(b_out, 0, sizeof b_out);
183 num_bytes = BN_num_bytes(bn);
184 if (num_bytes > sizeof b_out) {
185 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
186 return 0;
187 }
188 if (BN_is_negative(bn)) {
189 ECerror(EC_R_BIGNUM_OUT_OF_RANGE);
190 return 0;
191 }
192 num_bytes = BN_bn2bin(bn, b_in);
193 flip_endian(b_out, b_in, num_bytes);
194 bin66_to_felem(out, b_out);
195 return 1;
196}
197
198/* felem_to_BN converts an felem into an OpenSSL BIGNUM */
199static BIGNUM *
200felem_to_BN(BIGNUM *out, const felem in)
201{
202 felem_bytearray b_in, b_out;
203 felem_to_bin66(b_in, in);
204 flip_endian(b_out, b_in, sizeof b_out);
205 return BN_bin2bn(b_out, sizeof b_out, out);
206}
207
208
209/* Field operations
210 * ---------------- */
211
212static void
213felem_one(felem out)
214{
215 out[0] = 1;
216 out[1] = 0;
217 out[2] = 0;
218 out[3] = 0;
219 out[4] = 0;
220 out[5] = 0;
221 out[6] = 0;
222 out[7] = 0;
223 out[8] = 0;
224}
225
226static void
227felem_assign(felem out, const felem in)
228{
229 out[0] = in[0];
230 out[1] = in[1];
231 out[2] = in[2];
232 out[3] = in[3];
233 out[4] = in[4];
234 out[5] = in[5];
235 out[6] = in[6];
236 out[7] = in[7];
237 out[8] = in[8];
238}
239
240/* felem_sum64 sets out = out + in. */
241static void
242felem_sum64(felem out, const felem in)
243{
244 out[0] += in[0];
245 out[1] += in[1];
246 out[2] += in[2];
247 out[3] += in[3];
248 out[4] += in[4];
249 out[5] += in[5];
250 out[6] += in[6];
251 out[7] += in[7];
252 out[8] += in[8];
253}
254
255/* felem_scalar sets out = in * scalar */
256static void
257felem_scalar(felem out, const felem in, limb scalar)
258{
259 out[0] = in[0] * scalar;
260 out[1] = in[1] * scalar;
261 out[2] = in[2] * scalar;
262 out[3] = in[3] * scalar;
263 out[4] = in[4] * scalar;
264 out[5] = in[5] * scalar;
265 out[6] = in[6] * scalar;
266 out[7] = in[7] * scalar;
267 out[8] = in[8] * scalar;
268}
269
270/* felem_scalar64 sets out = out * scalar */
271static void
272felem_scalar64(felem out, limb scalar)
273{
274 out[0] *= scalar;
275 out[1] *= scalar;
276 out[2] *= scalar;
277 out[3] *= scalar;
278 out[4] *= scalar;
279 out[5] *= scalar;
280 out[6] *= scalar;
281 out[7] *= scalar;
282 out[8] *= scalar;
283}
284
285/* felem_scalar128 sets out = out * scalar */
286static void
287felem_scalar128(largefelem out, limb scalar)
288{
289 out[0] *= scalar;
290 out[1] *= scalar;
291 out[2] *= scalar;
292 out[3] *= scalar;
293 out[4] *= scalar;
294 out[5] *= scalar;
295 out[6] *= scalar;
296 out[7] *= scalar;
297 out[8] *= scalar;
298}
299
300/* felem_neg sets |out| to |-in|
301 * On entry:
302 * in[i] < 2^59 + 2^14
303 * On exit:
304 * out[i] < 2^62
305 */
306static void
307felem_neg(felem out, const felem in)
308{
309 /* In order to prevent underflow, we subtract from 0 mod p. */
310 static const limb two62m3 = (((limb) 1) << 62) - (((limb) 1) << 5);
311 static const limb two62m2 = (((limb) 1) << 62) - (((limb) 1) << 4);
312
313 out[0] = two62m3 - in[0];
314 out[1] = two62m2 - in[1];
315 out[2] = two62m2 - in[2];
316 out[3] = two62m2 - in[3];
317 out[4] = two62m2 - in[4];
318 out[5] = two62m2 - in[5];
319 out[6] = two62m2 - in[6];
320 out[7] = two62m2 - in[7];
321 out[8] = two62m2 - in[8];
322}
323
324/* felem_diff64 subtracts |in| from |out|
325 * On entry:
326 * in[i] < 2^59 + 2^14
327 * On exit:
328 * out[i] < out[i] + 2^62
329 */
330static void
331felem_diff64(felem out, const felem in)
332{
333 /* In order to prevent underflow, we add 0 mod p before subtracting. */
334 static const limb two62m3 = (((limb) 1) << 62) - (((limb) 1) << 5);
335 static const limb two62m2 = (((limb) 1) << 62) - (((limb) 1) << 4);
336
337 out[0] += two62m3 - in[0];
338 out[1] += two62m2 - in[1];
339 out[2] += two62m2 - in[2];
340 out[3] += two62m2 - in[3];
341 out[4] += two62m2 - in[4];
342 out[5] += two62m2 - in[5];
343 out[6] += two62m2 - in[6];
344 out[7] += two62m2 - in[7];
345 out[8] += two62m2 - in[8];
346}
347
348/* felem_diff_128_64 subtracts |in| from |out|
349 * On entry:
350 * in[i] < 2^62 + 2^17
351 * On exit:
352 * out[i] < out[i] + 2^63
353 */
354static void
355felem_diff_128_64(largefelem out, const felem in)
356{
357 /* In order to prevent underflow, we add 0 mod p before subtracting. */
358 static const limb two63m6 = (((limb) 1) << 62) - (((limb) 1) << 5);
359 static const limb two63m5 = (((limb) 1) << 62) - (((limb) 1) << 4);
360
361 out[0] += two63m6 - in[0];
362 out[1] += two63m5 - in[1];
363 out[2] += two63m5 - in[2];
364 out[3] += two63m5 - in[3];
365 out[4] += two63m5 - in[4];
366 out[5] += two63m5 - in[5];
367 out[6] += two63m5 - in[6];
368 out[7] += two63m5 - in[7];
369 out[8] += two63m5 - in[8];
370}
371
372/* felem_diff_128_64 subtracts |in| from |out|
373 * On entry:
374 * in[i] < 2^126
375 * On exit:
376 * out[i] < out[i] + 2^127 - 2^69
377 */
378static void
379felem_diff128(largefelem out, const largefelem in)
380{
381 /* In order to prevent underflow, we add 0 mod p before subtracting. */
382 static const uint128_t two127m70 = (((uint128_t) 1) << 127) - (((uint128_t) 1) << 70);
383 static const uint128_t two127m69 = (((uint128_t) 1) << 127) - (((uint128_t) 1) << 69);
384
385 out[0] += (two127m70 - in[0]);
386 out[1] += (two127m69 - in[1]);
387 out[2] += (two127m69 - in[2]);
388 out[3] += (two127m69 - in[3]);
389 out[4] += (two127m69 - in[4]);
390 out[5] += (two127m69 - in[5]);
391 out[6] += (two127m69 - in[6]);
392 out[7] += (two127m69 - in[7]);
393 out[8] += (two127m69 - in[8]);
394}
395
396/* felem_square sets |out| = |in|^2
397 * On entry:
398 * in[i] < 2^62
399 * On exit:
400 * out[i] < 17 * max(in[i]) * max(in[i])
401 */
402static void
403felem_square(largefelem out, const felem in)
404{
405 felem inx2, inx4;
406 felem_scalar(inx2, in, 2);
407 felem_scalar(inx4, in, 4);
408
409 /*
410 * We have many cases were we want to do in[x] * in[y] + in[y] *
411 * in[x] This is obviously just 2 * in[x] * in[y] However, rather
412 * than do the doubling on the 128 bit result, we double one of the
413 * inputs to the multiplication by reading from |inx2|
414 */
415
416 out[0] = ((uint128_t) in[0]) * in[0];
417 out[1] = ((uint128_t) in[0]) * inx2[1];
418 out[2] = ((uint128_t) in[0]) * inx2[2] +
419 ((uint128_t) in[1]) * in[1];
420 out[3] = ((uint128_t) in[0]) * inx2[3] +
421 ((uint128_t) in[1]) * inx2[2];
422 out[4] = ((uint128_t) in[0]) * inx2[4] +
423 ((uint128_t) in[1]) * inx2[3] +
424 ((uint128_t) in[2]) * in[2];
425 out[5] = ((uint128_t) in[0]) * inx2[5] +
426 ((uint128_t) in[1]) * inx2[4] +
427 ((uint128_t) in[2]) * inx2[3];
428 out[6] = ((uint128_t) in[0]) * inx2[6] +
429 ((uint128_t) in[1]) * inx2[5] +
430 ((uint128_t) in[2]) * inx2[4] +
431 ((uint128_t) in[3]) * in[3];
432 out[7] = ((uint128_t) in[0]) * inx2[7] +
433 ((uint128_t) in[1]) * inx2[6] +
434 ((uint128_t) in[2]) * inx2[5] +
435 ((uint128_t) in[3]) * inx2[4];
436 out[8] = ((uint128_t) in[0]) * inx2[8] +
437 ((uint128_t) in[1]) * inx2[7] +
438 ((uint128_t) in[2]) * inx2[6] +
439 ((uint128_t) in[3]) * inx2[5] +
440 ((uint128_t) in[4]) * in[4];
441
442 /*
443 * The remaining limbs fall above 2^521, with the first falling at
444 * 2^522. They correspond to locations one bit up from the limbs
445 * produced above so we would have to multiply by two to align them.
446 * Again, rather than operate on the 128-bit result, we double one of
447 * the inputs to the multiplication. If we want to double for both
448 * this reason, and the reason above, then we end up multiplying by
449 * four.
450 */
451
452 /* 9 */
453 out[0] += ((uint128_t) in[1]) * inx4[8] +
454 ((uint128_t) in[2]) * inx4[7] +
455 ((uint128_t) in[3]) * inx4[6] +
456 ((uint128_t) in[4]) * inx4[5];
457
458 /* 10 */
459 out[1] += ((uint128_t) in[2]) * inx4[8] +
460 ((uint128_t) in[3]) * inx4[7] +
461 ((uint128_t) in[4]) * inx4[6] +
462 ((uint128_t) in[5]) * inx2[5];
463
464 /* 11 */
465 out[2] += ((uint128_t) in[3]) * inx4[8] +
466 ((uint128_t) in[4]) * inx4[7] +
467 ((uint128_t) in[5]) * inx4[6];
468
469 /* 12 */
470 out[3] += ((uint128_t) in[4]) * inx4[8] +
471 ((uint128_t) in[5]) * inx4[7] +
472 ((uint128_t) in[6]) * inx2[6];
473
474 /* 13 */
475 out[4] += ((uint128_t) in[5]) * inx4[8] +
476 ((uint128_t) in[6]) * inx4[7];
477
478 /* 14 */
479 out[5] += ((uint128_t) in[6]) * inx4[8] +
480 ((uint128_t) in[7]) * inx2[7];
481
482 /* 15 */
483 out[6] += ((uint128_t) in[7]) * inx4[8];
484
485 /* 16 */
486 out[7] += ((uint128_t) in[8]) * inx2[8];
487}
488
489/* felem_mul sets |out| = |in1| * |in2|
490 * On entry:
491 * in1[i] < 2^64
492 * in2[i] < 2^63
493 * On exit:
494 * out[i] < 17 * max(in1[i]) * max(in2[i])
495 */
496static void
497felem_mul(largefelem out, const felem in1, const felem in2)
498{
499 felem in2x2;
500 felem_scalar(in2x2, in2, 2);
501
502 out[0] = ((uint128_t) in1[0]) * in2[0];
503
504 out[1] = ((uint128_t) in1[0]) * in2[1] +
505 ((uint128_t) in1[1]) * in2[0];
506
507 out[2] = ((uint128_t) in1[0]) * in2[2] +
508 ((uint128_t) in1[1]) * in2[1] +
509 ((uint128_t) in1[2]) * in2[0];
510
511 out[3] = ((uint128_t) in1[0]) * in2[3] +
512 ((uint128_t) in1[1]) * in2[2] +
513 ((uint128_t) in1[2]) * in2[1] +
514 ((uint128_t) in1[3]) * in2[0];
515
516 out[4] = ((uint128_t) in1[0]) * in2[4] +
517 ((uint128_t) in1[1]) * in2[3] +
518 ((uint128_t) in1[2]) * in2[2] +
519 ((uint128_t) in1[3]) * in2[1] +
520 ((uint128_t) in1[4]) * in2[0];
521
522 out[5] = ((uint128_t) in1[0]) * in2[5] +
523 ((uint128_t) in1[1]) * in2[4] +
524 ((uint128_t) in1[2]) * in2[3] +
525 ((uint128_t) in1[3]) * in2[2] +
526 ((uint128_t) in1[4]) * in2[1] +
527 ((uint128_t) in1[5]) * in2[0];
528
529 out[6] = ((uint128_t) in1[0]) * in2[6] +
530 ((uint128_t) in1[1]) * in2[5] +
531 ((uint128_t) in1[2]) * in2[4] +
532 ((uint128_t) in1[3]) * in2[3] +
533 ((uint128_t) in1[4]) * in2[2] +
534 ((uint128_t) in1[5]) * in2[1] +
535 ((uint128_t) in1[6]) * in2[0];
536
537 out[7] = ((uint128_t) in1[0]) * in2[7] +
538 ((uint128_t) in1[1]) * in2[6] +
539 ((uint128_t) in1[2]) * in2[5] +
540 ((uint128_t) in1[3]) * in2[4] +
541 ((uint128_t) in1[4]) * in2[3] +
542 ((uint128_t) in1[5]) * in2[2] +
543 ((uint128_t) in1[6]) * in2[1] +
544 ((uint128_t) in1[7]) * in2[0];
545
546 out[8] = ((uint128_t) in1[0]) * in2[8] +
547 ((uint128_t) in1[1]) * in2[7] +
548 ((uint128_t) in1[2]) * in2[6] +
549 ((uint128_t) in1[3]) * in2[5] +
550 ((uint128_t) in1[4]) * in2[4] +
551 ((uint128_t) in1[5]) * in2[3] +
552 ((uint128_t) in1[6]) * in2[2] +
553 ((uint128_t) in1[7]) * in2[1] +
554 ((uint128_t) in1[8]) * in2[0];
555
556 /* See comment in felem_square about the use of in2x2 here */
557
558 out[0] += ((uint128_t) in1[1]) * in2x2[8] +
559 ((uint128_t) in1[2]) * in2x2[7] +
560 ((uint128_t) in1[3]) * in2x2[6] +
561 ((uint128_t) in1[4]) * in2x2[5] +
562 ((uint128_t) in1[5]) * in2x2[4] +
563 ((uint128_t) in1[6]) * in2x2[3] +
564 ((uint128_t) in1[7]) * in2x2[2] +
565 ((uint128_t) in1[8]) * in2x2[1];
566
567 out[1] += ((uint128_t) in1[2]) * in2x2[8] +
568 ((uint128_t) in1[3]) * in2x2[7] +
569 ((uint128_t) in1[4]) * in2x2[6] +
570 ((uint128_t) in1[5]) * in2x2[5] +
571 ((uint128_t) in1[6]) * in2x2[4] +
572 ((uint128_t) in1[7]) * in2x2[3] +
573 ((uint128_t) in1[8]) * in2x2[2];
574
575 out[2] += ((uint128_t) in1[3]) * in2x2[8] +
576 ((uint128_t) in1[4]) * in2x2[7] +
577 ((uint128_t) in1[5]) * in2x2[6] +
578 ((uint128_t) in1[6]) * in2x2[5] +
579 ((uint128_t) in1[7]) * in2x2[4] +
580 ((uint128_t) in1[8]) * in2x2[3];
581
582 out[3] += ((uint128_t) in1[4]) * in2x2[8] +
583 ((uint128_t) in1[5]) * in2x2[7] +
584 ((uint128_t) in1[6]) * in2x2[6] +
585 ((uint128_t) in1[7]) * in2x2[5] +
586 ((uint128_t) in1[8]) * in2x2[4];
587
588 out[4] += ((uint128_t) in1[5]) * in2x2[8] +
589 ((uint128_t) in1[6]) * in2x2[7] +
590 ((uint128_t) in1[7]) * in2x2[6] +
591 ((uint128_t) in1[8]) * in2x2[5];
592
593 out[5] += ((uint128_t) in1[6]) * in2x2[8] +
594 ((uint128_t) in1[7]) * in2x2[7] +
595 ((uint128_t) in1[8]) * in2x2[6];
596
597 out[6] += ((uint128_t) in1[7]) * in2x2[8] +
598 ((uint128_t) in1[8]) * in2x2[7];
599
600 out[7] += ((uint128_t) in1[8]) * in2x2[8];
601}
602
603static const limb bottom52bits = 0xfffffffffffff;
604
605/* felem_reduce converts a largefelem to an felem.
606 * On entry:
607 * in[i] < 2^128
608 * On exit:
609 * out[i] < 2^59 + 2^14
610 */
611static void
612felem_reduce(felem out, const largefelem in)
613{
614 u64 overflow1, overflow2;
615
616 out[0] = ((limb) in[0]) & bottom58bits;
617 out[1] = ((limb) in[1]) & bottom58bits;
618 out[2] = ((limb) in[2]) & bottom58bits;
619 out[3] = ((limb) in[3]) & bottom58bits;
620 out[4] = ((limb) in[4]) & bottom58bits;
621 out[5] = ((limb) in[5]) & bottom58bits;
622 out[6] = ((limb) in[6]) & bottom58bits;
623 out[7] = ((limb) in[7]) & bottom58bits;
624 out[8] = ((limb) in[8]) & bottom58bits;
625
626 /* out[i] < 2^58 */
627
628 out[1] += ((limb) in[0]) >> 58;
629 out[1] += (((limb) (in[0] >> 64)) & bottom52bits) << 6;
630 /*
631 * out[1] < 2^58 + 2^6 + 2^58 = 2^59 + 2^6
632 */
633 out[2] += ((limb) (in[0] >> 64)) >> 52;
634
635 out[2] += ((limb) in[1]) >> 58;
636 out[2] += (((limb) (in[1] >> 64)) & bottom52bits) << 6;
637 out[3] += ((limb) (in[1] >> 64)) >> 52;
638
639 out[3] += ((limb) in[2]) >> 58;
640 out[3] += (((limb) (in[2] >> 64)) & bottom52bits) << 6;
641 out[4] += ((limb) (in[2] >> 64)) >> 52;
642
643 out[4] += ((limb) in[3]) >> 58;
644 out[4] += (((limb) (in[3] >> 64)) & bottom52bits) << 6;
645 out[5] += ((limb) (in[3] >> 64)) >> 52;
646
647 out[5] += ((limb) in[4]) >> 58;
648 out[5] += (((limb) (in[4] >> 64)) & bottom52bits) << 6;
649 out[6] += ((limb) (in[4] >> 64)) >> 52;
650
651 out[6] += ((limb) in[5]) >> 58;
652 out[6] += (((limb) (in[5] >> 64)) & bottom52bits) << 6;
653 out[7] += ((limb) (in[5] >> 64)) >> 52;
654
655 out[7] += ((limb) in[6]) >> 58;
656 out[7] += (((limb) (in[6] >> 64)) & bottom52bits) << 6;
657 out[8] += ((limb) (in[6] >> 64)) >> 52;
658
659 out[8] += ((limb) in[7]) >> 58;
660 out[8] += (((limb) (in[7] >> 64)) & bottom52bits) << 6;
661 /*
662 * out[x > 1] < 2^58 + 2^6 + 2^58 + 2^12 < 2^59 + 2^13
663 */
664 overflow1 = ((limb) (in[7] >> 64)) >> 52;
665
666 overflow1 += ((limb) in[8]) >> 58;
667 overflow1 += (((limb) (in[8] >> 64)) & bottom52bits) << 6;
668 overflow2 = ((limb) (in[8] >> 64)) >> 52;
669
670 overflow1 <<= 1; /* overflow1 < 2^13 + 2^7 + 2^59 */
671 overflow2 <<= 1; /* overflow2 < 2^13 */
672
673 out[0] += overflow1; /* out[0] < 2^60 */
674 out[1] += overflow2; /* out[1] < 2^59 + 2^6 + 2^13 */
675
676 out[1] += out[0] >> 58;
677 out[0] &= bottom58bits;
678 /*
679 * out[0] < 2^58 out[1] < 2^59 + 2^6 + 2^13 + 2^2 < 2^59 + 2^14
680 */
681}
682
683static void
684felem_square_reduce(felem out, const felem in)
685{
686 largefelem tmp;
687 felem_square(tmp, in);
688 felem_reduce(out, tmp);
689}
690
691static void
692felem_mul_reduce(felem out, const felem in1, const felem in2)
693{
694 largefelem tmp;
695 felem_mul(tmp, in1, in2);
696 felem_reduce(out, tmp);
697}
698
699/* felem_inv calculates |out| = |in|^{-1}
700 *
701 * Based on Fermat's Little Theorem:
702 * a^p = a (mod p)
703 * a^{p-1} = 1 (mod p)
704 * a^{p-2} = a^{-1} (mod p)
705 */
706static void
707felem_inv(felem out, const felem in)
708{
709 felem ftmp, ftmp2, ftmp3, ftmp4;
710 largefelem tmp;
711 unsigned i;
712
713 felem_square(tmp, in);
714 felem_reduce(ftmp, tmp);/* 2^1 */
715 felem_mul(tmp, in, ftmp);
716 felem_reduce(ftmp, tmp);/* 2^2 - 2^0 */
717 felem_assign(ftmp2, ftmp);
718 felem_square(tmp, ftmp);
719 felem_reduce(ftmp, tmp);/* 2^3 - 2^1 */
720 felem_mul(tmp, in, ftmp);
721 felem_reduce(ftmp, tmp);/* 2^3 - 2^0 */
722 felem_square(tmp, ftmp);
723 felem_reduce(ftmp, tmp);/* 2^4 - 2^1 */
724
725 felem_square(tmp, ftmp2);
726 felem_reduce(ftmp3, tmp); /* 2^3 - 2^1 */
727 felem_square(tmp, ftmp3);
728 felem_reduce(ftmp3, tmp); /* 2^4 - 2^2 */
729 felem_mul(tmp, ftmp3, ftmp2);
730 felem_reduce(ftmp3, tmp); /* 2^4 - 2^0 */
731
732 felem_assign(ftmp2, ftmp3);
733 felem_square(tmp, ftmp3);
734 felem_reduce(ftmp3, tmp); /* 2^5 - 2^1 */
735 felem_square(tmp, ftmp3);
736 felem_reduce(ftmp3, tmp); /* 2^6 - 2^2 */
737 felem_square(tmp, ftmp3);
738 felem_reduce(ftmp3, tmp); /* 2^7 - 2^3 */
739 felem_square(tmp, ftmp3);
740 felem_reduce(ftmp3, tmp); /* 2^8 - 2^4 */
741 felem_assign(ftmp4, ftmp3);
742 felem_mul(tmp, ftmp3, ftmp);
743 felem_reduce(ftmp4, tmp); /* 2^8 - 2^1 */
744 felem_square(tmp, ftmp4);
745 felem_reduce(ftmp4, tmp); /* 2^9 - 2^2 */
746 felem_mul(tmp, ftmp3, ftmp2);
747 felem_reduce(ftmp3, tmp); /* 2^8 - 2^0 */
748 felem_assign(ftmp2, ftmp3);
749
750 for (i = 0; i < 8; i++) {
751 felem_square(tmp, ftmp3);
752 felem_reduce(ftmp3, tmp); /* 2^16 - 2^8 */
753 }
754 felem_mul(tmp, ftmp3, ftmp2);
755 felem_reduce(ftmp3, tmp); /* 2^16 - 2^0 */
756 felem_assign(ftmp2, ftmp3);
757
758 for (i = 0; i < 16; i++) {
759 felem_square(tmp, ftmp3);
760 felem_reduce(ftmp3, tmp); /* 2^32 - 2^16 */
761 }
762 felem_mul(tmp, ftmp3, ftmp2);
763 felem_reduce(ftmp3, tmp); /* 2^32 - 2^0 */
764 felem_assign(ftmp2, ftmp3);
765
766 for (i = 0; i < 32; i++) {
767 felem_square(tmp, ftmp3);
768 felem_reduce(ftmp3, tmp); /* 2^64 - 2^32 */
769 }
770 felem_mul(tmp, ftmp3, ftmp2);
771 felem_reduce(ftmp3, tmp); /* 2^64 - 2^0 */
772 felem_assign(ftmp2, ftmp3);
773
774 for (i = 0; i < 64; i++) {
775 felem_square(tmp, ftmp3);
776 felem_reduce(ftmp3, tmp); /* 2^128 - 2^64 */
777 }
778 felem_mul(tmp, ftmp3, ftmp2);
779 felem_reduce(ftmp3, tmp); /* 2^128 - 2^0 */
780 felem_assign(ftmp2, ftmp3);
781
782 for (i = 0; i < 128; i++) {
783 felem_square(tmp, ftmp3);
784 felem_reduce(ftmp3, tmp); /* 2^256 - 2^128 */
785 }
786 felem_mul(tmp, ftmp3, ftmp2);
787 felem_reduce(ftmp3, tmp); /* 2^256 - 2^0 */
788 felem_assign(ftmp2, ftmp3);
789
790 for (i = 0; i < 256; i++) {
791 felem_square(tmp, ftmp3);
792 felem_reduce(ftmp3, tmp); /* 2^512 - 2^256 */
793 }
794 felem_mul(tmp, ftmp3, ftmp2);
795 felem_reduce(ftmp3, tmp); /* 2^512 - 2^0 */
796
797 for (i = 0; i < 9; i++) {
798 felem_square(tmp, ftmp3);
799 felem_reduce(ftmp3, tmp); /* 2^521 - 2^9 */
800 }
801 felem_mul(tmp, ftmp3, ftmp4);
802 felem_reduce(ftmp3, tmp); /* 2^512 - 2^2 */
803 felem_mul(tmp, ftmp3, in);
804 felem_reduce(out, tmp); /* 2^512 - 3 */
805}
806
807/* This is 2^521-1, expressed as an felem */
808static const felem kPrime =
809{
810 0x03ffffffffffffff, 0x03ffffffffffffff, 0x03ffffffffffffff,
811 0x03ffffffffffffff, 0x03ffffffffffffff, 0x03ffffffffffffff,
812 0x03ffffffffffffff, 0x03ffffffffffffff, 0x01ffffffffffffff
813};
814
815/* felem_is_zero returns a limb with all bits set if |in| == 0 (mod p) and 0
816 * otherwise.
817 * On entry:
818 * in[i] < 2^59 + 2^14
819 */
820static limb
821felem_is_zero(const felem in)
822{
823 felem ftmp;
824 limb is_zero, is_p;
825 felem_assign(ftmp, in);
826
827 ftmp[0] += ftmp[8] >> 57;
828 ftmp[8] &= bottom57bits;
829 /* ftmp[8] < 2^57 */
830 ftmp[1] += ftmp[0] >> 58;
831 ftmp[0] &= bottom58bits;
832 ftmp[2] += ftmp[1] >> 58;
833 ftmp[1] &= bottom58bits;
834 ftmp[3] += ftmp[2] >> 58;
835 ftmp[2] &= bottom58bits;
836 ftmp[4] += ftmp[3] >> 58;
837 ftmp[3] &= bottom58bits;
838 ftmp[5] += ftmp[4] >> 58;
839 ftmp[4] &= bottom58bits;
840 ftmp[6] += ftmp[5] >> 58;
841 ftmp[5] &= bottom58bits;
842 ftmp[7] += ftmp[6] >> 58;
843 ftmp[6] &= bottom58bits;
844 ftmp[8] += ftmp[7] >> 58;
845 ftmp[7] &= bottom58bits;
846 /* ftmp[8] < 2^57 + 4 */
847
848 /*
849 * The ninth limb of 2*(2^521-1) is 0x03ffffffffffffff, which is
850 * greater than our bound for ftmp[8]. Therefore we only have to
851 * check if the zero is zero or 2^521-1.
852 */
853
854 is_zero = 0;
855 is_zero |= ftmp[0];
856 is_zero |= ftmp[1];
857 is_zero |= ftmp[2];
858 is_zero |= ftmp[3];
859 is_zero |= ftmp[4];
860 is_zero |= ftmp[5];
861 is_zero |= ftmp[6];
862 is_zero |= ftmp[7];
863 is_zero |= ftmp[8];
864
865 is_zero--;
866 /*
867 * We know that ftmp[i] < 2^63, therefore the only way that the top
868 * bit can be set is if is_zero was 0 before the decrement.
869 */
870 is_zero = ((s64) is_zero) >> 63;
871
872 is_p = ftmp[0] ^ kPrime[0];
873 is_p |= ftmp[1] ^ kPrime[1];
874 is_p |= ftmp[2] ^ kPrime[2];
875 is_p |= ftmp[3] ^ kPrime[3];
876 is_p |= ftmp[4] ^ kPrime[4];
877 is_p |= ftmp[5] ^ kPrime[5];
878 is_p |= ftmp[6] ^ kPrime[6];
879 is_p |= ftmp[7] ^ kPrime[7];
880 is_p |= ftmp[8] ^ kPrime[8];
881
882 is_p--;
883 is_p = ((s64) is_p) >> 63;
884
885 is_zero |= is_p;
886 return is_zero;
887}
888
889static int
890felem_is_zero_int(const felem in)
891{
892 return (int) (felem_is_zero(in) & ((limb) 1));
893}
894
895/* felem_contract converts |in| to its unique, minimal representation.
896 * On entry:
897 * in[i] < 2^59 + 2^14
898 */
899static void
900felem_contract(felem out, const felem in)
901{
902 limb is_p, is_greater, sign;
903 static const limb two58 = ((limb) 1) << 58;
904
905 felem_assign(out, in);
906
907 out[0] += out[8] >> 57;
908 out[8] &= bottom57bits;
909 /* out[8] < 2^57 */
910 out[1] += out[0] >> 58;
911 out[0] &= bottom58bits;
912 out[2] += out[1] >> 58;
913 out[1] &= bottom58bits;
914 out[3] += out[2] >> 58;
915 out[2] &= bottom58bits;
916 out[4] += out[3] >> 58;
917 out[3] &= bottom58bits;
918 out[5] += out[4] >> 58;
919 out[4] &= bottom58bits;
920 out[6] += out[5] >> 58;
921 out[5] &= bottom58bits;
922 out[7] += out[6] >> 58;
923 out[6] &= bottom58bits;
924 out[8] += out[7] >> 58;
925 out[7] &= bottom58bits;
926 /* out[8] < 2^57 + 4 */
927
928 /*
929 * If the value is greater than 2^521-1 then we have to subtract
930 * 2^521-1 out. See the comments in felem_is_zero regarding why we
931 * don't test for other multiples of the prime.
932 */
933
934 /*
935 * First, if |out| is equal to 2^521-1, we subtract it out to get
936 * zero.
937 */
938
939 is_p = out[0] ^ kPrime[0];
940 is_p |= out[1] ^ kPrime[1];
941 is_p |= out[2] ^ kPrime[2];
942 is_p |= out[3] ^ kPrime[3];
943 is_p |= out[4] ^ kPrime[4];
944 is_p |= out[5] ^ kPrime[5];
945 is_p |= out[6] ^ kPrime[6];
946 is_p |= out[7] ^ kPrime[7];
947 is_p |= out[8] ^ kPrime[8];
948
949 is_p--;
950 is_p &= is_p << 32;
951 is_p &= is_p << 16;
952 is_p &= is_p << 8;
953 is_p &= is_p << 4;
954 is_p &= is_p << 2;
955 is_p &= is_p << 1;
956 is_p = ((s64) is_p) >> 63;
957 is_p = ~is_p;
958
959 /* is_p is 0 iff |out| == 2^521-1 and all ones otherwise */
960
961 out[0] &= is_p;
962 out[1] &= is_p;
963 out[2] &= is_p;
964 out[3] &= is_p;
965 out[4] &= is_p;
966 out[5] &= is_p;
967 out[6] &= is_p;
968 out[7] &= is_p;
969 out[8] &= is_p;
970
971 /*
972 * In order to test that |out| >= 2^521-1 we need only test if out[8]
973 * >> 57 is greater than zero as (2^521-1) + x >= 2^522
974 */
975 is_greater = out[8] >> 57;
976 is_greater |= is_greater << 32;
977 is_greater |= is_greater << 16;
978 is_greater |= is_greater << 8;
979 is_greater |= is_greater << 4;
980 is_greater |= is_greater << 2;
981 is_greater |= is_greater << 1;
982 is_greater = ((s64) is_greater) >> 63;
983
984 out[0] -= kPrime[0] & is_greater;
985 out[1] -= kPrime[1] & is_greater;
986 out[2] -= kPrime[2] & is_greater;
987 out[3] -= kPrime[3] & is_greater;
988 out[4] -= kPrime[4] & is_greater;
989 out[5] -= kPrime[5] & is_greater;
990 out[6] -= kPrime[6] & is_greater;
991 out[7] -= kPrime[7] & is_greater;
992 out[8] -= kPrime[8] & is_greater;
993
994 /* Eliminate negative coefficients */
995 sign = -(out[0] >> 63);
996 out[0] += (two58 & sign);
997 out[1] -= (1 & sign);
998 sign = -(out[1] >> 63);
999 out[1] += (two58 & sign);
1000 out[2] -= (1 & sign);
1001 sign = -(out[2] >> 63);
1002 out[2] += (two58 & sign);
1003 out[3] -= (1 & sign);
1004 sign = -(out[3] >> 63);
1005 out[3] += (two58 & sign);
1006 out[4] -= (1 & sign);
1007 sign = -(out[4] >> 63);
1008 out[4] += (two58 & sign);
1009 out[5] -= (1 & sign);
1010 sign = -(out[0] >> 63);
1011 out[5] += (two58 & sign);
1012 out[6] -= (1 & sign);
1013 sign = -(out[6] >> 63);
1014 out[6] += (two58 & sign);
1015 out[7] -= (1 & sign);
1016 sign = -(out[7] >> 63);
1017 out[7] += (two58 & sign);
1018 out[8] -= (1 & sign);
1019 sign = -(out[5] >> 63);
1020 out[5] += (two58 & sign);
1021 out[6] -= (1 & sign);
1022 sign = -(out[6] >> 63);
1023 out[6] += (two58 & sign);
1024 out[7] -= (1 & sign);
1025 sign = -(out[7] >> 63);
1026 out[7] += (two58 & sign);
1027 out[8] -= (1 & sign);
1028}
1029
1030/* Group operations
1031 * ----------------
1032 *
1033 * Building on top of the field operations we have the operations on the
1034 * elliptic curve group itself. Points on the curve are represented in Jacobian
1035 * coordinates */
1036
1037/* point_double calculates 2*(x_in, y_in, z_in)
1038 *
1039 * The method is taken from:
1040 * http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
1041 *
1042 * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed.
1043 * while x_out == y_in is not (maybe this works, but it's not tested). */
1044static void
1045point_double(felem x_out, felem y_out, felem z_out,
1046 const felem x_in, const felem y_in, const felem z_in)
1047{
1048 largefelem tmp, tmp2;
1049 felem delta, gamma, beta, alpha, ftmp, ftmp2;
1050
1051 felem_assign(ftmp, x_in);
1052 felem_assign(ftmp2, x_in);
1053
1054 /* delta = z^2 */
1055 felem_square(tmp, z_in);
1056 felem_reduce(delta, tmp); /* delta[i] < 2^59 + 2^14 */
1057
1058 /* gamma = y^2 */
1059 felem_square(tmp, y_in);
1060 felem_reduce(gamma, tmp); /* gamma[i] < 2^59 + 2^14 */
1061
1062 /* beta = x*gamma */
1063 felem_mul(tmp, x_in, gamma);
1064 felem_reduce(beta, tmp);/* beta[i] < 2^59 + 2^14 */
1065
1066 /* alpha = 3*(x-delta)*(x+delta) */
1067 felem_diff64(ftmp, delta);
1068 /* ftmp[i] < 2^61 */
1069 felem_sum64(ftmp2, delta);
1070 /* ftmp2[i] < 2^60 + 2^15 */
1071 felem_scalar64(ftmp2, 3);
1072 /* ftmp2[i] < 3*2^60 + 3*2^15 */
1073 felem_mul(tmp, ftmp, ftmp2);
1074 /*
1075 * tmp[i] < 17(3*2^121 + 3*2^76) = 61*2^121 + 61*2^76 < 64*2^121 +
1076 * 64*2^76 = 2^127 + 2^82 < 2^128
1077 */
1078 felem_reduce(alpha, tmp);
1079
1080 /* x' = alpha^2 - 8*beta */
1081 felem_square(tmp, alpha);
1082 /*
1083 * tmp[i] < 17*2^120 < 2^125
1084 */
1085 felem_assign(ftmp, beta);
1086 felem_scalar64(ftmp, 8);
1087 /* ftmp[i] < 2^62 + 2^17 */
1088 felem_diff_128_64(tmp, ftmp);
1089 /* tmp[i] < 2^125 + 2^63 + 2^62 + 2^17 */
1090 felem_reduce(x_out, tmp);
1091
1092 /* z' = (y + z)^2 - gamma - delta */
1093 felem_sum64(delta, gamma);
1094 /* delta[i] < 2^60 + 2^15 */
1095 felem_assign(ftmp, y_in);
1096 felem_sum64(ftmp, z_in);
1097 /* ftmp[i] < 2^60 + 2^15 */
1098 felem_square(tmp, ftmp);
1099 /*
1100 * tmp[i] < 17(2^122) < 2^127
1101 */
1102 felem_diff_128_64(tmp, delta);
1103 /* tmp[i] < 2^127 + 2^63 */
1104 felem_reduce(z_out, tmp);
1105
1106 /* y' = alpha*(4*beta - x') - 8*gamma^2 */
1107 felem_scalar64(beta, 4);
1108 /* beta[i] < 2^61 + 2^16 */
1109 felem_diff64(beta, x_out);
1110 /* beta[i] < 2^61 + 2^60 + 2^16 */
1111 felem_mul(tmp, alpha, beta);
1112 /*
1113 * tmp[i] < 17*((2^59 + 2^14)(2^61 + 2^60 + 2^16)) = 17*(2^120 + 2^75
1114 * + 2^119 + 2^74 + 2^75 + 2^30) = 17*(2^120 + 2^119 + 2^76 + 2^74 +
1115 * 2^30) < 2^128
1116 */
1117 felem_square(tmp2, gamma);
1118 /*
1119 * tmp2[i] < 17*(2^59 + 2^14)^2 = 17*(2^118 + 2^74 + 2^28)
1120 */
1121 felem_scalar128(tmp2, 8);
1122 /*
1123 * tmp2[i] < 8*17*(2^118 + 2^74 + 2^28) = 2^125 + 2^121 + 2^81 + 2^77
1124 * + 2^35 + 2^31 < 2^126
1125 */
1126 felem_diff128(tmp, tmp2);
1127 /*
1128 * tmp[i] < 2^127 - 2^69 + 17(2^120 + 2^119 + 2^76 + 2^74 + 2^30) =
1129 * 2^127 + 2^124 + 2^122 + 2^120 + 2^118 + 2^80 + 2^78 + 2^76 + 2^74
1130 * + 2^69 + 2^34 + 2^30 < 2^128
1131 */
1132 felem_reduce(y_out, tmp);
1133}
1134
1135/* copy_conditional copies in to out iff mask is all ones. */
1136static void
1137copy_conditional(felem out, const felem in, limb mask)
1138{
1139 unsigned i;
1140 for (i = 0; i < NLIMBS; ++i) {
1141 const limb tmp = mask & (in[i] ^ out[i]);
1142 out[i] ^= tmp;
1143 }
1144}
1145
1146/* point_add calculates (x1, y1, z1) + (x2, y2, z2)
1147 *
1148 * The method is taken from
1149 * http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl,
1150 * adapted for mixed addition (z2 = 1, or z2 = 0 for the point at infinity).
1151 *
1152 * This function includes a branch for checking whether the two input points
1153 * are equal (while not equal to the point at infinity). This case never
1154 * happens during single point multiplication, so there is no timing leak for
1155 * ECDH or ECDSA signing. */
1156static void
1157point_add(felem x3, felem y3, felem z3,
1158 const felem x1, const felem y1, const felem z1,
1159 const int mixed, const felem x2, const felem y2, const felem z2)
1160{
1161 felem ftmp, ftmp2, ftmp3, ftmp4, ftmp5, ftmp6, x_out, y_out, z_out;
1162 largefelem tmp, tmp2;
1163 limb x_equal, y_equal, z1_is_zero, z2_is_zero;
1164
1165 z1_is_zero = felem_is_zero(z1);
1166 z2_is_zero = felem_is_zero(z2);
1167
1168 /* ftmp = z1z1 = z1**2 */
1169 felem_square(tmp, z1);
1170 felem_reduce(ftmp, tmp);
1171
1172 if (!mixed) {
1173 /* ftmp2 = z2z2 = z2**2 */
1174 felem_square(tmp, z2);
1175 felem_reduce(ftmp2, tmp);
1176
1177 /* u1 = ftmp3 = x1*z2z2 */
1178 felem_mul(tmp, x1, ftmp2);
1179 felem_reduce(ftmp3, tmp);
1180
1181 /* ftmp5 = z1 + z2 */
1182 felem_assign(ftmp5, z1);
1183 felem_sum64(ftmp5, z2);
1184 /* ftmp5[i] < 2^61 */
1185
1186 /* ftmp5 = (z1 + z2)**2 - z1z1 - z2z2 = 2*z1z2 */
1187 felem_square(tmp, ftmp5);
1188 /* tmp[i] < 17*2^122 */
1189 felem_diff_128_64(tmp, ftmp);
1190 /* tmp[i] < 17*2^122 + 2^63 */
1191 felem_diff_128_64(tmp, ftmp2);
1192 /* tmp[i] < 17*2^122 + 2^64 */
1193 felem_reduce(ftmp5, tmp);
1194
1195 /* ftmp2 = z2 * z2z2 */
1196 felem_mul(tmp, ftmp2, z2);
1197 felem_reduce(ftmp2, tmp);
1198
1199 /* s1 = ftmp6 = y1 * z2**3 */
1200 felem_mul(tmp, y1, ftmp2);
1201 felem_reduce(ftmp6, tmp);
1202 } else {
1203 /* We'll assume z2 = 1 (special case z2 = 0 is handled later) */
1204
1205 /* u1 = ftmp3 = x1*z2z2 */
1206 felem_assign(ftmp3, x1);
1207
1208 /* ftmp5 = 2*z1z2 */
1209 felem_scalar(ftmp5, z1, 2);
1210
1211 /* s1 = ftmp6 = y1 * z2**3 */
1212 felem_assign(ftmp6, y1);
1213 }
1214
1215 /* u2 = x2*z1z1 */
1216 felem_mul(tmp, x2, ftmp);
1217 /* tmp[i] < 17*2^120 */
1218
1219 /* h = ftmp4 = u2 - u1 */
1220 felem_diff_128_64(tmp, ftmp3);
1221 /* tmp[i] < 17*2^120 + 2^63 */
1222 felem_reduce(ftmp4, tmp);
1223
1224 x_equal = felem_is_zero(ftmp4);
1225
1226 /* z_out = ftmp5 * h */
1227 felem_mul(tmp, ftmp5, ftmp4);
1228 felem_reduce(z_out, tmp);
1229
1230 /* ftmp = z1 * z1z1 */
1231 felem_mul(tmp, ftmp, z1);
1232 felem_reduce(ftmp, tmp);
1233
1234 /* s2 = tmp = y2 * z1**3 */
1235 felem_mul(tmp, y2, ftmp);
1236 /* tmp[i] < 17*2^120 */
1237
1238 /* r = ftmp5 = (s2 - s1)*2 */
1239 felem_diff_128_64(tmp, ftmp6);
1240 /* tmp[i] < 17*2^120 + 2^63 */
1241 felem_reduce(ftmp5, tmp);
1242 y_equal = felem_is_zero(ftmp5);
1243 felem_scalar64(ftmp5, 2);
1244 /* ftmp5[i] < 2^61 */
1245
1246 if (x_equal && y_equal && !z1_is_zero && !z2_is_zero) {
1247 point_double(x3, y3, z3, x1, y1, z1);
1248 return;
1249 }
1250 /* I = ftmp = (2h)**2 */
1251 felem_assign(ftmp, ftmp4);
1252 felem_scalar64(ftmp, 2);
1253 /* ftmp[i] < 2^61 */
1254 felem_square(tmp, ftmp);
1255 /* tmp[i] < 17*2^122 */
1256 felem_reduce(ftmp, tmp);
1257
1258 /* J = ftmp2 = h * I */
1259 felem_mul(tmp, ftmp4, ftmp);
1260 felem_reduce(ftmp2, tmp);
1261
1262 /* V = ftmp4 = U1 * I */
1263 felem_mul(tmp, ftmp3, ftmp);
1264 felem_reduce(ftmp4, tmp);
1265
1266 /* x_out = r**2 - J - 2V */
1267 felem_square(tmp, ftmp5);
1268 /* tmp[i] < 17*2^122 */
1269 felem_diff_128_64(tmp, ftmp2);
1270 /* tmp[i] < 17*2^122 + 2^63 */
1271 felem_assign(ftmp3, ftmp4);
1272 felem_scalar64(ftmp4, 2);
1273 /* ftmp4[i] < 2^61 */
1274 felem_diff_128_64(tmp, ftmp4);
1275 /* tmp[i] < 17*2^122 + 2^64 */
1276 felem_reduce(x_out, tmp);
1277
1278 /* y_out = r(V-x_out) - 2 * s1 * J */
1279 felem_diff64(ftmp3, x_out);
1280 /*
1281 * ftmp3[i] < 2^60 + 2^60 = 2^61
1282 */
1283 felem_mul(tmp, ftmp5, ftmp3);
1284 /* tmp[i] < 17*2^122 */
1285 felem_mul(tmp2, ftmp6, ftmp2);
1286 /* tmp2[i] < 17*2^120 */
1287 felem_scalar128(tmp2, 2);
1288 /* tmp2[i] < 17*2^121 */
1289 felem_diff128(tmp, tmp2);
1290 /*
1291 * tmp[i] < 2^127 - 2^69 + 17*2^122 = 2^126 - 2^122 - 2^6 - 2^2 - 1 <
1292 * 2^127
1293 */
1294 felem_reduce(y_out, tmp);
1295
1296 copy_conditional(x_out, x2, z1_is_zero);
1297 copy_conditional(x_out, x1, z2_is_zero);
1298 copy_conditional(y_out, y2, z1_is_zero);
1299 copy_conditional(y_out, y1, z2_is_zero);
1300 copy_conditional(z_out, z2, z1_is_zero);
1301 copy_conditional(z_out, z1, z2_is_zero);
1302 felem_assign(x3, x_out);
1303 felem_assign(y3, y_out);
1304 felem_assign(z3, z_out);
1305}
1306
1307/* Base point pre computation
1308 * --------------------------
1309 *
1310 * Two different sorts of precomputed tables are used in the following code.
1311 * Each contain various points on the curve, where each point is three field
1312 * elements (x, y, z).
1313 *
1314 * For the base point table, z is usually 1 (0 for the point at infinity).
1315 * This table has 16 elements:
1316 * index | bits | point
1317 * ------+---------+------------------------------
1318 * 0 | 0 0 0 0 | 0G
1319 * 1 | 0 0 0 1 | 1G
1320 * 2 | 0 0 1 0 | 2^130G
1321 * 3 | 0 0 1 1 | (2^130 + 1)G
1322 * 4 | 0 1 0 0 | 2^260G
1323 * 5 | 0 1 0 1 | (2^260 + 1)G
1324 * 6 | 0 1 1 0 | (2^260 + 2^130)G
1325 * 7 | 0 1 1 1 | (2^260 + 2^130 + 1)G
1326 * 8 | 1 0 0 0 | 2^390G
1327 * 9 | 1 0 0 1 | (2^390 + 1)G
1328 * 10 | 1 0 1 0 | (2^390 + 2^130)G
1329 * 11 | 1 0 1 1 | (2^390 + 2^130 + 1)G
1330 * 12 | 1 1 0 0 | (2^390 + 2^260)G
1331 * 13 | 1 1 0 1 | (2^390 + 2^260 + 1)G
1332 * 14 | 1 1 1 0 | (2^390 + 2^260 + 2^130)G
1333 * 15 | 1 1 1 1 | (2^390 + 2^260 + 2^130 + 1)G
1334 *
1335 * The reason for this is so that we can clock bits into four different
1336 * locations when doing simple scalar multiplies against the base point.
1337 *
1338 * Tables for other points have table[i] = iG for i in 0 .. 16. */
1339
1340/* gmul is the table of precomputed base points */
1341static const felem gmul[16][3] =
1342{{{0, 0, 0, 0, 0, 0, 0, 0, 0},
1343{0, 0, 0, 0, 0, 0, 0, 0, 0},
1344{0, 0, 0, 0, 0, 0, 0, 0, 0}},
1345{{0x017e7e31c2e5bd66, 0x022cf0615a90a6fe, 0x00127a2ffa8de334,
1346 0x01dfbf9d64a3f877, 0x006b4d3dbaa14b5e, 0x014fed487e0a2bd8,
13470x015b4429c6481390, 0x03a73678fb2d988e, 0x00c6858e06b70404},
1348{0x00be94769fd16650, 0x031c21a89cb09022, 0x039013fad0761353,
1349 0x02657bd099031542, 0x03273e662c97ee72, 0x01e6d11a05ebef45,
13500x03d1bd998f544495, 0x03001172297ed0b1, 0x011839296a789a3b},
1351{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1352{{0x0373faacbc875bae, 0x00f325023721c671, 0x00f666fd3dbde5ad,
1353 0x01a6932363f88ea7, 0x01fc6d9e13f9c47b, 0x03bcbffc2bbf734e,
13540x013ee3c3647f3a92, 0x029409fefe75d07d, 0x00ef9199963d85e5},
1355{0x011173743ad5b178, 0x02499c7c21bf7d46, 0x035beaeabb8b1a58,
1356 0x00f989c4752ea0a3, 0x0101e1de48a9c1a3, 0x01a20076be28ba6c,
13570x02f8052e5eb2de95, 0x01bfe8f82dea117c, 0x0160074d3c36ddb7},
1358{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1359{{0x012f3fc373393b3b, 0x03d3d6172f1419fa, 0x02adc943c0b86873,
1360 0x00d475584177952b, 0x012a4d1673750ee2, 0x00512517a0f13b0c,
13610x02b184671a7b1734, 0x0315b84236f1a50a, 0x00a4afc472edbdb9},
1362{0x00152a7077f385c4, 0x03044007d8d1c2ee, 0x0065829d61d52b52,
1363 0x00494ff6b6631d0d, 0x00a11d94d5f06bcf, 0x02d2f89474d9282e,
13640x0241c5727c06eeb9, 0x0386928710fbdb9d, 0x01f883f727b0dfbe},
1365{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1366{{0x019b0c3c9185544d, 0x006243a37c9d97db, 0x02ee3cbe030a2ad2,
1367 0x00cfdd946bb51e0d, 0x0271c00932606b91, 0x03f817d1ec68c561,
13680x03f37009806a369c, 0x03c1f30baf184fd5, 0x01091022d6d2f065},
1369{0x0292c583514c45ed, 0x0316fca51f9a286c, 0x00300af507c1489a,
1370 0x0295f69008298cf1, 0x02c0ed8274943d7b, 0x016509b9b47a431e,
13710x02bc9de9634868ce, 0x005b34929bffcb09, 0x000c1a0121681524},
1372{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1373{{0x0286abc0292fb9f2, 0x02665eee9805b3f7, 0x01ed7455f17f26d6,
1374 0x0346355b83175d13, 0x006284944cd0a097, 0x0191895bcdec5e51,
13750x02e288370afda7d9, 0x03b22312bfefa67a, 0x01d104d3fc0613fe},
1376{0x0092421a12f7e47f, 0x0077a83fa373c501, 0x03bd25c5f696bd0d,
1377 0x035c41e4d5459761, 0x01ca0d1742b24f53, 0x00aaab27863a509c,
13780x018b6de47df73917, 0x025c0b771705cd01, 0x01fd51d566d760a7},
1379{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1380{{0x01dd92ff6b0d1dbd, 0x039c5e2e8f8afa69, 0x0261ed13242c3b27,
1381 0x0382c6e67026e6a0, 0x01d60b10be2089f9, 0x03c15f3dce86723f,
13820x03c764a32d2a062d, 0x017307eac0fad056, 0x018207c0b96c5256},
1383{0x0196a16d60e13154, 0x03e6ce74c0267030, 0x00ddbf2b4e52a5aa,
1384 0x012738241bbf31c8, 0x00ebe8dc04685a28, 0x024c2ad6d380d4a2,
13850x035ee062a6e62d0e, 0x0029ed74af7d3a0f, 0x00eef32aec142ebd},
1386{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1387{{0x00c31ec398993b39, 0x03a9f45bcda68253, 0x00ac733c24c70890,
1388 0x00872b111401ff01, 0x01d178c23195eafb, 0x03bca2c816b87f74,
13890x0261a9af46fbad7a, 0x0324b2a8dd3d28f9, 0x00918121d8f24e23},
1390{0x032bc8c1ca983cd7, 0x00d869dfb08fc8c6, 0x01693cb61fce1516,
1391 0x012a5ea68f4e88a8, 0x010869cab88d7ae3, 0x009081ad277ceee1,
13920x033a77166d064cdc, 0x03955235a1fb3a95, 0x01251a4a9b25b65e},
1393{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1394{{0x00148a3a1b27f40b, 0x0123186df1b31fdc, 0x00026e7beaad34ce,
1395 0x01db446ac1d3dbba, 0x0299c1a33437eaec, 0x024540610183cbb7,
13960x0173bb0e9ce92e46, 0x02b937e43921214b, 0x01ab0436a9bf01b5},
1397{0x0383381640d46948, 0x008dacbf0e7f330f, 0x03602122bcc3f318,
1398 0x01ee596b200620d6, 0x03bd0585fda430b3, 0x014aed77fd123a83,
13990x005ace749e52f742, 0x0390fe041da2b842, 0x0189a8ceb3299242},
1400{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1401{{0x012a19d6b3282473, 0x00c0915918b423ce, 0x023a954eb94405ae,
1402 0x00529f692be26158, 0x0289fa1b6fa4b2aa, 0x0198ae4ceea346ef,
14030x0047d8cdfbdedd49, 0x00cc8c8953f0f6b8, 0x001424abbff49203},
1404{0x0256732a1115a03a, 0x0351bc38665c6733, 0x03f7b950fb4a6447,
1405 0x000afffa94c22155, 0x025763d0a4dab540, 0x000511e92d4fc283,
14060x030a7e9eda0ee96c, 0x004c3cd93a28bf0a, 0x017edb3a8719217f},
1407{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1408{{0x011de5675a88e673, 0x031d7d0f5e567fbe, 0x0016b2062c970ae5,
1409 0x03f4a2be49d90aa7, 0x03cef0bd13822866, 0x03f0923dcf774a6c,
14100x0284bebc4f322f72, 0x016ab2645302bb2c, 0x01793f95dace0e2a},
1411{0x010646e13527a28f, 0x01ca1babd59dc5e7, 0x01afedfd9a5595df,
1412 0x01f15785212ea6b1, 0x0324e5d64f6ae3f4, 0x02d680f526d00645,
14130x0127920fadf627a7, 0x03b383f75df4f684, 0x0089e0057e783b0a},
1414{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1415{{0x00f334b9eb3c26c6, 0x0298fdaa98568dce, 0x01c2d24843a82292,
1416 0x020bcb24fa1b0711, 0x02cbdb3d2b1875e6, 0x0014907598f89422,
14170x03abe3aa43b26664, 0x02cbf47f720bc168, 0x0133b5e73014b79b},
1418{0x034aab5dab05779d, 0x00cdc5d71fee9abb, 0x0399f16bd4bd9d30,
1419 0x03582fa592d82647, 0x02be1cdfb775b0e9, 0x0034f7cea32e94cb,
14200x0335a7f08f56f286, 0x03b707e9565d1c8b, 0x0015c946ea5b614f},
1421{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1422{{0x024676f6cff72255, 0x00d14625cac96378, 0x00532b6008bc3767,
1423 0x01fc16721b985322, 0x023355ea1b091668, 0x029de7afdc0317c3,
14240x02fc8a7ca2da037c, 0x02de1217d74a6f30, 0x013f7173175b73bf},
1425{0x0344913f441490b5, 0x0200f9e272b61eca, 0x0258a246b1dd55d2,
1426 0x03753db9ea496f36, 0x025e02937a09c5ef, 0x030cbd3d14012692,
14270x01793a67e70dc72a, 0x03ec1d37048a662e, 0x006550f700c32a8d},
1428{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1429{{0x00d3f48a347eba27, 0x008e636649b61bd8, 0x00d3b93716778fb3,
1430 0x004d1915757bd209, 0x019d5311a3da44e0, 0x016d1afcbbe6aade,
14310x0241bf5f73265616, 0x0384672e5d50d39b, 0x005009fee522b684},
1432{0x029b4fab064435fe, 0x018868ee095bbb07, 0x01ea3d6936cc92b8,
1433 0x000608b00f78a2f3, 0x02db911073d1c20f, 0x018205938470100a,
14340x01f1e4964cbe6ff2, 0x021a19a29eed4663, 0x01414485f42afa81},
1435{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1436{{0x01612b3a17f63e34, 0x03813992885428e6, 0x022b3c215b5a9608,
1437 0x029b4057e19f2fcb, 0x0384059a587af7e6, 0x02d6400ace6fe610,
14380x029354d896e8e331, 0x00c047ee6dfba65e, 0x0037720542e9d49d},
1439{0x02ce9eed7c5e9278, 0x0374ed703e79643b, 0x01316c54c4072006,
1440 0x005aaa09054b2ee8, 0x002824000c840d57, 0x03d4eba24771ed86,
14410x0189c50aabc3bdae, 0x0338c01541e15510, 0x00466d56e38eed42},
1442{1, 0, 0, 0, 0, 0, 0, 0, 0}},
1443{{0x007efd8330ad8bd6, 0x02465ed48047710b, 0x0034c6606b215e0c,
1444 0x016ae30c53cbf839, 0x01fa17bd37161216, 0x018ead4e61ce8ab9,
14450x005482ed5f5dee46, 0x037543755bba1d7f, 0x005e5ac7e70a9d0f},
1446{0x0117e1bb2fdcb2a2, 0x03deea36249f40c4, 0x028d09b4a6246cb7,
1447 0x03524b8855bcf756, 0x023d7d109d5ceb58, 0x0178e43e3223ef9c,
14480x0154536a0c6e966a, 0x037964d1286ee9fe, 0x0199bcd90e125055},
1449{1, 0, 0, 0, 0, 0, 0, 0, 0}}};
1450
1451/* select_point selects the |idx|th point from a precomputation table and
1452 * copies it to out. */
1453static void
1454select_point(const limb idx, unsigned int size, const felem pre_comp[ /* size */ ][3],
1455 felem out[3])
1456{
1457 unsigned i, j;
1458 limb *outlimbs = &out[0][0];
1459 memset(outlimbs, 0, 3 * sizeof(felem));
1460
1461 for (i = 0; i < size; i++) {
1462 const limb *inlimbs = &pre_comp[i][0][0];
1463 limb mask = i ^ idx;
1464 mask |= mask >> 4;
1465 mask |= mask >> 2;
1466 mask |= mask >> 1;
1467 mask &= 1;
1468 mask--;
1469 for (j = 0; j < NLIMBS * 3; j++)
1470 outlimbs[j] |= inlimbs[j] & mask;
1471 }
1472}
1473
1474/* get_bit returns the |i|th bit in |in| */
1475static char
1476get_bit(const felem_bytearray in, int i)
1477{
1478 if (i < 0)
1479 return 0;
1480 return (in[i >> 3] >> (i & 7)) & 1;
1481}
1482
1483/* Interleaved point multiplication using precomputed point multiples:
1484 * The small point multiples 0*P, 1*P, ..., 16*P are in pre_comp[],
1485 * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
1486 * of the generator, using certain (large) precomputed multiples in g_pre_comp.
1487 * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
1488static void
1489batch_mul(felem x_out, felem y_out, felem z_out,
1490 const felem_bytearray scalars[], const unsigned num_points, const u8 *g_scalar,
1491 const int mixed, const felem pre_comp[][17][3], const felem g_pre_comp[16][3])
1492{
1493 int i, skip;
1494 unsigned num, gen_mul = (g_scalar != NULL);
1495 felem nq[3], tmp[4];
1496 limb bits;
1497 u8 sign, digit;
1498
1499 /* set nq to the point at infinity */
1500 memset(nq, 0, 3 * sizeof(felem));
1501
1502 /*
1503 * Loop over all scalars msb-to-lsb, interleaving additions of
1504 * multiples of the generator (last quarter of rounds) and additions
1505 * of other points multiples (every 5th round).
1506 */
1507 skip = 1; /* save two point operations in the first
1508 * round */
1509 for (i = (num_points ? 520 : 130); i >= 0; --i) {
1510 /* double */
1511 if (!skip)
1512 point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
1513
1514 /* add multiples of the generator */
1515 if (gen_mul && (i <= 130)) {
1516 bits = get_bit(g_scalar, i + 390) << 3;
1517 if (i < 130) {
1518 bits |= get_bit(g_scalar, i + 260) << 2;
1519 bits |= get_bit(g_scalar, i + 130) << 1;
1520 bits |= get_bit(g_scalar, i);
1521 }
1522 /* select the point to add, in constant time */
1523 select_point(bits, 16, g_pre_comp, tmp);
1524 if (!skip) {
1525 point_add(nq[0], nq[1], nq[2],
1526 nq[0], nq[1], nq[2],
1527 1 /* mixed */ , tmp[0], tmp[1], tmp[2]);
1528 } else {
1529 memcpy(nq, tmp, 3 * sizeof(felem));
1530 skip = 0;
1531 }
1532 }
1533 /* do other additions every 5 doublings */
1534 if (num_points && (i % 5 == 0)) {
1535 /* loop over all scalars */
1536 for (num = 0; num < num_points; ++num) {
1537 bits = get_bit(scalars[num], i + 4) << 5;
1538 bits |= get_bit(scalars[num], i + 3) << 4;
1539 bits |= get_bit(scalars[num], i + 2) << 3;
1540 bits |= get_bit(scalars[num], i + 1) << 2;
1541 bits |= get_bit(scalars[num], i) << 1;
1542 bits |= get_bit(scalars[num], i - 1);
1543 ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
1544
1545 /*
1546 * select the point to add or subtract, in
1547 * constant time
1548 */
1549 select_point(digit, 17, pre_comp[num], tmp);
1550 felem_neg(tmp[3], tmp[1]); /* (X, -Y, Z) is the
1551 * negative point */
1552 copy_conditional(tmp[1], tmp[3], (-(limb) sign));
1553
1554 if (!skip) {
1555 point_add(nq[0], nq[1], nq[2],
1556 nq[0], nq[1], nq[2],
1557 mixed, tmp[0], tmp[1], tmp[2]);
1558 } else {
1559 memcpy(nq, tmp, 3 * sizeof(felem));
1560 skip = 0;
1561 }
1562 }
1563 }
1564 }
1565 felem_assign(x_out, nq[0]);
1566 felem_assign(y_out, nq[1]);
1567 felem_assign(z_out, nq[2]);
1568}
1569
1570
1571/* Precomputation for the group generator. */
1572typedef struct {
1573 felem g_pre_comp[16][3];
1574 int references;
1575} NISTP521_PRE_COMP;
1576
1577const EC_METHOD *
1578EC_GFp_nistp521_method(void)
1579{
1580 static const EC_METHOD ret = {
1581 .flags = EC_FLAGS_DEFAULT_OCT,
1582 .field_type = NID_X9_62_prime_field,
1583 .group_init = ec_GFp_nistp521_group_init,
1584 .group_finish = ec_GFp_simple_group_finish,
1585 .group_clear_finish = ec_GFp_simple_group_clear_finish,
1586 .group_copy = ec_GFp_nist_group_copy,
1587 .group_set_curve = ec_GFp_nistp521_group_set_curve,
1588 .group_get_curve = ec_GFp_simple_group_get_curve,
1589 .group_get_degree = ec_GFp_simple_group_get_degree,
1590 .group_order_bits = ec_group_simple_order_bits,
1591 .group_check_discriminant =
1592 ec_GFp_simple_group_check_discriminant,
1593 .point_init = ec_GFp_simple_point_init,
1594 .point_finish = ec_GFp_simple_point_finish,
1595 .point_clear_finish = ec_GFp_simple_point_clear_finish,
1596 .point_copy = ec_GFp_simple_point_copy,
1597 .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity,
1598 .point_set_Jprojective_coordinates =
1599 ec_GFp_simple_set_Jprojective_coordinates,
1600 .point_get_Jprojective_coordinates =
1601 ec_GFp_simple_get_Jprojective_coordinates,
1602 .point_set_affine_coordinates =
1603 ec_GFp_simple_point_set_affine_coordinates,
1604 .point_get_affine_coordinates =
1605 ec_GFp_nistp521_point_get_affine_coordinates,
1606 .add = ec_GFp_simple_add,
1607 .dbl = ec_GFp_simple_dbl,
1608 .invert = ec_GFp_simple_invert,
1609 .is_at_infinity = ec_GFp_simple_is_at_infinity,
1610 .is_on_curve = ec_GFp_simple_is_on_curve,
1611 .point_cmp = ec_GFp_simple_cmp,
1612 .make_affine = ec_GFp_simple_make_affine,
1613 .points_make_affine = ec_GFp_simple_points_make_affine,
1614 .mul = ec_GFp_nistp521_points_mul,
1615 .precompute_mult = ec_GFp_nistp521_precompute_mult,
1616 .have_precompute_mult = ec_GFp_nistp521_have_precompute_mult,
1617 .field_mul = ec_GFp_nist_field_mul,
1618 .field_sqr = ec_GFp_nist_field_sqr,
1619 .blind_coordinates = NULL,
1620 };
1621
1622 return &ret;
1623}
1624
1625
1626/******************************************************************************/
1627/* FUNCTIONS TO MANAGE PRECOMPUTATION
1628 */
1629
1630static NISTP521_PRE_COMP *
1631nistp521_pre_comp_new()
1632{
1633 NISTP521_PRE_COMP *ret = NULL;
1634 ret = malloc(sizeof(NISTP521_PRE_COMP));
1635 if (!ret) {
1636 ECerror(ERR_R_MALLOC_FAILURE);
1637 return ret;
1638 }
1639 memset(ret->g_pre_comp, 0, sizeof(ret->g_pre_comp));
1640 ret->references = 1;
1641 return ret;
1642}
1643
1644static void *
1645nistp521_pre_comp_dup(void *src_)
1646{
1647 NISTP521_PRE_COMP *src = src_;
1648
1649 /* no need to actually copy, these objects never change! */
1650 CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
1651
1652 return src_;
1653}
1654
1655static void
1656nistp521_pre_comp_free(void *pre_)
1657{
1658 int i;
1659 NISTP521_PRE_COMP *pre = pre_;
1660
1661 if (!pre)
1662 return;
1663
1664 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1665 if (i > 0)
1666 return;
1667
1668 free(pre);
1669}
1670
1671static void
1672nistp521_pre_comp_clear_free(void *pre_)
1673{
1674 int i;
1675 NISTP521_PRE_COMP *pre = pre_;
1676
1677 if (!pre)
1678 return;
1679
1680 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1681 if (i > 0)
1682 return;
1683
1684 freezero(pre, sizeof(*pre));
1685}
1686
1687/******************************************************************************/
1688/* OPENSSL EC_METHOD FUNCTIONS
1689 */
1690
1691int
1692ec_GFp_nistp521_group_init(EC_GROUP *group)
1693{
1694 int ret;
1695 ret = ec_GFp_simple_group_init(group);
1696 group->a_is_minus3 = 1;
1697 return ret;
1698}
1699
1700int
1701ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p,
1702 const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
1703{
1704 int ret = 0;
1705 BN_CTX *new_ctx = NULL;
1706 BIGNUM *curve_p, *curve_a, *curve_b;
1707
1708 if (ctx == NULL)
1709 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1710 return 0;
1711 BN_CTX_start(ctx);
1712 if (((curve_p = BN_CTX_get(ctx)) == NULL) ||
1713 ((curve_a = BN_CTX_get(ctx)) == NULL) ||
1714 ((curve_b = BN_CTX_get(ctx)) == NULL))
1715 goto err;
1716 BN_bin2bn(nistp521_curve_params[0], sizeof(felem_bytearray), curve_p);
1717 BN_bin2bn(nistp521_curve_params[1], sizeof(felem_bytearray), curve_a);
1718 BN_bin2bn(nistp521_curve_params[2], sizeof(felem_bytearray), curve_b);
1719 if ((BN_cmp(curve_p, p)) || (BN_cmp(curve_a, a)) ||
1720 (BN_cmp(curve_b, b))) {
1721 ECerror(EC_R_WRONG_CURVE_PARAMETERS);
1722 goto err;
1723 }
1724 group->field_mod_func = BN_nist_mod_521;
1725 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1726 err:
1727 BN_CTX_end(ctx);
1728 BN_CTX_free(new_ctx);
1729 return ret;
1730}
1731
1732/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
1733 * (X', Y') = (X/Z^2, Y/Z^3) */
1734int
1735ec_GFp_nistp521_point_get_affine_coordinates(const EC_GROUP *group,
1736 const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
1737{
1738 felem z1, z2, x_in, y_in, x_out, y_out;
1739 largefelem tmp;
1740
1741 if (EC_POINT_is_at_infinity(group, point) > 0) {
1742 ECerror(EC_R_POINT_AT_INFINITY);
1743 return 0;
1744 }
1745 if ((!BN_to_felem(x_in, &point->X)) || (!BN_to_felem(y_in, &point->Y)) ||
1746 (!BN_to_felem(z1, &point->Z)))
1747 return 0;
1748 felem_inv(z2, z1);
1749 felem_square(tmp, z2);
1750 felem_reduce(z1, tmp);
1751 felem_mul(tmp, x_in, z1);
1752 felem_reduce(x_in, tmp);
1753 felem_contract(x_out, x_in);
1754 if (x != NULL) {
1755 if (!felem_to_BN(x, x_out)) {
1756 ECerror(ERR_R_BN_LIB);
1757 return 0;
1758 }
1759 }
1760 felem_mul(tmp, z1, z2);
1761 felem_reduce(z1, tmp);
1762 felem_mul(tmp, y_in, z1);
1763 felem_reduce(y_in, tmp);
1764 felem_contract(y_out, y_in);
1765 if (y != NULL) {
1766 if (!felem_to_BN(y, y_out)) {
1767 ECerror(ERR_R_BN_LIB);
1768 return 0;
1769 }
1770 }
1771 return 1;
1772}
1773
1774static void
1775make_points_affine(size_t num, felem points[ /* num */ ][3], felem tmp_felems[ /* num+1 */ ])
1776{
1777 /*
1778 * Runs in constant time, unless an input is the point at infinity
1779 * (which normally shouldn't happen).
1780 */
1781 ec_GFp_nistp_points_make_affine_internal(
1782 num,
1783 points,
1784 sizeof(felem),
1785 tmp_felems,
1786 (void (*) (void *)) felem_one,
1787 (int (*) (const void *)) felem_is_zero_int,
1788 (void (*) (void *, const void *)) felem_assign,
1789 (void (*) (void *, const void *)) felem_square_reduce,
1790 (void (*) (void *, const void *, const void *)) felem_mul_reduce,
1791 (void (*) (void *, const void *)) felem_inv,
1792 (void (*) (void *, const void *)) felem_contract);
1793}
1794
1795/* Computes scalar*generator + \sum scalars[i]*points[i], ignoring NULL values
1796 * Result is stored in r (r can equal one of the inputs). */
1797int
1798ec_GFp_nistp521_points_mul(const EC_GROUP *group, EC_POINT *r,
1799 const BIGNUM *scalar, size_t num, const EC_POINT *points[],
1800 const BIGNUM *scalars[], BN_CTX *ctx)
1801{
1802 int ret = 0;
1803 int j;
1804 int mixed = 0;
1805 BN_CTX *new_ctx = NULL;
1806 BIGNUM *x, *y, *z, *tmp_scalar;
1807 felem_bytearray g_secret;
1808 felem_bytearray *secrets = NULL;
1809 felem(*pre_comp)[17][3] = NULL;
1810 felem *tmp_felems = NULL;
1811 felem_bytearray tmp;
1812 unsigned i, num_bytes;
1813 int have_pre_comp = 0;
1814 size_t num_points = num;
1815 felem x_in, y_in, z_in, x_out, y_out, z_out;
1816 NISTP521_PRE_COMP *pre = NULL;
1817 felem(*g_pre_comp)[3] = NULL;
1818 EC_POINT *generator = NULL;
1819 const EC_POINT *p = NULL;
1820 const BIGNUM *p_scalar = NULL;
1821
1822 if (ctx == NULL)
1823 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
1824 return 0;
1825 BN_CTX_start(ctx);
1826 if (((x = BN_CTX_get(ctx)) == NULL) ||
1827 ((y = BN_CTX_get(ctx)) == NULL) ||
1828 ((z = BN_CTX_get(ctx)) == NULL) ||
1829 ((tmp_scalar = BN_CTX_get(ctx)) == NULL))
1830 goto err;
1831
1832 if (scalar != NULL) {
1833 pre = EC_EX_DATA_get_data(group->extra_data,
1834 nistp521_pre_comp_dup, nistp521_pre_comp_free,
1835 nistp521_pre_comp_clear_free);
1836 if (pre)
1837 /* we have precomputation, try to use it */
1838 g_pre_comp = &pre->g_pre_comp[0];
1839 else
1840 /* try to use the standard precomputation */
1841 g_pre_comp = (felem(*)[3]) gmul;
1842 generator = EC_POINT_new(group);
1843 if (generator == NULL)
1844 goto err;
1845 /* get the generator from precomputation */
1846 if (!felem_to_BN(x, g_pre_comp[1][0]) ||
1847 !felem_to_BN(y, g_pre_comp[1][1]) ||
1848 !felem_to_BN(z, g_pre_comp[1][2])) {
1849 ECerror(ERR_R_BN_LIB);
1850 goto err;
1851 }
1852 if (!EC_POINT_set_Jprojective_coordinates(group, generator,
1853 x, y, z, ctx))
1854 goto err;
1855 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
1856 /* precomputation matches generator */
1857 have_pre_comp = 1;
1858 else
1859 /*
1860 * we don't have valid precomputation: treat the
1861 * generator as a random point
1862 */
1863 num_points++;
1864 }
1865 if (num_points > 0) {
1866 if (num_points >= 2) {
1867 /*
1868 * unless we precompute multiples for just one point,
1869 * converting those into affine form is time well
1870 * spent
1871 */
1872 mixed = 1;
1873 }
1874 secrets = calloc(num_points, sizeof(felem_bytearray));
1875 pre_comp = calloc(num_points, 17 * 3 * sizeof(felem));
1876 if (mixed) {
1877 /* XXX should do more int overflow checking */
1878 tmp_felems = reallocarray(NULL,
1879 (num_points * 17 + 1), sizeof(felem));
1880 }
1881 if ((secrets == NULL) || (pre_comp == NULL) || (mixed && (tmp_felems == NULL))) {
1882 ECerror(ERR_R_MALLOC_FAILURE);
1883 goto err;
1884 }
1885 /*
1886 * we treat NULL scalars as 0, and NULL points as points at
1887 * infinity, i.e., they contribute nothing to the linear
1888 * combination
1889 */
1890 for (i = 0; i < num_points; ++i) {
1891 if (i == num)
1892 /*
1893 * we didn't have a valid precomputation, so
1894 * we pick the generator
1895 */
1896 {
1897 p = EC_GROUP_get0_generator(group);
1898 p_scalar = scalar;
1899 } else
1900 /* the i^th point */
1901 {
1902 p = points[i];
1903 p_scalar = scalars[i];
1904 }
1905 if ((p_scalar != NULL) && (p != NULL)) {
1906 /* reduce scalar to 0 <= scalar < 2^521 */
1907 if ((BN_num_bits(p_scalar) > 521) || (BN_is_negative(p_scalar))) {
1908 /*
1909 * this is an unusual input, and we
1910 * don't guarantee constant-timeness
1911 */
1912 if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx)) {
1913 ECerror(ERR_R_BN_LIB);
1914 goto err;
1915 }
1916 num_bytes = BN_bn2bin(tmp_scalar, tmp);
1917 } else
1918 num_bytes = BN_bn2bin(p_scalar, tmp);
1919 flip_endian(secrets[i], tmp, num_bytes);
1920 /* precompute multiples */
1921 if ((!BN_to_felem(x_out, &p->X)) ||
1922 (!BN_to_felem(y_out, &p->Y)) ||
1923 (!BN_to_felem(z_out, &p->Z)))
1924 goto err;
1925 memcpy(pre_comp[i][1][0], x_out, sizeof(felem));
1926 memcpy(pre_comp[i][1][1], y_out, sizeof(felem));
1927 memcpy(pre_comp[i][1][2], z_out, sizeof(felem));
1928 for (j = 2; j <= 16; ++j) {
1929 if (j & 1) {
1930 point_add(
1931 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
1932 pre_comp[i][1][0], pre_comp[i][1][1], pre_comp[i][1][2],
1933 0, pre_comp[i][j - 1][0], pre_comp[i][j - 1][1], pre_comp[i][j - 1][2]);
1934 } else {
1935 point_double(
1936 pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
1937 pre_comp[i][j / 2][0], pre_comp[i][j / 2][1], pre_comp[i][j / 2][2]);
1938 }
1939 }
1940 }
1941 }
1942 if (mixed)
1943 make_points_affine(num_points * 17, pre_comp[0], tmp_felems);
1944 }
1945 /* the scalar for the generator */
1946 if ((scalar != NULL) && (have_pre_comp)) {
1947 memset(g_secret, 0, sizeof(g_secret));
1948 /* reduce scalar to 0 <= scalar < 2^521 */
1949 if ((BN_num_bits(scalar) > 521) || (BN_is_negative(scalar))) {
1950 /*
1951 * this is an unusual input, and we don't guarantee
1952 * constant-timeness
1953 */
1954 if (!BN_nnmod(tmp_scalar, scalar, &group->order, ctx)) {
1955 ECerror(ERR_R_BN_LIB);
1956 goto err;
1957 }
1958 num_bytes = BN_bn2bin(tmp_scalar, tmp);
1959 } else
1960 num_bytes = BN_bn2bin(scalar, tmp);
1961 flip_endian(g_secret, tmp, num_bytes);
1962 /* do the multiplication with generator precomputation */
1963 batch_mul(x_out, y_out, z_out,
1964 (const felem_bytearray(*)) secrets, num_points,
1965 g_secret,
1966 mixed, (const felem(*)[17][3]) pre_comp,
1967 (const felem(*)[3]) g_pre_comp);
1968 } else
1969 /* do the multiplication without generator precomputation */
1970 batch_mul(x_out, y_out, z_out,
1971 (const felem_bytearray(*)) secrets, num_points,
1972 NULL, mixed, (const felem(*)[17][3]) pre_comp, NULL);
1973 /* reduce the output to its unique minimal representation */
1974 felem_contract(x_in, x_out);
1975 felem_contract(y_in, y_out);
1976 felem_contract(z_in, z_out);
1977 if ((!felem_to_BN(x, x_in)) || (!felem_to_BN(y, y_in)) ||
1978 (!felem_to_BN(z, z_in))) {
1979 ECerror(ERR_R_BN_LIB);
1980 goto err;
1981 }
1982 ret = EC_POINT_set_Jprojective_coordinates(group, r, x, y, z, ctx);
1983
1984 err:
1985 BN_CTX_end(ctx);
1986 EC_POINT_free(generator);
1987 BN_CTX_free(new_ctx);
1988 free(secrets);
1989 free(pre_comp);
1990 free(tmp_felems);
1991 return ret;
1992}
1993
1994int
1995ec_GFp_nistp521_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
1996{
1997 int ret = 0;
1998 NISTP521_PRE_COMP *pre = NULL;
1999 int i, j;
2000 BN_CTX *new_ctx = NULL;
2001 BIGNUM *x, *y;
2002 EC_POINT *generator = NULL;
2003 felem tmp_felems[16];
2004
2005 /* throw away old precomputation */
2006 EC_EX_DATA_free_data(&group->extra_data, nistp521_pre_comp_dup,
2007 nistp521_pre_comp_free, nistp521_pre_comp_clear_free);
2008 if (ctx == NULL)
2009 if ((ctx = new_ctx = BN_CTX_new()) == NULL)
2010 return 0;
2011 BN_CTX_start(ctx);
2012 if (((x = BN_CTX_get(ctx)) == NULL) ||
2013 ((y = BN_CTX_get(ctx)) == NULL))
2014 goto err;
2015 /* get the generator */
2016 if (group->generator == NULL)
2017 goto err;
2018 generator = EC_POINT_new(group);
2019 if (generator == NULL)
2020 goto err;
2021 BN_bin2bn(nistp521_curve_params[3], sizeof(felem_bytearray), x);
2022 BN_bin2bn(nistp521_curve_params[4], sizeof(felem_bytearray), y);
2023 if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
2024 goto err;
2025 if ((pre = nistp521_pre_comp_new()) == NULL)
2026 goto err;
2027 /* if the generator is the standard one, use built-in precomputation */
2028 if (0 == EC_POINT_cmp(group, generator, group->generator, ctx)) {
2029 memcpy(pre->g_pre_comp, gmul, sizeof(pre->g_pre_comp));
2030 ret = 1;
2031 goto err;
2032 }
2033 if ((!BN_to_felem(pre->g_pre_comp[1][0], &group->generator->X)) ||
2034 (!BN_to_felem(pre->g_pre_comp[1][1], &group->generator->Y)) ||
2035 (!BN_to_felem(pre->g_pre_comp[1][2], &group->generator->Z)))
2036 goto err;
2037 /* compute 2^130*G, 2^260*G, 2^390*G */
2038 for (i = 1; i <= 4; i <<= 1) {
2039 point_double(pre->g_pre_comp[2 * i][0], pre->g_pre_comp[2 * i][1],
2040 pre->g_pre_comp[2 * i][2], pre->g_pre_comp[i][0],
2041 pre->g_pre_comp[i][1], pre->g_pre_comp[i][2]);
2042 for (j = 0; j < 129; ++j) {
2043 point_double(pre->g_pre_comp[2 * i][0],
2044 pre->g_pre_comp[2 * i][1],
2045 pre->g_pre_comp[2 * i][2],
2046 pre->g_pre_comp[2 * i][0],
2047 pre->g_pre_comp[2 * i][1],
2048 pre->g_pre_comp[2 * i][2]);
2049 }
2050 }
2051 /* g_pre_comp[0] is the point at infinity */
2052 memset(pre->g_pre_comp[0], 0, sizeof(pre->g_pre_comp[0]));
2053 /* the remaining multiples */
2054 /* 2^130*G + 2^260*G */
2055 point_add(pre->g_pre_comp[6][0], pre->g_pre_comp[6][1],
2056 pre->g_pre_comp[6][2], pre->g_pre_comp[4][0],
2057 pre->g_pre_comp[4][1], pre->g_pre_comp[4][2],
2058 0, pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
2059 pre->g_pre_comp[2][2]);
2060 /* 2^130*G + 2^390*G */
2061 point_add(pre->g_pre_comp[10][0], pre->g_pre_comp[10][1],
2062 pre->g_pre_comp[10][2], pre->g_pre_comp[8][0],
2063 pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
2064 0, pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
2065 pre->g_pre_comp[2][2]);
2066 /* 2^260*G + 2^390*G */
2067 point_add(pre->g_pre_comp[12][0], pre->g_pre_comp[12][1],
2068 pre->g_pre_comp[12][2], pre->g_pre_comp[8][0],
2069 pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
2070 0, pre->g_pre_comp[4][0], pre->g_pre_comp[4][1],
2071 pre->g_pre_comp[4][2]);
2072 /* 2^130*G + 2^260*G + 2^390*G */
2073 point_add(pre->g_pre_comp[14][0], pre->g_pre_comp[14][1],
2074 pre->g_pre_comp[14][2], pre->g_pre_comp[12][0],
2075 pre->g_pre_comp[12][1], pre->g_pre_comp[12][2],
2076 0, pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
2077 pre->g_pre_comp[2][2]);
2078 for (i = 1; i < 8; ++i) {
2079 /* odd multiples: add G */
2080 point_add(pre->g_pre_comp[2 * i + 1][0], pre->g_pre_comp[2 * i + 1][1],
2081 pre->g_pre_comp[2 * i + 1][2], pre->g_pre_comp[2 * i][0],
2082 pre->g_pre_comp[2 * i][1], pre->g_pre_comp[2 * i][2],
2083 0, pre->g_pre_comp[1][0], pre->g_pre_comp[1][1],
2084 pre->g_pre_comp[1][2]);
2085 }
2086 make_points_affine(15, &(pre->g_pre_comp[1]), tmp_felems);
2087
2088 if (!EC_EX_DATA_set_data(&group->extra_data, pre, nistp521_pre_comp_dup,
2089 nistp521_pre_comp_free, nistp521_pre_comp_clear_free))
2090 goto err;
2091 ret = 1;
2092 pre = NULL;
2093 err:
2094 BN_CTX_end(ctx);
2095 EC_POINT_free(generator);
2096 BN_CTX_free(new_ctx);
2097 nistp521_pre_comp_free(pre);
2098 return ret;
2099}
2100
2101int
2102ec_GFp_nistp521_have_precompute_mult(const EC_GROUP *group)
2103{
2104 if (EC_EX_DATA_get_data(group->extra_data, nistp521_pre_comp_dup,
2105 nistp521_pre_comp_free, nistp521_pre_comp_clear_free)
2106 != NULL)
2107 return 1;
2108 else
2109 return 0;
2110}
2111
2112#endif
diff --git a/src/lib/libcrypto/ec/ecp_nistputil.c b/src/lib/libcrypto/ec/ecp_nistputil.c
deleted file mode 100644
index d0fea12028..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistputil.c
+++ /dev/null
@@ -1,209 +0,0 @@
1/* $OpenBSD: ecp_nistputil.c,v 1.8 2022/11/26 16:08:52 tb Exp $ */
2/*
3 * Written by Bodo Moeller for the OpenSSL project.
4 */
5/*
6 * Copyright (c) 2011 Google Inc.
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21#include <stddef.h>
22
23#include <openssl/opensslconf.h>
24
25#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
26
27/*
28 * Common utility functions for ecp_nistp224.c, ecp_nistp256.c, ecp_nistp521.c.
29 */
30
31#include "ec_local.h"
32
33/* Convert an array of points into affine coordinates.
34 * (If the point at infinity is found (Z = 0), it remains unchanged.)
35 * This function is essentially an equivalent to EC_POINTs_make_affine(), but
36 * works with the internal representation of points as used by ecp_nistp###.c
37 * rather than with (BIGNUM-based) EC_POINT data structures.
38 *
39 * point_array is the input/output buffer ('num' points in projective form,
40 * i.e. three coordinates each), based on an internal representation of
41 * field elements of size 'felem_size'.
42 *
43 * tmp_felems needs to point to a temporary array of 'num'+1 field elements
44 * for storage of intermediate values.
45 */
46void
47ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array,
48 size_t felem_size, void *tmp_felems,
49 void (*felem_one) (void *out),
50 int (*felem_is_zero) (const void *in),
51 void (*felem_assign) (void *out, const void *in),
52 void (*felem_square) (void *out, const void *in),
53 void (*felem_mul) (void *out, const void *in1, const void *in2),
54 void (*felem_inv) (void *out, const void *in),
55 void (*felem_contract) (void *out, const void *in))
56{
57 int i = 0;
58
59#define tmp_felem(I) (&((char *)tmp_felems)[(I) * felem_size])
60#define X(I) (&((char *)point_array)[3*(I) * felem_size])
61#define Y(I) (&((char *)point_array)[(3*(I) + 1) * felem_size])
62#define Z(I) (&((char *)point_array)[(3*(I) + 2) * felem_size])
63
64 if (!felem_is_zero(Z(0)))
65 felem_assign(tmp_felem(0), Z(0));
66 else
67 felem_one(tmp_felem(0));
68 for (i = 1; i < (int) num; i++) {
69 if (!felem_is_zero(Z(i)))
70 felem_mul(tmp_felem(i), tmp_felem(i - 1), Z(i));
71 else
72 felem_assign(tmp_felem(i), tmp_felem(i - 1));
73 }
74 /*
75 * Now each tmp_felem(i) is the product of Z(0) .. Z(i), skipping any
76 * zero-valued factors: if Z(i) = 0, we essentially pretend that Z(i)
77 * = 1
78 */
79
80 felem_inv(tmp_felem(num - 1), tmp_felem(num - 1));
81 for (i = num - 1; i >= 0; i--) {
82 if (i > 0)
83 /*
84 * tmp_felem(i-1) is the product of Z(0) .. Z(i-1),
85 * tmp_felem(i) is the inverse of the product of Z(0)
86 * .. Z(i)
87 */
88 felem_mul(tmp_felem(num), tmp_felem(i - 1), tmp_felem(i)); /* 1/Z(i) */
89 else
90 felem_assign(tmp_felem(num), tmp_felem(0)); /* 1/Z(0) */
91
92 if (!felem_is_zero(Z(i))) {
93 if (i > 0)
94 /*
95 * For next iteration, replace tmp_felem(i-1)
96 * by its inverse
97 */
98 felem_mul(tmp_felem(i - 1), tmp_felem(i), Z(i));
99
100 /*
101 * Convert point (X, Y, Z) into affine form (X/(Z^2),
102 * Y/(Z^3), 1)
103 */
104 felem_square(Z(i), tmp_felem(num)); /* 1/(Z^2) */
105 felem_mul(X(i), X(i), Z(i)); /* X/(Z^2) */
106 felem_mul(Z(i), Z(i), tmp_felem(num)); /* 1/(Z^3) */
107 felem_mul(Y(i), Y(i), Z(i)); /* Y/(Z^3) */
108 felem_contract(X(i), X(i));
109 felem_contract(Y(i), Y(i));
110 felem_one(Z(i));
111 } else {
112 if (i > 0)
113 /*
114 * For next iteration, replace tmp_felem(i-1)
115 * by its inverse
116 */
117 felem_assign(tmp_felem(i - 1), tmp_felem(i));
118 }
119 }
120}
121
122/*
123 * This function looks at 5+1 scalar bits (5 current, 1 adjacent less
124 * significant bit), and recodes them into a signed digit for use in fast point
125 * multiplication: the use of signed rather than unsigned digits means that
126 * fewer points need to be precomputed, given that point inversion is easy
127 * (a precomputed point dP makes -dP available as well).
128 *
129 * BACKGROUND:
130 *
131 * Signed digits for multiplication were introduced by Booth ("A signed binary
132 * multiplication technique", Quart. Journ. Mech. and Applied Math., vol. IV,
133 * pt. 2 (1951), pp. 236-240), in that case for multiplication of integers.
134 * Booth's original encoding did not generally improve the density of nonzero
135 * digits over the binary representation, and was merely meant to simplify the
136 * handling of signed factors given in two's complement; but it has since been
137 * shown to be the basis of various signed-digit representations that do have
138 * further advantages, including the wNAF, using the following general approach:
139 *
140 * (1) Given a binary representation
141 *
142 * b_k ... b_2 b_1 b_0,
143 *
144 * of a nonnegative integer (b_k in {0, 1}), rewrite it in digits 0, 1, -1
145 * by using bit-wise subtraction as follows:
146 *
147 * b_k b_(k-1) ... b_2 b_1 b_0
148 * - b_k ... b_3 b_2 b_1 b_0
149 * -------------------------------------
150 * s_k b_(k-1) ... s_3 s_2 s_1 s_0
151 *
152 * A left-shift followed by subtraction of the original value yields a new
153 * representation of the same value, using signed bits s_i = b_(i+1) - b_i.
154 * This representation from Booth's paper has since appeared in the
155 * literature under a variety of different names including "reversed binary
156 * form", "alternating greedy expansion", "mutual opposite form", and
157 * "sign-alternating {+-1}-representation".
158 *
159 * An interesting property is that among the nonzero bits, values 1 and -1
160 * strictly alternate.
161 *
162 * (2) Various window schemes can be applied to the Booth representation of
163 * integers: for example, right-to-left sliding windows yield the wNAF
164 * (a signed-digit encoding independently discovered by various researchers
165 * in the 1990s), and left-to-right sliding windows yield a left-to-right
166 * equivalent of the wNAF (independently discovered by various researchers
167 * around 2004).
168 *
169 * To prevent leaking information through side channels in point multiplication,
170 * we need to recode the given integer into a regular pattern: sliding windows
171 * as in wNAFs won't do, we need their fixed-window equivalent -- which is a few
172 * decades older: we'll be using the so-called "modified Booth encoding" due to
173 * MacSorley ("High-speed arithmetic in binary computers", Proc. IRE, vol. 49
174 * (1961), pp. 67-91), in a radix-2^5 setting. That is, we always combine five
175 * signed bits into a signed digit:
176 *
177 * s_(4j + 4) s_(4j + 3) s_(4j + 2) s_(4j + 1) s_(4j)
178 *
179 * The sign-alternating property implies that the resulting digit values are
180 * integers from -16 to 16.
181 *
182 * Of course, we don't actually need to compute the signed digits s_i as an
183 * intermediate step (that's just a nice way to see how this scheme relates
184 * to the wNAF): a direct computation obtains the recoded digit from the
185 * six bits b_(4j + 4) ... b_(4j - 1).
186 *
187 * This function takes those five bits as an integer (0 .. 63), writing the
188 * recoded digit to *sign (0 for positive, 1 for negative) and *digit (absolute
189 * value, in the range 0 .. 8). Note that this integer essentially provides the
190 * input bits "shifted to the left" by one position: for example, the input to
191 * compute the least significant recoded digit, given that there's no bit b_-1,
192 * has to be b_4 b_3 b_2 b_1 b_0 0.
193 *
194 */
195void
196ec_GFp_nistp_recode_scalar_bits(unsigned char *sign, unsigned char *digit, unsigned char in)
197{
198 unsigned char s, d;
199
200 s = ~((in >> 5) - 1); /* sets all bits to MSB(in), 'in' seen as
201 * 6-bit value */
202 d = (1 << 6) - in - 1;
203 d = (d & s) | (in & ~s);
204 d = (d >> 1) + (d & 1);
205
206 *sign = s & 1;
207 *digit = d;
208}
209#endif
diff --git a/src/lib/libcrypto/ec/ecp_nistz256.c b/src/lib/libcrypto/ec/ecp_nistz256.c
deleted file mode 100644
index 62aac44c64..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistz256.c
+++ /dev/null
@@ -1,1191 +0,0 @@
1/* $OpenBSD: ecp_nistz256.c,v 1.14 2022/11/26 16:08:52 tb Exp $ */
2/* Copyright (c) 2014, Intel Corporation.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
15
16/* Developers and authors:
17 * Shay Gueron (1, 2), and Vlad Krasnov (1)
18 * (1) Intel Corporation, Israel Development Center
19 * (2) University of Haifa
20 * Reference:
21 * S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
22 * 256 Bit Primes" */
23
24/*
25 * The following license applies to _booth_recode_w5() and
26 * _booth_recode_w7():
27 */
28/* Copyright (c) 2015, Google Inc.
29 *
30 * Permission to use, copy, modify, and/or distribute this software for any
31 * purpose with or without fee is hereby granted, provided that the above
32 * copyright notice and this permission notice appear in all copies.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
35 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
36 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
38 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
39 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
40 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
41
42#include <string.h>
43
44#include <openssl/crypto.h>
45#include <openssl/bn.h>
46#include <openssl/ec.h>
47#include <openssl/err.h>
48
49#include "ec_local.h"
50
51#if BN_BITS2 != 64
52#define TOBN(hi,lo) lo,hi
53#else
54#define TOBN(hi,lo) ((BN_ULONG)hi << 32 | lo)
55#endif
56
57#if defined(__GNUC__)
58#define ALIGN32 __attribute((aligned(32)))
59#elif defined(_MSC_VER)
60#define ALIGN32 __declspec(align(32))
61#else
62#define ALIGN32
63#endif
64
65#define P256_LIMBS (256 / BN_BITS2)
66
67typedef struct {
68 BN_ULONG X[P256_LIMBS];
69 BN_ULONG Y[P256_LIMBS];
70 BN_ULONG Z[P256_LIMBS];
71} P256_POINT;
72
73typedef struct {
74 BN_ULONG X[P256_LIMBS];
75 BN_ULONG Y[P256_LIMBS];
76} P256_POINT_AFFINE;
77
78typedef P256_POINT_AFFINE PRECOMP256_ROW[64];
79
80/* structure for precomputed multiples of the generator */
81typedef struct ec_pre_comp_st {
82 const EC_GROUP *group; /* Parent EC_GROUP object */
83 size_t w; /* Window size */
84 /*
85 * Constant time access to the X and Y coordinates of the pre-computed,
86 * generator multiplies, in the Montgomery domain. Pre-calculated
87 * multiplies are stored in affine form.
88 */
89 PRECOMP256_ROW *precomp;
90 int references;
91} EC_PRE_COMP;
92
93/*
94 * Arithmetic on field elements using Almost Montgomery Multiplication. The
95 * "almost" means, in particular, that the inputs and outputs of these
96 * functions are in the range [0, 2**BN_BITS2), not [0, P). Only
97 * |ecp_nistz256_from_mont| outputs a fully reduced value in [0, P). Almost
98 * Montgomery Arithmetic is described clearly in "Efficient Software
99 * Implementations of Modular Exponentiation" by Shay Gueron.
100 */
101
102/* Modular neg: res = -a mod P, where res is not fully reduced. */
103void ecp_nistz256_neg(BN_ULONG res[P256_LIMBS],
104 const BN_ULONG a[P256_LIMBS]);
105/* Montgomery mul: res = a*b*2^-256 mod P, where res is not fully reduced. */
106void ecp_nistz256_mul_mont(BN_ULONG res[P256_LIMBS],
107 const BN_ULONG a[P256_LIMBS], const BN_ULONG b[P256_LIMBS]);
108/* Montgomery sqr: res = a*a*2^-256 mod P, where res is not fully reduced. */
109void ecp_nistz256_sqr_mont(BN_ULONG res[P256_LIMBS],
110 const BN_ULONG a[P256_LIMBS]);
111/* Convert a number from Montgomery domain, by multiplying with 1, where res
112 * will be fully reduced mod P. */
113void ecp_nistz256_from_mont(BN_ULONG res[P256_LIMBS],
114 const BN_ULONG in[P256_LIMBS]);
115
116/* Functions that perform constant time access to the precomputed tables */
117void ecp_nistz256_select_w5(P256_POINT *val, const P256_POINT *in_t,
118 int index);
119void ecp_nistz256_select_w7(P256_POINT_AFFINE *val,
120 const P256_POINT_AFFINE *in_t, int index);
121
122/* One converted into the Montgomery domain */
123static const BN_ULONG ONE[P256_LIMBS] = {
124 TOBN(0x00000000, 0x00000001), TOBN(0xffffffff, 0x00000000),
125 TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0xfffffffe)
126};
127
128static void *ecp_nistz256_pre_comp_dup(void *);
129static void ecp_nistz256_pre_comp_free(void *);
130static void ecp_nistz256_pre_comp_clear_free(void *);
131static EC_PRE_COMP *ecp_nistz256_pre_comp_new(const EC_GROUP *group);
132
133/* Precomputed tables for the default generator */
134#include "ecp_nistz256_table.h"
135
136/* This function looks at 5+1 scalar bits (5 current, 1 adjacent less
137 * significant bit), and recodes them into a signed digit for use in fast point
138 * multiplication: the use of signed rather than unsigned digits means that
139 * fewer points need to be precomputed, given that point inversion is easy (a
140 * precomputed point dP makes -dP available as well).
141 *
142 * BACKGROUND:
143 *
144 * Signed digits for multiplication were introduced by Booth ("A signed binary
145 * multiplication technique", Quart. Journ. Mech. and Applied Math., vol. IV,
146 * pt. 2 (1951), pp. 236-240), in that case for multiplication of integers.
147 * Booth's original encoding did not generally improve the density of nonzero
148 * digits over the binary representation, and was merely meant to simplify the
149 * handling of signed factors given in two's complement; but it has since been
150 * shown to be the basis of various signed-digit representations that do have
151 * further advantages, including the wNAF, using the following general
152 * approach:
153 *
154 * (1) Given a binary representation
155 *
156 * b_k ... b_2 b_1 b_0,
157 *
158 * of a nonnegative integer (b_k in {0, 1}), rewrite it in digits 0, 1, -1
159 * by using bit-wise subtraction as follows:
160 *
161 * b_k b_(k-1) ... b_2 b_1 b_0
162 * - b_k ... b_3 b_2 b_1 b_0
163 * -------------------------------------
164 * s_k b_(k-1) ... s_3 s_2 s_1 s_0
165 *
166 * A left-shift followed by subtraction of the original value yields a new
167 * representation of the same value, using signed bits s_i = b_(i+1) - b_i.
168 * This representation from Booth's paper has since appeared in the
169 * literature under a variety of different names including "reversed binary
170 * form", "alternating greedy expansion", "mutual opposite form", and
171 * "sign-alternating {+-1}-representation".
172 *
173 * An interesting property is that among the nonzero bits, values 1 and -1
174 * strictly alternate.
175 *
176 * (2) Various window schemes can be applied to the Booth representation of
177 * integers: for example, right-to-left sliding windows yield the wNAF
178 * (a signed-digit encoding independently discovered by various researchers
179 * in the 1990s), and left-to-right sliding windows yield a left-to-right
180 * equivalent of the wNAF (independently discovered by various researchers
181 * around 2004).
182 *
183 * To prevent leaking information through side channels in point multiplication,
184 * we need to recode the given integer into a regular pattern: sliding windows
185 * as in wNAFs won't do, we need their fixed-window equivalent -- which is a few
186 * decades older: we'll be using the so-called "modified Booth encoding" due to
187 * MacSorley ("High-speed arithmetic in binary computers", Proc. IRE, vol. 49
188 * (1961), pp. 67-91), in a radix-2^5 setting. That is, we always combine five
189 * signed bits into a signed digit:
190 *
191 * s_(4j + 4) s_(4j + 3) s_(4j + 2) s_(4j + 1) s_(4j)
192 *
193 * The sign-alternating property implies that the resulting digit values are
194 * integers from -16 to 16.
195 *
196 * Of course, we don't actually need to compute the signed digits s_i as an
197 * intermediate step (that's just a nice way to see how this scheme relates
198 * to the wNAF): a direct computation obtains the recoded digit from the
199 * six bits b_(4j + 4) ... b_(4j - 1).
200 *
201 * This function takes those five bits as an integer (0 .. 63), writing the
202 * recoded digit to *sign (0 for positive, 1 for negative) and *digit (absolute
203 * value, in the range 0 .. 8). Note that this integer essentially provides the
204 * input bits "shifted to the left" by one position: for example, the input to
205 * compute the least significant recoded digit, given that there's no bit b_-1,
206 * has to be b_4 b_3 b_2 b_1 b_0 0. */
207
208static unsigned int
209_booth_recode_w5(unsigned int in)
210{
211 unsigned int s, d;
212
213 /* sets all bits to MSB(in), 'in' seen as 6-bit value */
214 s = ~((in >> 5) - 1);
215 d = (1 << 6) - in - 1;
216 d = (d & s) | (in & ~s);
217 d = (d >> 1) + (d & 1);
218
219 return (d << 1) + (s & 1);
220}
221
222static unsigned int
223_booth_recode_w7(unsigned int in)
224{
225 unsigned int s, d;
226
227 /* sets all bits to MSB(in), 'in' seen as 8-bit value */
228 s = ~((in >> 7) - 1);
229 d = (1 << 8) - in - 1;
230 d = (d & s) | (in & ~s);
231 d = (d >> 1) + (d & 1);
232
233 return (d << 1) + (s & 1);
234}
235
236static void
237copy_conditional(BN_ULONG dst[P256_LIMBS], const BN_ULONG src[P256_LIMBS],
238 BN_ULONG move)
239{
240 BN_ULONG mask1 = -move;
241 BN_ULONG mask2 = ~mask1;
242
243 dst[0] = (src[0] & mask1) ^ (dst[0] & mask2);
244 dst[1] = (src[1] & mask1) ^ (dst[1] & mask2);
245 dst[2] = (src[2] & mask1) ^ (dst[2] & mask2);
246 dst[3] = (src[3] & mask1) ^ (dst[3] & mask2);
247 if (P256_LIMBS == 8) {
248 dst[4] = (src[4] & mask1) ^ (dst[4] & mask2);
249 dst[5] = (src[5] & mask1) ^ (dst[5] & mask2);
250 dst[6] = (src[6] & mask1) ^ (dst[6] & mask2);
251 dst[7] = (src[7] & mask1) ^ (dst[7] & mask2);
252 }
253}
254
255static BN_ULONG
256is_zero(BN_ULONG in)
257{
258 in |= (0 - in);
259 in = ~in;
260 in &= BN_MASK2;
261 in >>= BN_BITS2 - 1;
262 return in;
263}
264
265static BN_ULONG
266is_equal(const BN_ULONG a[P256_LIMBS], const BN_ULONG b[P256_LIMBS])
267{
268 BN_ULONG res;
269
270 res = a[0] ^ b[0];
271 res |= a[1] ^ b[1];
272 res |= a[2] ^ b[2];
273 res |= a[3] ^ b[3];
274 if (P256_LIMBS == 8) {
275 res |= a[4] ^ b[4];
276 res |= a[5] ^ b[5];
277 res |= a[6] ^ b[6];
278 res |= a[7] ^ b[7];
279 }
280
281 return is_zero(res);
282}
283
284static BN_ULONG
285is_one(const BIGNUM *z)
286{
287 BN_ULONG res = 0;
288 BN_ULONG *a = z->d;
289
290 if (z->top == (P256_LIMBS - P256_LIMBS / 8)) {
291 res = a[0] ^ ONE[0];
292 res |= a[1] ^ ONE[1];
293 res |= a[2] ^ ONE[2];
294 res |= a[3] ^ ONE[3];
295 if (P256_LIMBS == 8) {
296 res |= a[4] ^ ONE[4];
297 res |= a[5] ^ ONE[5];
298 res |= a[6] ^ ONE[6];
299 /*
300 * No check for a[7] (being zero) on 32-bit platforms,
301 * because value of "one" takes only 7 limbs.
302 */
303 }
304 res = is_zero(res);
305 }
306
307 return res;
308}
309
310static int
311ecp_nistz256_set_words(BIGNUM *a, BN_ULONG words[P256_LIMBS])
312{
313 if (!bn_wexpand(a, P256_LIMBS)) {
314 ECerror(ERR_R_MALLOC_FAILURE);
315 return 0;
316 }
317 memcpy(a->d, words, sizeof(BN_ULONG) * P256_LIMBS);
318 a->top = P256_LIMBS;
319 bn_correct_top(a);
320 return 1;
321}
322
323void ecp_nistz256_point_double(P256_POINT *r, const P256_POINT *a);
324void ecp_nistz256_point_add(P256_POINT *r, const P256_POINT *a,
325 const P256_POINT *b);
326void ecp_nistz256_point_add_affine(P256_POINT *r, const P256_POINT *a,
327 const P256_POINT_AFFINE *b);
328
329/* r = in^-1 mod p */
330static void
331ecp_nistz256_mod_inverse(BN_ULONG r[P256_LIMBS], const BN_ULONG in[P256_LIMBS])
332{
333 /*
334 * The poly is ffffffff 00000001 00000000 00000000 00000000 ffffffff
335 * ffffffff ffffffff. We use FLT and use poly-2 as exponent.
336 */
337 BN_ULONG p2[P256_LIMBS];
338 BN_ULONG p4[P256_LIMBS];
339 BN_ULONG p8[P256_LIMBS];
340 BN_ULONG p16[P256_LIMBS];
341 BN_ULONG p32[P256_LIMBS];
342 BN_ULONG res[P256_LIMBS];
343 unsigned int i;
344
345 ecp_nistz256_sqr_mont(res, in);
346 ecp_nistz256_mul_mont(p2, res, in); /* 3*p */
347
348 ecp_nistz256_sqr_mont(res, p2);
349 ecp_nistz256_sqr_mont(res, res);
350 ecp_nistz256_mul_mont(p4, res, p2); /* f*p */
351
352 ecp_nistz256_sqr_mont(res, p4);
353 ecp_nistz256_sqr_mont(res, res);
354 ecp_nistz256_sqr_mont(res, res);
355 ecp_nistz256_sqr_mont(res, res);
356 ecp_nistz256_mul_mont(p8, res, p4); /* ff*p */
357
358 ecp_nistz256_sqr_mont(res, p8);
359 for (i = 0; i < 7; i++)
360 ecp_nistz256_sqr_mont(res, res);
361 ecp_nistz256_mul_mont(p16, res, p8); /* ffff*p */
362
363 ecp_nistz256_sqr_mont(res, p16);
364 for (i = 0; i < 15; i++)
365 ecp_nistz256_sqr_mont(res, res);
366 ecp_nistz256_mul_mont(p32, res, p16); /* ffffffff*p */
367
368 ecp_nistz256_sqr_mont(res, p32);
369 for (i = 0; i < 31; i++)
370 ecp_nistz256_sqr_mont(res, res);
371 ecp_nistz256_mul_mont(res, res, in);
372
373 for (i = 0; i < 32 * 4; i++)
374 ecp_nistz256_sqr_mont(res, res);
375 ecp_nistz256_mul_mont(res, res, p32);
376
377 for (i = 0; i < 32; i++)
378 ecp_nistz256_sqr_mont(res, res);
379 ecp_nistz256_mul_mont(res, res, p32);
380
381 for (i = 0; i < 16; i++)
382 ecp_nistz256_sqr_mont(res, res);
383 ecp_nistz256_mul_mont(res, res, p16);
384
385 for (i = 0; i < 8; i++)
386 ecp_nistz256_sqr_mont(res, res);
387 ecp_nistz256_mul_mont(res, res, p8);
388
389 ecp_nistz256_sqr_mont(res, res);
390 ecp_nistz256_sqr_mont(res, res);
391 ecp_nistz256_sqr_mont(res, res);
392 ecp_nistz256_sqr_mont(res, res);
393 ecp_nistz256_mul_mont(res, res, p4);
394
395 ecp_nistz256_sqr_mont(res, res);
396 ecp_nistz256_sqr_mont(res, res);
397 ecp_nistz256_mul_mont(res, res, p2);
398
399 ecp_nistz256_sqr_mont(res, res);
400 ecp_nistz256_sqr_mont(res, res);
401 ecp_nistz256_mul_mont(res, res, in);
402
403 memcpy(r, res, sizeof(res));
404}
405
406/*
407 * ecp_nistz256_bignum_to_field_elem copies the contents of |in| to |out| and
408 * returns one if it fits. Otherwise it returns zero.
409 */
410static int
411ecp_nistz256_bignum_to_field_elem(BN_ULONG out[P256_LIMBS], const BIGNUM *in)
412{
413 if (in->top > P256_LIMBS)
414 return 0;
415
416 memset(out, 0, sizeof(BN_ULONG) * P256_LIMBS);
417 memcpy(out, in->d, sizeof(BN_ULONG) * in->top);
418 return 1;
419}
420
421/* r = sum(scalar[i]*point[i]) */
422static int
423ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
424 const BIGNUM **scalar, const EC_POINT **point, size_t num, BN_CTX *ctx)
425{
426 int ret = 0;
427 unsigned int i, j, index;
428 unsigned char (*p_str)[33] = NULL;
429 const unsigned int window_size = 5;
430 const unsigned int mask = (1 << (window_size + 1)) - 1;
431 unsigned int wvalue;
432 BN_ULONG tmp[P256_LIMBS];
433 /* avoid warning about ignored alignment for stack variable */
434#if defined(__GNUC__) && !defined(__OpenBSD__)
435 ALIGN32
436#endif
437 P256_POINT h;
438 const BIGNUM **scalars = NULL;
439 P256_POINT (*table)[16] = NULL;
440
441 if (posix_memalign((void **)&table, 64, num * sizeof(*table)) != 0 ||
442 (p_str = reallocarray(NULL, num, sizeof(*p_str))) == NULL ||
443 (scalars = reallocarray(NULL, num, sizeof(*scalars))) == NULL) {
444 ECerror(ERR_R_MALLOC_FAILURE);
445 goto err;
446 }
447
448 for (i = 0; i < num; i++) {
449 P256_POINT *row = table[i];
450
451 /*
452 * This is an unusual input, we don't guarantee
453 * constant-timeness.
454 */
455 if (BN_num_bits(scalar[i]) > 256 || BN_is_negative(scalar[i])) {
456 BIGNUM *mod;
457
458 if ((mod = BN_CTX_get(ctx)) == NULL)
459 goto err;
460 if (!BN_nnmod(mod, scalar[i], &group->order, ctx)) {
461 ECerror(ERR_R_BN_LIB);
462 goto err;
463 }
464 scalars[i] = mod;
465 } else
466 scalars[i] = scalar[i];
467
468 for (j = 0; j < scalars[i]->top * BN_BYTES; j += BN_BYTES) {
469 BN_ULONG d = scalars[i]->d[j / BN_BYTES];
470
471 p_str[i][j + 0] = d & 0xff;
472 p_str[i][j + 1] = (d >> 8) & 0xff;
473 p_str[i][j + 2] = (d >> 16) & 0xff;
474 p_str[i][j + 3] = (d >> 24) & 0xff;
475 if (BN_BYTES == 8) {
476 d >>= 32;
477 p_str[i][j + 4] = d & 0xff;
478 p_str[i][j + 5] = (d >> 8) & 0xff;
479 p_str[i][j + 6] = (d >> 16) & 0xff;
480 p_str[i][j + 7] = (d >> 24) & 0xff;
481 }
482 }
483 for (; j < 33; j++)
484 p_str[i][j] = 0;
485
486 /*
487 * table[0] is implicitly (0,0,0) (the point at infinity),
488 * therefore it is not stored. All other values are actually
489 * stored with an offset of -1 in table.
490 */
491
492 if (!ecp_nistz256_bignum_to_field_elem(row[1 - 1].X,
493 &point[i]->X) ||
494 !ecp_nistz256_bignum_to_field_elem(row[1 - 1].Y,
495 &point[i]->Y) ||
496 !ecp_nistz256_bignum_to_field_elem(row[1 - 1].Z,
497 &point[i]->Z)) {
498 ECerror(EC_R_COORDINATES_OUT_OF_RANGE);
499 goto err;
500 }
501
502 ecp_nistz256_point_double(&row[ 2 - 1], &row[ 1 - 1]);
503 ecp_nistz256_point_add(&row[ 3 - 1], &row[ 2 - 1], &row[1 - 1]);
504 ecp_nistz256_point_double(&row[ 4 - 1], &row[ 2 - 1]);
505 ecp_nistz256_point_double(&row[ 6 - 1], &row[ 3 - 1]);
506 ecp_nistz256_point_double(&row[ 8 - 1], &row[ 4 - 1]);
507 ecp_nistz256_point_double(&row[12 - 1], &row[ 6 - 1]);
508 ecp_nistz256_point_add(&row[ 5 - 1], &row[ 4 - 1], &row[1 - 1]);
509 ecp_nistz256_point_add(&row[ 7 - 1], &row[ 6 - 1], &row[1 - 1]);
510 ecp_nistz256_point_add(&row[ 9 - 1], &row[ 8 - 1], &row[1 - 1]);
511 ecp_nistz256_point_add(&row[13 - 1], &row[12 - 1], &row[1 - 1]);
512 ecp_nistz256_point_double(&row[14 - 1], &row[ 7 - 1]);
513 ecp_nistz256_point_double(&row[10 - 1], &row[ 5 - 1]);
514 ecp_nistz256_point_add(&row[15 - 1], &row[14 - 1], &row[1 - 1]);
515 ecp_nistz256_point_add(&row[11 - 1], &row[10 - 1], &row[1 - 1]);
516 ecp_nistz256_point_add(&row[16 - 1], &row[15 - 1], &row[1 - 1]);
517 }
518
519 index = 255;
520
521 wvalue = p_str[0][(index - 1) / 8];
522 wvalue = (wvalue >> ((index - 1) % 8)) & mask;
523
524 ecp_nistz256_select_w5(r, table[0], _booth_recode_w5(wvalue) >> 1);
525
526 while (index >= 5) {
527 for (i = (index == 255 ? 1 : 0); i < num; i++) {
528 unsigned int off = (index - 1) / 8;
529
530 wvalue = p_str[i][off] | p_str[i][off + 1] << 8;
531 wvalue = (wvalue >> ((index - 1) % 8)) & mask;
532
533 wvalue = _booth_recode_w5(wvalue);
534
535 ecp_nistz256_select_w5(&h, table[i], wvalue >> 1);
536
537 ecp_nistz256_neg(tmp, h.Y);
538 copy_conditional(h.Y, tmp, (wvalue & 1));
539
540 ecp_nistz256_point_add(r, r, &h);
541 }
542
543 index -= window_size;
544
545 ecp_nistz256_point_double(r, r);
546 ecp_nistz256_point_double(r, r);
547 ecp_nistz256_point_double(r, r);
548 ecp_nistz256_point_double(r, r);
549 ecp_nistz256_point_double(r, r);
550 }
551
552 /* Final window */
553 for (i = 0; i < num; i++) {
554 wvalue = p_str[i][0];
555 wvalue = (wvalue << 1) & mask;
556
557 wvalue = _booth_recode_w5(wvalue);
558
559 ecp_nistz256_select_w5(&h, table[i], wvalue >> 1);
560
561 ecp_nistz256_neg(tmp, h.Y);
562 copy_conditional(h.Y, tmp, wvalue & 1);
563
564 ecp_nistz256_point_add(r, r, &h);
565 }
566
567 ret = 1;
568 err:
569 free(table);
570 free(p_str);
571 free(scalars);
572 return ret;
573}
574
575/* Coordinates of G, for which we have precomputed tables */
576static const BN_ULONG def_xG[P256_LIMBS] = {
577 TOBN(0x79e730d4, 0x18a9143c), TOBN(0x75ba95fc, 0x5fedb601),
578 TOBN(0x79fb732b, 0x77622510), TOBN(0x18905f76, 0xa53755c6)
579};
580
581static const BN_ULONG def_yG[P256_LIMBS] = {
582 TOBN(0xddf25357, 0xce95560a), TOBN(0x8b4ab8e4, 0xba19e45c),
583 TOBN(0xd2e88688, 0xdd21f325), TOBN(0x8571ff18, 0x25885d85)
584};
585
586/*
587 * ecp_nistz256_is_affine_G returns one if |generator| is the standard, P-256
588 * generator.
589 */
590static int
591ecp_nistz256_is_affine_G(const EC_POINT *generator)
592{
593 return generator->X.top == P256_LIMBS &&
594 generator->Y.top == P256_LIMBS &&
595 is_equal(generator->X.d, def_xG) &&
596 is_equal(generator->Y.d, def_yG) &&
597 is_one(&generator->Z);
598}
599
600static int
601ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx)
602{
603 /*
604 * We precompute a table for a Booth encoded exponent (wNAF) based
605 * computation. Each table holds 64 values for safe access, with an
606 * implicit value of infinity at index zero. We use a window of size 7,
607 * and therefore require ceil(256/7) = 37 tables.
608 */
609 EC_POINT *P = NULL, *T = NULL;
610 BN_CTX *new_ctx = NULL;
611 const EC_POINT *generator;
612 EC_PRE_COMP *ec_pre_comp;
613 BIGNUM *order;
614 int ret = 0;
615 unsigned int i, j, k;
616 PRECOMP256_ROW *precomp = NULL;
617
618 /* if there is an old EC_PRE_COMP object, throw it away */
619 EC_EX_DATA_free_data(&group->extra_data, ecp_nistz256_pre_comp_dup,
620 ecp_nistz256_pre_comp_free, ecp_nistz256_pre_comp_clear_free);
621
622 generator = EC_GROUP_get0_generator(group);
623 if (generator == NULL) {
624 ECerror(EC_R_UNDEFINED_GENERATOR);
625 return 0;
626 }
627
628 if (ecp_nistz256_is_affine_G(generator)) {
629 /*
630 * No need to calculate tables for the standard generator
631 * because we have them statically.
632 */
633 return 1;
634 }
635
636 if ((ec_pre_comp = ecp_nistz256_pre_comp_new(group)) == NULL)
637 return 0;
638
639 if (ctx == NULL) {
640 ctx = new_ctx = BN_CTX_new();
641 if (ctx == NULL)
642 goto err;
643 }
644
645 BN_CTX_start(ctx);
646 order = BN_CTX_get(ctx);
647
648 if (order == NULL)
649 goto err;
650
651 if (!EC_GROUP_get_order(group, order, ctx))
652 goto err;
653
654 if (BN_is_zero(order)) {
655 ECerror(EC_R_UNKNOWN_ORDER);
656 goto err;
657 }
658
659 if (posix_memalign((void **)&precomp, 64, 37 * sizeof(*precomp)) != 0) {
660 ECerror(ERR_R_MALLOC_FAILURE);
661 goto err;
662 }
663
664 P = EC_POINT_new(group);
665 T = EC_POINT_new(group);
666 if (P == NULL || T == NULL)
667 goto err;
668
669 /*
670 * The zero entry is implicitly infinity, and we skip it, storing other
671 * values with -1 offset.
672 */
673 if (!EC_POINT_copy(T, generator))
674 goto err;
675
676 for (k = 0; k < 64; k++) {
677 if (!EC_POINT_copy(P, T))
678 goto err;
679 for (j = 0; j < 37; j++) {
680 /*
681 * It would be faster to use EC_POINTs_make_affine and
682 * make multiple points affine at the same time.
683 */
684 if (!EC_POINT_make_affine(group, P, ctx))
685 goto err;
686 if (!ecp_nistz256_bignum_to_field_elem(
687 precomp[j][k].X, &P->X) ||
688 !ecp_nistz256_bignum_to_field_elem(
689 precomp[j][k].Y, &P->Y)) {
690 ECerror(EC_R_COORDINATES_OUT_OF_RANGE);
691 goto err;
692 }
693 for (i = 0; i < 7; i++) {
694 if (!EC_POINT_dbl(group, P, P, ctx))
695 goto err;
696 }
697 }
698 if (!EC_POINT_add(group, T, T, generator, ctx))
699 goto err;
700 }
701
702 ec_pre_comp->group = group;
703 ec_pre_comp->w = 7;
704 ec_pre_comp->precomp = precomp;
705
706 if (!EC_EX_DATA_set_data(&group->extra_data, ec_pre_comp,
707 ecp_nistz256_pre_comp_dup, ecp_nistz256_pre_comp_free,
708 ecp_nistz256_pre_comp_clear_free)) {
709 goto err;
710 }
711
712 ec_pre_comp = NULL;
713 ret = 1;
714
715 err:
716 if (ctx != NULL)
717 BN_CTX_end(ctx);
718 BN_CTX_free(new_ctx);
719
720 ecp_nistz256_pre_comp_free(ec_pre_comp);
721 free(precomp);
722 EC_POINT_free(P);
723 EC_POINT_free(T);
724 return ret;
725}
726
727static int
728ecp_nistz256_set_from_affine(EC_POINT *out, const EC_GROUP *group,
729 const P256_POINT_AFFINE *in, BN_CTX *ctx)
730{
731 BIGNUM x, y;
732 BN_ULONG d_x[P256_LIMBS], d_y[P256_LIMBS];
733 int ret = 0;
734
735 memcpy(d_x, in->X, sizeof(d_x));
736 x.d = d_x;
737 x.dmax = x.top = P256_LIMBS;
738 x.neg = 0;
739 x.flags = BN_FLG_STATIC_DATA;
740
741 memcpy(d_y, in->Y, sizeof(d_y));
742 y.d = d_y;
743 y.dmax = y.top = P256_LIMBS;
744 y.neg = 0;
745 y.flags = BN_FLG_STATIC_DATA;
746
747 ret = EC_POINT_set_affine_coordinates(group, out, &x, &y, ctx);
748
749 return ret;
750}
751
752/* r = scalar*G + sum(scalars[i]*points[i]) */
753static int
754ecp_nistz256_points_mul(const EC_GROUP *group, EC_POINT *r,
755 const BIGNUM *scalar, size_t num, const EC_POINT *points[],
756 const BIGNUM *scalars[], BN_CTX *ctx)
757{
758 int ret = 0, no_precomp_for_generator = 0, p_is_infinity = 0;
759 size_t j;
760 unsigned char p_str[33] = { 0 };
761 const PRECOMP256_ROW *precomp = NULL;
762 const EC_PRE_COMP *ec_pre_comp = NULL;
763 const EC_POINT *generator = NULL;
764 unsigned int i = 0, index = 0;
765 BN_CTX *new_ctx = NULL;
766 const BIGNUM **new_scalars = NULL;
767 const EC_POINT **new_points = NULL;
768 const unsigned int window_size = 7;
769 const unsigned int mask = (1 << (window_size + 1)) - 1;
770 unsigned int wvalue;
771 /* avoid warning about ignored alignment for stack variable */
772#if defined(__GNUC__) && !defined(__OpenBSD__)
773 ALIGN32
774#endif
775 union {
776 P256_POINT p;
777 P256_POINT_AFFINE a;
778 } t, p;
779 BIGNUM *tmp_scalar;
780
781 if (group->meth != r->meth) {
782 ECerror(EC_R_INCOMPATIBLE_OBJECTS);
783 return 0;
784 }
785
786 if (scalar == NULL && num == 0)
787 return EC_POINT_set_to_infinity(group, r);
788
789 for (j = 0; j < num; j++) {
790 if (group->meth != points[j]->meth) {
791 ECerror(EC_R_INCOMPATIBLE_OBJECTS);
792 return 0;
793 }
794 }
795
796 if (ctx == NULL) {
797 ctx = new_ctx = BN_CTX_new();
798 if (ctx == NULL)
799 goto err;
800 }
801
802 BN_CTX_start(ctx);
803
804 if (scalar) {
805 generator = EC_GROUP_get0_generator(group);
806 if (generator == NULL) {
807 ECerror(EC_R_UNDEFINED_GENERATOR);
808 goto err;
809 }
810
811 /* look if we can use precomputed multiples of generator */
812 ec_pre_comp = EC_EX_DATA_get_data(group->extra_data,
813 ecp_nistz256_pre_comp_dup, ecp_nistz256_pre_comp_free,
814 ecp_nistz256_pre_comp_clear_free);
815 if (ec_pre_comp != NULL) {
816 /*
817 * If there is a precomputed table for the generator,
818 * check that it was generated with the same generator.
819 */
820 EC_POINT *pre_comp_generator = EC_POINT_new(group);
821 if (pre_comp_generator == NULL)
822 goto err;
823
824 if (!ecp_nistz256_set_from_affine(pre_comp_generator,
825 group, ec_pre_comp->precomp[0], ctx)) {
826 EC_POINT_free(pre_comp_generator);
827 goto err;
828 }
829
830 if (0 == EC_POINT_cmp(group, generator,
831 pre_comp_generator, ctx))
832 precomp = (const PRECOMP256_ROW *)
833 ec_pre_comp->precomp;
834
835 EC_POINT_free(pre_comp_generator);
836 }
837
838 if (precomp == NULL && ecp_nistz256_is_affine_G(generator)) {
839 /*
840 * If there is no precomputed data, but the generator
841 * is the default, a hardcoded table of precomputed
842 * data is used. This is because applications, such as
843 * Apache, do not use EC_KEY_precompute_mult.
844 */
845 precomp =
846 (const PRECOMP256_ROW *)ecp_nistz256_precomputed;
847 }
848
849 if (precomp) {
850 if (BN_num_bits(scalar) > 256 ||
851 BN_is_negative(scalar)) {
852 if ((tmp_scalar = BN_CTX_get(ctx)) == NULL)
853 goto err;
854
855 if (!BN_nnmod(tmp_scalar, scalar, &group->order,
856 ctx)) {
857 ECerror(ERR_R_BN_LIB);
858 goto err;
859 }
860 scalar = tmp_scalar;
861 }
862
863 for (i = 0; i < scalar->top * BN_BYTES; i += BN_BYTES) {
864 BN_ULONG d = scalar->d[i / BN_BYTES];
865
866 p_str[i + 0] = d & 0xff;
867 p_str[i + 1] = (d >> 8) & 0xff;
868 p_str[i + 2] = (d >> 16) & 0xff;
869 p_str[i + 3] = (d >> 24) & 0xff;
870 if (BN_BYTES == 8) {
871 d >>= 32;
872 p_str[i + 4] = d & 0xff;
873 p_str[i + 5] = (d >> 8) & 0xff;
874 p_str[i + 6] = (d >> 16) & 0xff;
875 p_str[i + 7] = (d >> 24) & 0xff;
876 }
877 }
878
879 for (; i < 33; i++)
880 p_str[i] = 0;
881
882 /* First window */
883 wvalue = (p_str[0] << 1) & mask;
884 index += window_size;
885
886 wvalue = _booth_recode_w7(wvalue);
887
888 ecp_nistz256_select_w7(&p.a, precomp[0], wvalue >> 1);
889
890 ecp_nistz256_neg(p.p.Z, p.p.Y);
891 copy_conditional(p.p.Y, p.p.Z, wvalue & 1);
892
893 /*
894 * Since affine infinity is encoded as (0,0) and
895 * Jacobian is (,,0), we need to harmonize them
896 * by assigning "one" or zero to Z.
897 */
898 BN_ULONG infty;
899 infty = (p.p.X[0] | p.p.X[1] | p.p.X[2] | p.p.X[3] |
900 p.p.Y[0] | p.p.Y[1] | p.p.Y[2] | p.p.Y[3]);
901 if (P256_LIMBS == 8)
902 infty |=
903 (p.p.X[4] | p.p.X[5] | p.p.X[6] | p.p.X[7] |
904 p.p.Y[4] | p.p.Y[5] | p.p.Y[6] | p.p.Y[7]);
905
906 infty = 0 - is_zero(infty);
907 infty = ~infty;
908
909 p.p.Z[0] = ONE[0] & infty;
910 p.p.Z[1] = ONE[1] & infty;
911 p.p.Z[2] = ONE[2] & infty;
912 p.p.Z[3] = ONE[3] & infty;
913 if (P256_LIMBS == 8) {
914 p.p.Z[4] = ONE[4] & infty;
915 p.p.Z[5] = ONE[5] & infty;
916 p.p.Z[6] = ONE[6] & infty;
917 p.p.Z[7] = ONE[7] & infty;
918 }
919
920 for (i = 1; i < 37; i++) {
921 unsigned int off = (index - 1) / 8;
922 wvalue = p_str[off] | p_str[off + 1] << 8;
923 wvalue = (wvalue >> ((index - 1) % 8)) & mask;
924 index += window_size;
925
926 wvalue = _booth_recode_w7(wvalue);
927
928 ecp_nistz256_select_w7(&t.a, precomp[i],
929 wvalue >> 1);
930
931 ecp_nistz256_neg(t.p.Z, t.a.Y);
932 copy_conditional(t.a.Y, t.p.Z, wvalue & 1);
933
934 ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
935 }
936 } else {
937 p_is_infinity = 1;
938 no_precomp_for_generator = 1;
939 }
940 } else
941 p_is_infinity = 1;
942
943 if (no_precomp_for_generator) {
944 /*
945 * Without a precomputed table for the generator, it has to be
946 * handled like a normal point.
947 */
948 new_scalars = reallocarray(NULL, num + 1, sizeof(BIGNUM *));
949 new_points = reallocarray(NULL, num + 1, sizeof(EC_POINT *));
950 if (new_scalars == NULL || new_points == NULL) {
951 ECerror(ERR_R_MALLOC_FAILURE);
952 goto err;
953 }
954
955 memcpy(new_scalars, scalars, num * sizeof(BIGNUM *));
956 new_scalars[num] = scalar;
957 memcpy(new_points, points, num * sizeof(EC_POINT *));
958 new_points[num] = generator;
959
960 scalars = new_scalars;
961 points = new_points;
962 num++;
963 }
964
965 if (num != 0) {
966 P256_POINT *out = &t.p;
967 if (p_is_infinity)
968 out = &p.p;
969
970 if (!ecp_nistz256_windowed_mul(group, out, scalars, points, num,
971 ctx))
972 goto err;
973
974 if (!p_is_infinity)
975 ecp_nistz256_point_add(&p.p, &p.p, out);
976 }
977
978 /* Not constant-time, but we're only operating on the public output. */
979 if (!ecp_nistz256_set_words(&r->X, p.p.X) ||
980 !ecp_nistz256_set_words(&r->Y, p.p.Y) ||
981 !ecp_nistz256_set_words(&r->Z, p.p.Z)) {
982 goto err;
983 }
984 r->Z_is_one = is_one(&r->Z) & 1;
985
986 ret = 1;
987
988 err:
989 if (ctx)
990 BN_CTX_end(ctx);
991 BN_CTX_free(new_ctx);
992 free(new_points);
993 free(new_scalars);
994 return ret;
995}
996
997static int
998ecp_nistz256_get_affine(const EC_GROUP *group, const EC_POINT *point,
999 BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
1000{
1001 BN_ULONG z_inv2[P256_LIMBS];
1002 BN_ULONG z_inv3[P256_LIMBS];
1003 BN_ULONG point_x[P256_LIMBS], point_y[P256_LIMBS], point_z[P256_LIMBS];
1004
1005 if (EC_POINT_is_at_infinity(group, point)) {
1006 ECerror(EC_R_POINT_AT_INFINITY);
1007 return 0;
1008 }
1009
1010 if (!ecp_nistz256_bignum_to_field_elem(point_x, &point->X) ||
1011 !ecp_nistz256_bignum_to_field_elem(point_y, &point->Y) ||
1012 !ecp_nistz256_bignum_to_field_elem(point_z, &point->Z)) {
1013 ECerror(EC_R_COORDINATES_OUT_OF_RANGE);
1014 return 0;
1015 }
1016
1017 ecp_nistz256_mod_inverse(z_inv3, point_z);
1018 ecp_nistz256_sqr_mont(z_inv2, z_inv3);
1019
1020 /*
1021 * Unlike the |BN_mod_mul_montgomery|-based implementation, we cannot
1022 * factor out the two calls to |ecp_nistz256_from_mont| into one call,
1023 * because |ecp_nistz256_from_mont| must be the last operation to
1024 * ensure that the result is fully reduced mod P.
1025 */
1026 if (x != NULL) {
1027 BN_ULONG x_aff[P256_LIMBS];
1028 BN_ULONG x_ret[P256_LIMBS];
1029
1030 ecp_nistz256_mul_mont(x_aff, z_inv2, point_x);
1031 ecp_nistz256_from_mont(x_ret, x_aff);
1032 if (!ecp_nistz256_set_words(x, x_ret))
1033 return 0;
1034 }
1035
1036 if (y != NULL) {
1037 BN_ULONG y_aff[P256_LIMBS];
1038 BN_ULONG y_ret[P256_LIMBS];
1039
1040 ecp_nistz256_mul_mont(z_inv3, z_inv3, z_inv2);
1041 ecp_nistz256_mul_mont(y_aff, z_inv3, point_y);
1042 ecp_nistz256_from_mont(y_ret, y_aff);
1043 if (!ecp_nistz256_set_words(y, y_ret))
1044 return 0;
1045 }
1046
1047 return 1;
1048}
1049
1050static EC_PRE_COMP *
1051ecp_nistz256_pre_comp_new(const EC_GROUP *group)
1052{
1053 EC_PRE_COMP *ret;
1054
1055 if (group == NULL)
1056 return NULL;
1057
1058 ret = (EC_PRE_COMP *)malloc(sizeof(EC_PRE_COMP));
1059 if (ret == NULL) {
1060 ECerror(ERR_R_MALLOC_FAILURE);
1061 return ret;
1062 }
1063
1064 ret->group = group;
1065 ret->w = 6; /* default */
1066 ret->precomp = NULL;
1067 ret->references = 1;
1068 return ret;
1069}
1070
1071static void *
1072ecp_nistz256_pre_comp_dup(void *src_)
1073{
1074 EC_PRE_COMP *src = src_;
1075
1076 /* no need to actually copy, these objects never change! */
1077 CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
1078
1079 return src_;
1080}
1081
1082static void
1083ecp_nistz256_pre_comp_free(void *pre_)
1084{
1085 int i;
1086 EC_PRE_COMP *pre = pre_;
1087
1088 if (pre == NULL)
1089 return;
1090
1091 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1092 if (i > 0)
1093 return;
1094
1095 free(pre->precomp);
1096 free(pre);
1097}
1098
1099static void
1100ecp_nistz256_pre_comp_clear_free(void *pre_)
1101{
1102 int i;
1103 EC_PRE_COMP *pre = pre_;
1104
1105 if (pre == NULL)
1106 return;
1107
1108 i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
1109 if (i > 0)
1110 return;
1111
1112 if (pre->precomp != NULL) {
1113 /*
1114 * LSSL XXX
1115 * The original OpenSSL code uses an obfuscated
1116 * computation which is intended to be
1117 * 37 * (1 << pre->w) * sizeof(P256_POINT_AFFINE)
1118 * here, but the only place where we allocate this uses
1119 * PRECOMP256_ROW (i.e. 64 P256_POINT_AFFINE) but sets w == 7.
1120 */
1121 freezero(pre->precomp, 37 * sizeof(PRECOMP256_ROW));
1122 }
1123 freezero(pre, sizeof *pre);
1124}
1125
1126static int
1127ecp_nistz256_window_have_precompute_mult(const EC_GROUP *group)
1128{
1129 /* There is a hard-coded table for the default generator. */
1130 const EC_POINT *generator = EC_GROUP_get0_generator(group);
1131 if (generator != NULL && ecp_nistz256_is_affine_G(generator)) {
1132 /* There is a hard-coded table for the default generator. */
1133 return 1;
1134 }
1135
1136 return
1137 EC_EX_DATA_get_data(group->extra_data, ecp_nistz256_pre_comp_dup,
1138 ecp_nistz256_pre_comp_free, ecp_nistz256_pre_comp_clear_free) !=
1139 NULL;
1140}
1141
1142const EC_METHOD *
1143EC_GFp_nistz256_method(void)
1144{
1145 static const EC_METHOD ret = {
1146 .flags = EC_FLAGS_DEFAULT_OCT,
1147 .field_type = NID_X9_62_prime_field,
1148 .group_init = ec_GFp_mont_group_init,
1149 .group_finish = ec_GFp_mont_group_finish,
1150 .group_clear_finish = ec_GFp_mont_group_clear_finish,
1151 .group_copy = ec_GFp_mont_group_copy,
1152 .group_set_curve = ec_GFp_mont_group_set_curve,
1153 .group_get_curve = ec_GFp_simple_group_get_curve,
1154 .group_get_degree = ec_GFp_simple_group_get_degree,
1155 .group_order_bits = ec_group_simple_order_bits,
1156 .group_check_discriminant =
1157 ec_GFp_simple_group_check_discriminant,
1158 .point_init = ec_GFp_simple_point_init,
1159 .point_finish = ec_GFp_simple_point_finish,
1160 .point_clear_finish = ec_GFp_simple_point_clear_finish,
1161 .point_copy = ec_GFp_simple_point_copy,
1162 .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity,
1163 .point_set_Jprojective_coordinates =
1164 ec_GFp_simple_set_Jprojective_coordinates,
1165 .point_get_Jprojective_coordinates =
1166 ec_GFp_simple_get_Jprojective_coordinates,
1167 .point_set_affine_coordinates =
1168 ec_GFp_simple_point_set_affine_coordinates,
1169 .point_get_affine_coordinates = ecp_nistz256_get_affine,
1170 .add = ec_GFp_simple_add,
1171 .dbl = ec_GFp_simple_dbl,
1172 .invert = ec_GFp_simple_invert,
1173 .is_at_infinity = ec_GFp_simple_is_at_infinity,
1174 .is_on_curve = ec_GFp_simple_is_on_curve,
1175 .point_cmp = ec_GFp_simple_cmp,
1176 .make_affine = ec_GFp_simple_make_affine,
1177 .points_make_affine = ec_GFp_simple_points_make_affine,
1178 .mul = ecp_nistz256_points_mul,
1179 .precompute_mult = ecp_nistz256_mult_precompute,
1180 .have_precompute_mult =
1181 ecp_nistz256_window_have_precompute_mult,
1182 .field_mul = ec_GFp_mont_field_mul,
1183 .field_sqr = ec_GFp_mont_field_sqr,
1184 .field_encode = ec_GFp_mont_field_encode,
1185 .field_decode = ec_GFp_mont_field_decode,
1186 .field_set_to_one = ec_GFp_mont_field_set_to_one,
1187 .blind_coordinates = NULL,
1188 };
1189
1190 return &ret;
1191}
diff --git a/src/lib/libcrypto/ec/ecp_nistz256_table.h b/src/lib/libcrypto/ec/ecp_nistz256_table.h
deleted file mode 100644
index 6aa74edf35..0000000000
--- a/src/lib/libcrypto/ec/ecp_nistz256_table.h
+++ /dev/null
@@ -1,9557 +0,0 @@
1/* $OpenBSD: ecp_nistz256_table.h,v 1.2 2016/12/21 15:49:29 jsing Exp $ */
2/* Copyright (c) 2015, Intel Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
15
16/* This is the precomputed constant time access table for the code in
17 * ecp_nistz256.c, for the default generator. The table consists of 37
18 * subtables, each subtable contains 64 affine points. The affine points are
19 * encoded as eight uint64's, four for the x coordinate and four for the y.
20 * Both values are in little-endian order. There are 37 tables because a
21 * signed, 6-bit wNAF form of the scalar is used and ceil(256/(6 + 1)) = 37.
22 * Within each table there are 64 values because the 6-bit wNAF value can take
23 * 64 values, ignoring the sign bit, which is implemented by performing a
24 * negation of the affine point when required. We would like to align it to 2MB
25 * in order to increase the chances of using a large page but that appears to
26 * lead to invalid ELF files being produced. */
27
28__BEGIN_HIDDEN_DECLS
29
30#if defined(__GNUC__)
31__attribute((aligned(4096)))
32#elif defined(_MSC_VER)
33__declspec(align(4096))
34#elif defined(__SUNPRO_C)
35# pragma align 4096(ecp_nistz256_precomputed)
36#endif
37static const BN_ULONG
38ecp_nistz256_precomputed
39 [37][64 * sizeof(P256_POINT_AFFINE) / sizeof(BN_ULONG)] =
40{
41 {TOBN(0x79e730d4, 0x18a9143c), TOBN(0x75ba95fc, 0x5fedb601),
42 TOBN(0x79fb732b, 0x77622510), TOBN(0x18905f76, 0xa53755c6),
43 TOBN(0xddf25357, 0xce95560a), TOBN(0x8b4ab8e4, 0xba19e45c),
44 TOBN(0xd2e88688, 0xdd21f325), TOBN(0x8571ff18, 0x25885d85),
45 TOBN(0x850046d4, 0x10ddd64d), TOBN(0xaa6ae3c1, 0xa433827d),
46 TOBN(0x73220503, 0x8d1490d9), TOBN(0xf6bb32e4, 0x3dcf3a3b),
47 TOBN(0x2f3648d3, 0x61bee1a5), TOBN(0x152cd7cb, 0xeb236ff8),
48 TOBN(0x19a8fb0e, 0x92042dbe), TOBN(0x78c57751, 0x0a5b8a3b),
49 TOBN(0xffac3f90, 0x4eebc127), TOBN(0xb027f84a, 0x087d81fb),
50 TOBN(0x66ad77dd, 0x87cbbc98), TOBN(0x26936a3f, 0xb6ff747e),
51 TOBN(0xb04c5c1f, 0xc983a7eb), TOBN(0x583e47ad, 0x0861fe1a),
52 TOBN(0x78820831, 0x1a2ee98e), TOBN(0xd5f06a29, 0xe587cc07),
53 TOBN(0x74b0b50d, 0x46918dcc), TOBN(0x4650a6ed, 0xc623c173),
54 TOBN(0x0cdaacac, 0xe8100af2), TOBN(0x577362f5, 0x41b0176b),
55 TOBN(0x2d96f24c, 0xe4cbaba6), TOBN(0x17628471, 0xfad6f447),
56 TOBN(0x6b6c36de, 0xe5ddd22e), TOBN(0x84b14c39, 0x4c5ab863),
57 TOBN(0xbe1b8aae, 0xc45c61f5), TOBN(0x90ec649a, 0x94b9537d),
58 TOBN(0x941cb5aa, 0xd076c20c), TOBN(0xc9079605, 0x890523c8),
59 TOBN(0xeb309b4a, 0xe7ba4f10), TOBN(0x73c568ef, 0xe5eb882b),
60 TOBN(0x3540a987, 0x7e7a1f68), TOBN(0x73a076bb, 0x2dd1e916),
61 TOBN(0x40394737, 0x3e77664a), TOBN(0x55ae744f, 0x346cee3e),
62 TOBN(0xd50a961a, 0x5b17a3ad), TOBN(0x13074b59, 0x54213673),
63 TOBN(0x93d36220, 0xd377e44b), TOBN(0x299c2b53, 0xadff14b5),
64 TOBN(0xf424d44c, 0xef639f11), TOBN(0xa4c9916d, 0x4a07f75f),
65 TOBN(0x0746354e, 0xa0173b4f), TOBN(0x2bd20213, 0xd23c00f7),
66 TOBN(0xf43eaab5, 0x0c23bb08), TOBN(0x13ba5119, 0xc3123e03),
67 TOBN(0x2847d030, 0x3f5b9d4d), TOBN(0x6742f2f2, 0x5da67bdd),
68 TOBN(0xef933bdc, 0x77c94195), TOBN(0xeaedd915, 0x6e240867),
69 TOBN(0x27f14cd1, 0x9499a78f), TOBN(0x462ab5c5, 0x6f9b3455),
70 TOBN(0x8f90f02a, 0xf02cfc6b), TOBN(0xb763891e, 0xb265230d),
71 TOBN(0xf59da3a9, 0x532d4977), TOBN(0x21e3327d, 0xcf9eba15),
72 TOBN(0x123c7b84, 0xbe60bbf0), TOBN(0x56ec12f2, 0x7706df76),
73 TOBN(0x75c96e8f, 0x264e20e8), TOBN(0xabe6bfed, 0x59a7a841),
74 TOBN(0x2cc09c04, 0x44c8eb00), TOBN(0xe05b3080, 0xf0c4e16b),
75 TOBN(0x1eb7777a, 0xa45f3314), TOBN(0x56af7bed, 0xce5d45e3),
76 TOBN(0x2b6e019a, 0x88b12f1a), TOBN(0x086659cd, 0xfd835f9b),
77 TOBN(0x2c18dbd1, 0x9dc21ec8), TOBN(0x98f9868a, 0x0fcf8139),
78 TOBN(0x737d2cd6, 0x48250b49), TOBN(0xcc61c947, 0x24b3428f),
79 TOBN(0x0c2b4078, 0x80dd9e76), TOBN(0xc43a8991, 0x383fbe08),
80 TOBN(0x5f7d2d65, 0x779be5d2), TOBN(0x78719a54, 0xeb3b4ab5),
81 TOBN(0xea7d260a, 0x6245e404), TOBN(0x9de40795, 0x6e7fdfe0),
82 TOBN(0x1ff3a415, 0x8dac1ab5), TOBN(0x3e7090f1, 0x649c9073),
83 TOBN(0x1a768561, 0x2b944e88), TOBN(0x250f939e, 0xe57f61c8),
84 TOBN(0x0c0daa89, 0x1ead643d), TOBN(0x68930023, 0xe125b88e),
85 TOBN(0x04b71aa7, 0xd2697768), TOBN(0xabdedef5, 0xca345a33),
86 TOBN(0x2409d29d, 0xee37385e), TOBN(0x4ee1df77, 0xcb83e156),
87 TOBN(0x0cac12d9, 0x1cbb5b43), TOBN(0x170ed2f6, 0xca895637),
88 TOBN(0x28228cfa, 0x8ade6d66), TOBN(0x7ff57c95, 0x53238aca),
89 TOBN(0xccc42563, 0x4b2ed709), TOBN(0x0e356769, 0x856fd30d),
90 TOBN(0xbcbcd43f, 0x559e9811), TOBN(0x738477ac, 0x5395b759),
91 TOBN(0x35752b90, 0xc00ee17f), TOBN(0x68748390, 0x742ed2e3),
92 TOBN(0x7cd06422, 0xbd1f5bc1), TOBN(0xfbc08769, 0xc9e7b797),
93 TOBN(0xa242a35b, 0xb0cf664a), TOBN(0x126e48f7, 0x7f9707e3),
94 TOBN(0x1717bf54, 0xc6832660), TOBN(0xfaae7332, 0xfd12c72e),
95 TOBN(0x27b52db7, 0x995d586b), TOBN(0xbe29569e, 0x832237c2),
96 TOBN(0xe8e4193e, 0x2a65e7db), TOBN(0x152706dc, 0x2eaa1bbb),
97 TOBN(0x72bcd8b7, 0xbc60055b), TOBN(0x03cc23ee, 0x56e27e4b),
98 TOBN(0xee337424, 0xe4819370), TOBN(0xe2aa0e43, 0x0ad3da09),
99 TOBN(0x40b8524f, 0x6383c45d), TOBN(0xd7663554, 0x42a41b25),
100 TOBN(0x64efa6de, 0x778a4797), TOBN(0x2042170a, 0x7079adf4),
101 TOBN(0x808b0b65, 0x0bc6fb80), TOBN(0x5882e075, 0x3ffe2e6b),
102 TOBN(0xd5ef2f7c, 0x2c83f549), TOBN(0x54d63c80, 0x9103b723),
103 TOBN(0xf2f11bd6, 0x52a23f9b), TOBN(0x3670c319, 0x4b0b6587),
104 TOBN(0x55c4623b, 0xb1580e9e), TOBN(0x64edf7b2, 0x01efe220),
105 TOBN(0x97091dcb, 0xd53c5c9d), TOBN(0xf17624b6, 0xac0a177b),
106 TOBN(0xb0f13975, 0x2cfe2dff), TOBN(0xc1a35c0a, 0x6c7a574e),
107 TOBN(0x227d3146, 0x93e79987), TOBN(0x0575bf30, 0xe89cb80e),
108 TOBN(0x2f4e247f, 0x0d1883bb), TOBN(0xebd51226, 0x3274c3d0),
109 TOBN(0x5f3e51c8, 0x56ada97a), TOBN(0x4afc964d, 0x8f8b403e),
110 TOBN(0xa6f247ab, 0x412e2979), TOBN(0x675abd1b, 0x6f80ebda),
111 TOBN(0x66a2bd72, 0x5e485a1d), TOBN(0x4b2a5caf, 0x8f4f0b3c),
112 TOBN(0x2626927f, 0x1b847bba), TOBN(0x6c6fc7d9, 0x0502394d),
113 TOBN(0xfea912ba, 0xa5659ae8), TOBN(0x68363aba, 0x25e1a16e),
114 TOBN(0xb8842277, 0x752c41ac), TOBN(0xfe545c28, 0x2897c3fc),
115 TOBN(0x2d36e9e7, 0xdc4c696b), TOBN(0x5806244a, 0xfba977c5),
116 TOBN(0x85665e9b, 0xe39508c1), TOBN(0xf720ee25, 0x6d12597b),
117 TOBN(0x8a979129, 0xd2337a31), TOBN(0x5916868f, 0x0f862bdc),
118 TOBN(0x048099d9, 0x5dd283ba), TOBN(0xe2d1eeb6, 0xfe5bfb4e),
119 TOBN(0x82ef1c41, 0x7884005d), TOBN(0xa2d4ec17, 0xffffcbae),
120 TOBN(0x9161c53f, 0x8aa95e66), TOBN(0x5ee104e1, 0xc5fee0d0),
121 TOBN(0x562e4cec, 0xc135b208), TOBN(0x74e1b265, 0x4783f47d),
122 TOBN(0x6d2a506c, 0x5a3f3b30), TOBN(0xecead9f4, 0xc16762fc),
123 TOBN(0xf29dd4b2, 0xe286e5b9), TOBN(0x1b0fadc0, 0x83bb3c61),
124 TOBN(0x7a75023e, 0x7fac29a4), TOBN(0xc086d5f1, 0xc9477fa3),
125 TOBN(0x0fc61135, 0x2f6f3076), TOBN(0xc99ffa23, 0xe3912a9a),
126 TOBN(0x6a0b0685, 0xd2f8ba3d), TOBN(0xfdc777e8, 0xe93358a4),
127 TOBN(0x94a787bb, 0x35415f04), TOBN(0x640c2d6a, 0x4d23fea4),
128 TOBN(0x9de917da, 0x153a35b5), TOBN(0x793e8d07, 0x5d5cd074),
129 TOBN(0xf4f87653, 0x2de45068), TOBN(0x37c7a7e8, 0x9e2e1f6e),
130 TOBN(0xd0825fa2, 0xa3584069), TOBN(0xaf2cea7c, 0x1727bf42),
131 TOBN(0x0360a4fb, 0x9e4785a9), TOBN(0xe5fda49c, 0x27299f4a),
132 TOBN(0x48068e13, 0x71ac2f71), TOBN(0x83d0687b, 0x9077666f),
133 TOBN(0x6d3883b2, 0x15d02819), TOBN(0x6d0d7550, 0x40dd9a35),
134 TOBN(0x61d7cbf9, 0x1d2b469f), TOBN(0xf97b232f, 0x2efc3115),
135 TOBN(0xa551d750, 0xb24bcbc7), TOBN(0x11ea4949, 0x88a1e356),
136 TOBN(0x7669f031, 0x93cb7501), TOBN(0x595dc55e, 0xca737b8a),
137 TOBN(0xa4a319ac, 0xd837879f), TOBN(0x6fc1b49e, 0xed6b67b0),
138 TOBN(0xe3959933, 0x32f1f3af), TOBN(0x966742eb, 0x65432a2e),
139 TOBN(0x4b8dc9fe, 0xb4966228), TOBN(0x96cc6312, 0x43f43950),
140 TOBN(0x12068859, 0xc9b731ee), TOBN(0x7b948dc3, 0x56f79968),
141 TOBN(0x61e4ad32, 0xed1f8008), TOBN(0xe6c9267a, 0xd8b17538),
142 TOBN(0x1ac7c5eb, 0x857ff6fb), TOBN(0x994baaa8, 0x55f2fb10),
143 TOBN(0x84cf14e1, 0x1d248018), TOBN(0x5a39898b, 0x628ac508),
144 TOBN(0x14fde97b, 0x5fa944f5), TOBN(0xed178030, 0xd12e5ac7),
145 TOBN(0x042c2af4, 0x97e2feb4), TOBN(0xd36a42d7, 0xaebf7313),
146 TOBN(0x49d2c9eb, 0x084ffdd7), TOBN(0x9f8aa54b, 0x2ef7c76a),
147 TOBN(0x9200b7ba, 0x09895e70), TOBN(0x3bd0c66f, 0xddb7fb58),
148 TOBN(0x2d97d108, 0x78eb4cbb), TOBN(0x2d431068, 0xd84bde31),
149 TOBN(0x4b523eb7, 0x172ccd1f), TOBN(0x7323cb28, 0x30a6a892),
150 TOBN(0x97082ec0, 0xcfe153eb), TOBN(0xe97f6b6a, 0xf2aadb97),
151 TOBN(0x1d3d393e, 0xd1a83da1), TOBN(0xa6a7f9c7, 0x804b2a68),
152 TOBN(0x4a688b48, 0x2d0cb71e), TOBN(0xa9b4cc5f, 0x40585278),
153 TOBN(0x5e5db46a, 0xcb66e132), TOBN(0xf1be963a, 0x0d925880),
154 TOBN(0x944a7027, 0x0317b9e2), TOBN(0xe266f959, 0x48603d48),
155 TOBN(0x98db6673, 0x5c208899), TOBN(0x90472447, 0xa2fb18a3),
156 TOBN(0x8a966939, 0x777c619f), TOBN(0x3798142a, 0x2a3be21b),
157 TOBN(0xb4241cb1, 0x3298b343), TOBN(0xa3a14e49, 0xb44f65a1),
158 TOBN(0xc5f4d6cd, 0x3ac77acd), TOBN(0xd0288cb5, 0x52b6fc3c),
159 TOBN(0xd5cc8c2f, 0x1c040abc), TOBN(0xb675511e, 0x06bf9b4a),
160 TOBN(0xd667da37, 0x9b3aa441), TOBN(0x460d45ce, 0x51601f72),
161 TOBN(0xe2f73c69, 0x6755ff89), TOBN(0xdd3cf7e7, 0x473017e6),
162 TOBN(0x8ef5689d, 0x3cf7600d), TOBN(0x948dc4f8, 0xb1fc87b4),
163 TOBN(0xd9e9fe81, 0x4ea53299), TOBN(0x2d921ca2, 0x98eb6028),
164 TOBN(0xfaecedfd, 0x0c9803fc), TOBN(0xf38ae891, 0x4d7b4745),
165 TOBN(0xd8c5fccf, 0xc5e3a3d8), TOBN(0xbefd904c, 0x4079dfbf),
166 TOBN(0xbc6d6a58, 0xfead0197), TOBN(0x39227077, 0x695532a4),
167 TOBN(0x09e23e6d, 0xdbef42f5), TOBN(0x7e449b64, 0x480a9908),
168 TOBN(0x7b969c1a, 0xad9a2e40), TOBN(0x6231d792, 0x9591c2a4),
169 TOBN(0x87151456, 0x0f664534), TOBN(0x85ceae7c, 0x4b68f103),
170 TOBN(0xac09c4ae, 0x65578ab9), TOBN(0x33ec6868, 0xf044b10c),
171 TOBN(0x6ac4832b, 0x3a8ec1f1), TOBN(0x5509d128, 0x5847d5ef),
172 TOBN(0xf909604f, 0x763f1574), TOBN(0xb16c4303, 0xc32f63c4),
173 TOBN(0xb6ab2014, 0x7ca23cd3), TOBN(0xcaa7a5c6, 0xa391849d),
174 TOBN(0x5b0673a3, 0x75678d94), TOBN(0xc982ddd4, 0xdd303e64),
175 TOBN(0xfd7b000b, 0x5db6f971), TOBN(0xbba2cb1f, 0x6f876f92),
176 TOBN(0xc77332a3, 0x3c569426), TOBN(0xa159100c, 0x570d74f8),
177 TOBN(0xfd16847f, 0xdec67ef5), TOBN(0x742ee464, 0x233e76b7),
178 TOBN(0x0b8e4134, 0xefc2b4c8), TOBN(0xca640b86, 0x42a3e521),
179 TOBN(0x653a0190, 0x8ceb6aa9), TOBN(0x313c300c, 0x547852d5),
180 TOBN(0x24e4ab12, 0x6b237af7), TOBN(0x2ba90162, 0x8bb47af8),
181 TOBN(0x3d5e58d6, 0xa8219bb7), TOBN(0xc691d0bd, 0x1b06c57f),
182 TOBN(0x0ae4cb10, 0xd257576e), TOBN(0x3569656c, 0xd54a3dc3),
183 TOBN(0xe5ebaebd, 0x94cda03a), TOBN(0x934e82d3, 0x162bfe13),
184 TOBN(0x450ac0ba, 0xe251a0c6), TOBN(0x480b9e11, 0xdd6da526),
185 TOBN(0x00467bc5, 0x8cce08b5), TOBN(0xb636458c, 0x7f178d55),
186 TOBN(0xc5748bae, 0xa677d806), TOBN(0x2763a387, 0xdfa394eb),
187 TOBN(0xa12b448a, 0x7d3cebb6), TOBN(0xe7adda3e, 0x6f20d850),
188 TOBN(0xf63ebce5, 0x1558462c), TOBN(0x58b36143, 0x620088a8),
189 TOBN(0x8a2cc3ca, 0x4d63c0ee), TOBN(0x51233117, 0x0fe948ce),
190 TOBN(0x7463fd85, 0x222ef33b), TOBN(0xadf0c7dc, 0x7c603d6c),
191 TOBN(0x0ec32d3b, 0xfe7765e5), TOBN(0xccaab359, 0xbf380409),
192 TOBN(0xbdaa84d6, 0x8e59319c), TOBN(0xd9a4c280, 0x9c80c34d),
193 TOBN(0xa9d89488, 0xa059c142), TOBN(0x6f5ae714, 0xff0b9346),
194 TOBN(0x068f237d, 0x16fb3664), TOBN(0x5853e4c4, 0x363186ac),
195 TOBN(0xe2d87d23, 0x63c52f98), TOBN(0x2ec4a766, 0x81828876),
196 TOBN(0x47b864fa, 0xe14e7b1c), TOBN(0x0c0bc0e5, 0x69192408),
197 TOBN(0xe4d7681d, 0xb82e9f3e), TOBN(0x83200f0b, 0xdf25e13c),
198 TOBN(0x8909984c, 0x66f27280), TOBN(0x462d7b00, 0x75f73227),
199 TOBN(0xd90ba188, 0xf2651798), TOBN(0x74c6e18c, 0x36ab1c34),
200 TOBN(0xab256ea3, 0x5ef54359), TOBN(0x03466612, 0xd1aa702f),
201 TOBN(0x624d6049, 0x2ed22e91), TOBN(0x6fdfe0b5, 0x6f072822),
202 TOBN(0xeeca1115, 0x39ce2271), TOBN(0x98100a4f, 0xdb01614f),
203 TOBN(0xb6b0daa2, 0xa35c628f), TOBN(0xb6f94d2e, 0xc87e9a47),
204 TOBN(0xc6773259, 0x1d57d9ce), TOBN(0xf70bfeec, 0x03884a7b),
205 TOBN(0x5fb35ccf, 0xed2bad01), TOBN(0xa155cbe3, 0x1da6a5c7),
206 TOBN(0xc2e2594c, 0x30a92f8f), TOBN(0x649c89ce, 0x5bfafe43),
207 TOBN(0xd158667d, 0xe9ff257a), TOBN(0x9b359611, 0xf32c50ae),
208 TOBN(0x4b00b20b, 0x906014cf), TOBN(0xf3a8cfe3, 0x89bc7d3d),
209 TOBN(0x4ff23ffd, 0x248a7d06), TOBN(0x80c5bfb4, 0x878873fa),
210 TOBN(0xb7d9ad90, 0x05745981), TOBN(0x179c85db, 0x3db01994),
211 TOBN(0xba41b062, 0x61a6966c), TOBN(0x4d82d052, 0xeadce5a8),
212 TOBN(0x9e91cd3b, 0xa5e6a318), TOBN(0x47795f4f, 0x95b2dda0),
213 TOBN(0xecfd7c1f, 0xd55a897c), TOBN(0x009194ab, 0xb29110fb),
214 TOBN(0x5f0e2046, 0xe381d3b0), TOBN(0x5f3425f6, 0xa98dd291),
215 TOBN(0xbfa06687, 0x730d50da), TOBN(0x0423446c, 0x4b083b7f),
216 TOBN(0x397a247d, 0xd69d3417), TOBN(0xeb629f90, 0x387ba42a),
217 TOBN(0x1ee426cc, 0xd5cd79bf), TOBN(0x0032940b, 0x946c6e18),
218 TOBN(0x1b1e8ae0, 0x57477f58), TOBN(0xe94f7d34, 0x6d823278),
219 TOBN(0xc747cb96, 0x782ba21a), TOBN(0xc5254469, 0xf72b33a5),
220 TOBN(0x772ef6de, 0xc7f80c81), TOBN(0xd73acbfe, 0x2cd9e6b5),
221 TOBN(0x4075b5b1, 0x49ee90d9), TOBN(0x785c339a, 0xa06e9eba),
222 TOBN(0xa1030d5b, 0xabf825e0), TOBN(0xcec684c3, 0xa42931dc),
223 TOBN(0x42ab62c9, 0xc1586e63), TOBN(0x45431d66, 0x5ab43f2b),
224 TOBN(0x57c8b2c0, 0x55f7835d), TOBN(0x033da338, 0xc1b7f865),
225 TOBN(0x283c7513, 0xcaa76097), TOBN(0x0a624fa9, 0x36c83906),
226 TOBN(0x6b20afec, 0x715af2c7), TOBN(0x4b969974, 0xeba78bfd),
227 TOBN(0x220755cc, 0xd921d60e), TOBN(0x9b944e10, 0x7baeca13),
228 TOBN(0x04819d51, 0x5ded93d4), TOBN(0x9bbff86e, 0x6dddfd27),
229 TOBN(0x6b344130, 0x77adc612), TOBN(0xa7496529, 0xbbd803a0),
230 TOBN(0x1a1baaa7, 0x6d8805bd), TOBN(0xc8403902, 0x470343ad),
231 TOBN(0x39f59f66, 0x175adff1), TOBN(0x0b26d7fb, 0xb7d8c5b7),
232 TOBN(0xa875f5ce, 0x529d75e3), TOBN(0x85efc7e9, 0x41325cc2),
233 TOBN(0x21950b42, 0x1ff6acd3), TOBN(0xffe70484, 0x53dc6909),
234 TOBN(0xff4cd0b2, 0x28766127), TOBN(0xabdbe608, 0x4fb7db2b),
235 TOBN(0x837c9228, 0x5e1109e8), TOBN(0x26147d27, 0xf4645b5a),
236 TOBN(0x4d78f592, 0xf7818ed8), TOBN(0xd394077e, 0xf247fa36),
237 TOBN(0x0fb9c2d0, 0x488c171a), TOBN(0xa78bfbaa, 0x13685278),
238 TOBN(0xedfbe268, 0xd5b1fa6a), TOBN(0x0dceb8db, 0x2b7eaba7),
239 TOBN(0xbf9e8089, 0x9ae2b710), TOBN(0xefde7ae6, 0xa4449c96),
240 TOBN(0x43b7716b, 0xcc143a46), TOBN(0xd7d34194, 0xc3628c13),
241 TOBN(0x508cec1c, 0x3b3f64c9), TOBN(0xe20bc0ba, 0x1e5edf3f),
242 TOBN(0xda1deb85, 0x2f4318d4), TOBN(0xd20ebe0d, 0x5c3fa443),
243 TOBN(0x370b4ea7, 0x73241ea3), TOBN(0x61f1511c, 0x5e1a5f65),
244 TOBN(0x99a5e23d, 0x82681c62), TOBN(0xd731e383, 0xa2f54c2d),
245 TOBN(0x2692f36e, 0x83445904), TOBN(0x2e0ec469, 0xaf45f9c0),
246 TOBN(0x905a3201, 0xc67528b7), TOBN(0x88f77f34, 0xd0e5e542),
247 TOBN(0xf67a8d29, 0x5864687c), TOBN(0x23b92eae, 0x22df3562),
248 TOBN(0x5c27014b, 0x9bbec39e), TOBN(0x7ef2f226, 0x9c0f0f8d),
249 TOBN(0x97359638, 0x546c4d8d), TOBN(0x5f9c3fc4, 0x92f24679),
250 TOBN(0x912e8bed, 0xa8c8acd9), TOBN(0xec3a318d, 0x306634b0),
251 TOBN(0x80167f41, 0xc31cb264), TOBN(0x3db82f6f, 0x522113f2),
252 TOBN(0xb155bcd2, 0xdcafe197), TOBN(0xfba1da59, 0x43465283),
253 TOBN(0xa0425b8e, 0xb212cf53), TOBN(0x4f2e512e, 0xf8557c5f),
254 TOBN(0xc1286ff9, 0x25c4d56c), TOBN(0xbb8a0fea, 0xee26c851),
255 TOBN(0xc28f70d2, 0xe7d6107e), TOBN(0x7ee0c444, 0xe76265aa),
256 TOBN(0x3df277a4, 0x1d1936b1), TOBN(0x1a556e3f, 0xea9595eb),
257 TOBN(0x258bbbf9, 0xe7305683), TOBN(0x31eea5bf, 0x07ef5be6),
258 TOBN(0x0deb0e4a, 0x46c814c1), TOBN(0x5cee8449, 0xa7b730dd),
259 TOBN(0xeab495c5, 0xa0182bde), TOBN(0xee759f87, 0x9e27a6b4),
260 TOBN(0xc2cf6a68, 0x80e518ca), TOBN(0x25e8013f, 0xf14cf3f4),
261 TOBN(0x8fc44140, 0x7e8d7a14), TOBN(0xbb1ff3ca, 0x9556f36a),
262 TOBN(0x6a844385, 0x14600044), TOBN(0xba3f0c4a, 0x7451ae63),
263 TOBN(0xdfcac25b, 0x1f9af32a), TOBN(0x01e0db86, 0xb1f2214b),
264 TOBN(0x4e9a5bc2, 0xa4b596ac), TOBN(0x83927681, 0x026c2c08),
265 TOBN(0x3ec832e7, 0x7acaca28), TOBN(0x1bfeea57, 0xc7385b29),
266 TOBN(0x068212e3, 0xfd1eaf38), TOBN(0xc1329830, 0x6acf8ccc),
267 TOBN(0xb909f2db, 0x2aac9e59), TOBN(0x5748060d, 0xb661782a),
268 TOBN(0xc5ab2632, 0xc79b7a01), TOBN(0xda44c6c6, 0x00017626),
269 TOBN(0xf26c00e8, 0xa7ea82f0), TOBN(0x99cac80d, 0xe4299aaf),
270 TOBN(0xd66fe3b6, 0x7ed78be1), TOBN(0x305f725f, 0x648d02cd),
271 TOBN(0x33ed1bc4, 0x623fb21b), TOBN(0xfa70533e, 0x7a6319ad),
272 TOBN(0x17ab562d, 0xbe5ffb3e), TOBN(0x06374994, 0x56674741),
273 TOBN(0x69d44ed6, 0x5c46aa8e), TOBN(0x2100d5d3, 0xa8d063d1),
274 TOBN(0xcb9727ea, 0xa2d17c36), TOBN(0x4c2bab1b, 0x8add53b7),
275 TOBN(0xa084e90c, 0x15426704), TOBN(0x778afcd3, 0xa837ebea),
276 TOBN(0x6651f701, 0x7ce477f8), TOBN(0xa0624998, 0x46fb7a8b),
277 TOBN(0xdc1e6828, 0xed8a6e19), TOBN(0x33fc2336, 0x4189d9c7),
278 TOBN(0x026f8fe2, 0x671c39bc), TOBN(0xd40c4ccd, 0xbc6f9915),
279 TOBN(0xafa135bb, 0xf80e75ca), TOBN(0x12c651a0, 0x22adff2c),
280 TOBN(0xc40a04bd, 0x4f51ad96), TOBN(0x04820109, 0xbbe4e832),
281 TOBN(0x3667eb1a, 0x7f4c04cc), TOBN(0x59556621, 0xa9404f84),
282 TOBN(0x71cdf653, 0x7eceb50a), TOBN(0x994a44a6, 0x9b8335fa),
283 TOBN(0xd7faf819, 0xdbeb9b69), TOBN(0x473c5680, 0xeed4350d),
284 TOBN(0xb6658466, 0xda44bba2), TOBN(0x0d1bc780, 0x872bdbf3),
285 TOBN(0xe535f175, 0xa1962f91), TOBN(0x6ed7e061, 0xed58f5a7),
286 TOBN(0x177aa4c0, 0x2089a233), TOBN(0x0dbcb03a, 0xe539b413),
287 TOBN(0xe3dc424e, 0xbb32e38e), TOBN(0x6472e5ef, 0x6806701e),
288 TOBN(0xdd47ff98, 0x814be9ee), TOBN(0x6b60cfff, 0x35ace009),
289 TOBN(0xb8d3d931, 0x9ff91fe5), TOBN(0x039c4800, 0xf0518eed),
290 TOBN(0x95c37632, 0x9182cb26), TOBN(0x0763a434, 0x82fc568d),
291 TOBN(0x707c04d5, 0x383e76ba), TOBN(0xac98b930, 0x824e8197),
292 TOBN(0x92bf7c8f, 0x91230de0), TOBN(0x90876a01, 0x40959b70),
293 TOBN(0xdb6d96f3, 0x05968b80), TOBN(0x380a0913, 0x089f73b9),
294 TOBN(0x7da70b83, 0xc2c61e01), TOBN(0x95fb8394, 0x569b38c7),
295 TOBN(0x9a3c6512, 0x80edfe2f), TOBN(0x8f726bb9, 0x8faeaf82),
296 TOBN(0x8010a4a0, 0x78424bf8), TOBN(0x29672044, 0x0e844970)},
297 {TOBN(0x63c5cb81, 0x7a2ad62a), TOBN(0x7ef2b6b9, 0xac62ff54),
298 TOBN(0x3749bba4, 0xb3ad9db5), TOBN(0xad311f2c, 0x46d5a617),
299 TOBN(0xb77a8087, 0xc2ff3b6d), TOBN(0xb46feaf3, 0x367834ff),
300 TOBN(0xf8aa266d, 0x75d6b138), TOBN(0xfa38d320, 0xec008188),
301 TOBN(0x486d8ffa, 0x696946fc), TOBN(0x50fbc6d8, 0xb9cba56d),
302 TOBN(0x7e3d423e, 0x90f35a15), TOBN(0x7c3da195, 0xc0dd962c),
303 TOBN(0xe673fdb0, 0x3cfd5d8b), TOBN(0x0704b7c2, 0x889dfca5),
304 TOBN(0xf6ce581f, 0xf52305aa), TOBN(0x399d49eb, 0x914d5e53),
305 TOBN(0x380a496d, 0x6ec293cd), TOBN(0x733dbda7, 0x8e7051f5),
306 TOBN(0x037e388d, 0xb849140a), TOBN(0xee4b32b0, 0x5946dbf6),
307 TOBN(0xb1c4fda9, 0xcae368d1), TOBN(0x5001a7b0, 0xfdb0b2f3),
308 TOBN(0x6df59374, 0x2e3ac46e), TOBN(0x4af675f2, 0x39b3e656),
309 TOBN(0x44e38110, 0x39949296), TOBN(0x5b63827b, 0x361db1b5),
310 TOBN(0x3e5323ed, 0x206eaff5), TOBN(0x942370d2, 0xc21f4290),
311 TOBN(0xf2caaf2e, 0xe0d985a1), TOBN(0x192cc64b, 0x7239846d),
312 TOBN(0x7c0b8f47, 0xae6312f8), TOBN(0x7dc61f91, 0x96620108),
313 TOBN(0xb830fb5b, 0xc2da7de9), TOBN(0xd0e643df, 0x0ff8d3be),
314 TOBN(0x31ee77ba, 0x188a9641), TOBN(0x4e8aa3aa, 0xbcf6d502),
315 TOBN(0xf9fb6532, 0x9a49110f), TOBN(0xd18317f6, 0x2dd6b220),
316 TOBN(0x7e3ced41, 0x52c3ea5a), TOBN(0x0d296a14, 0x7d579c4a),
317 TOBN(0x35d6a53e, 0xed4c3717), TOBN(0x9f8240cf, 0x3d0ed2a3),
318 TOBN(0x8c0d4d05, 0xe5543aa5), TOBN(0x45d5bbfb, 0xdd33b4b4),
319 TOBN(0xfa04cc73, 0x137fd28e), TOBN(0x862ac6ef, 0xc73b3ffd),
320 TOBN(0x403ff9f5, 0x31f51ef2), TOBN(0x34d5e0fc, 0xbc73f5a2),
321 TOBN(0xf2526820, 0x08913f4f), TOBN(0xea20ed61, 0xeac93d95),
322 TOBN(0x51ed38b4, 0x6ca6b26c), TOBN(0x8662dcbc, 0xea4327b0),
323 TOBN(0x6daf295c, 0x725d2aaa), TOBN(0xbad2752f, 0x8e52dcda),
324 TOBN(0x2210e721, 0x0b17dacc), TOBN(0xa37f7912, 0xd51e8232),
325 TOBN(0x4f7081e1, 0x44cc3add), TOBN(0xd5ffa1d6, 0x87be82cf),
326 TOBN(0x89890b6c, 0x0edd6472), TOBN(0xada26e1a, 0x3ed17863),
327 TOBN(0x276f2715, 0x63483caa), TOBN(0xe6924cd9, 0x2f6077fd),
328 TOBN(0x05a7fe98, 0x0a466e3c), TOBN(0xf1c794b0, 0xb1902d1f),
329 TOBN(0xe5213688, 0x82a8042c), TOBN(0xd931cfaf, 0xcd278298),
330 TOBN(0x069a0ae0, 0xf597a740), TOBN(0x0adbb3f3, 0xeb59107c),
331 TOBN(0x983e951e, 0x5eaa8eb8), TOBN(0xe663a8b5, 0x11b48e78),
332 TOBN(0x1631cc0d, 0x8a03f2c5), TOBN(0x7577c11e, 0x11e271e2),
333 TOBN(0x33b2385c, 0x08369a90), TOBN(0x2990c59b, 0x190eb4f8),
334 TOBN(0x819a6145, 0xc68eac80), TOBN(0x7a786d62, 0x2ec4a014),
335 TOBN(0x33faadbe, 0x20ac3a8d), TOBN(0x31a21781, 0x5aba2d30),
336 TOBN(0x209d2742, 0xdba4f565), TOBN(0xdb2ce9e3, 0x55aa0fbb),
337 TOBN(0x8cef334b, 0x168984df), TOBN(0xe81dce17, 0x33879638),
338 TOBN(0xf6e6949c, 0x263720f0), TOBN(0x5c56feaf, 0xf593cbec),
339 TOBN(0x8bff5601, 0xfde58c84), TOBN(0x74e24117, 0x2eccb314),
340 TOBN(0xbcf01b61, 0x4c9a8a78), TOBN(0xa233e35e, 0x544c9868),
341 TOBN(0xb3156bf3, 0x8bd7aff1), TOBN(0x1b5ee4cb, 0x1d81b146),
342 TOBN(0x7ba1ac41, 0xd628a915), TOBN(0x8f3a8f9c, 0xfd89699e),
343 TOBN(0x7329b9c9, 0xa0748be7), TOBN(0x1d391c95, 0xa92e621f),
344 TOBN(0xe51e6b21, 0x4d10a837), TOBN(0xd255f53a, 0x4947b435),
345 TOBN(0x07669e04, 0xf1788ee3), TOBN(0xc14f27af, 0xa86938a2),
346 TOBN(0x8b47a334, 0xe93a01c0), TOBN(0xff627438, 0xd9366808),
347 TOBN(0x7a0985d8, 0xca2a5965), TOBN(0x3d9a5542, 0xd6e9b9b3),
348 TOBN(0xc23eb80b, 0x4cf972e8), TOBN(0x5c1c33bb, 0x4fdf72fd),
349 TOBN(0x0c4a58d4, 0x74a86108), TOBN(0xf8048a8f, 0xee4c5d90),
350 TOBN(0xe3c7c924, 0xe86d4c80), TOBN(0x28c889de, 0x056a1e60),
351 TOBN(0x57e2662e, 0xb214a040), TOBN(0xe8c48e98, 0x37e10347),
352 TOBN(0x87742862, 0x80ac748a), TOBN(0xf1c24022, 0x186b06f2),
353 TOBN(0xac2dd4c3, 0x5f74040a), TOBN(0x409aeb71, 0xfceac957),
354 TOBN(0x4fbad782, 0x55c4ec23), TOBN(0xb359ed61, 0x8a7b76ec),
355 TOBN(0x12744926, 0xed6f4a60), TOBN(0xe21e8d7f, 0x4b912de3),
356 TOBN(0xe2575a59, 0xfc705a59), TOBN(0x72f1d4de, 0xed2dbc0e),
357 TOBN(0x3d2b24b9, 0xeb7926b8), TOBN(0xbff88cb3, 0xcdbe5509),
358 TOBN(0xd0f399af, 0xe4dd640b), TOBN(0x3c5fe130, 0x2f76ed45),
359 TOBN(0x6f3562f4, 0x3764fb3d), TOBN(0x7b5af318, 0x3151b62d),
360 TOBN(0xd5bd0bc7, 0xd79ce5f3), TOBN(0xfdaf6b20, 0xec66890f),
361 TOBN(0x735c67ec, 0x6063540c), TOBN(0x50b259c2, 0xe5f9cb8f),
362 TOBN(0xb8734f9a, 0x3f99c6ab), TOBN(0xf8cc13d5, 0xa3a7bc85),
363 TOBN(0x80c1b305, 0xc5217659), TOBN(0xfe5364d4, 0x4ec12a54),
364 TOBN(0xbd87045e, 0x681345fe), TOBN(0x7f8efeb1, 0x582f897f),
365 TOBN(0xe8cbf1e5, 0xd5923359), TOBN(0xdb0cea9d, 0x539b9fb0),
366 TOBN(0x0c5b34cf, 0x49859b98), TOBN(0x5e583c56, 0xa4403cc6),
367 TOBN(0x11fc1a2d, 0xd48185b7), TOBN(0xc93fbc7e, 0x6e521787),
368 TOBN(0x47e7a058, 0x05105b8b), TOBN(0x7b4d4d58, 0xdb8260c8),
369 TOBN(0xe33930b0, 0x46eb842a), TOBN(0x8e844a9a, 0x7bdae56d),
370 TOBN(0x34ef3a9e, 0x13f7fdfc), TOBN(0xb3768f82, 0x636ca176),
371 TOBN(0x2821f4e0, 0x4e09e61c), TOBN(0x414dc3a1, 0xa0c7cddc),
372 TOBN(0xd5379437, 0x54945fcd), TOBN(0x151b6eef, 0xb3555ff1),
373 TOBN(0xb31bd613, 0x6339c083), TOBN(0x39ff8155, 0xdfb64701),
374 TOBN(0x7c3388d2, 0xe29604ab), TOBN(0x1e19084b, 0xa6b10442),
375 TOBN(0x17cf54c0, 0xeccd47ef), TOBN(0x89693385, 0x4a5dfb30),
376 TOBN(0x69d023fb, 0x47daf9f6), TOBN(0x9222840b, 0x7d91d959),
377 TOBN(0x439108f5, 0x803bac62), TOBN(0x0b7dd91d, 0x379bd45f),
378 TOBN(0xd651e827, 0xca63c581), TOBN(0x5c5d75f6, 0x509c104f),
379 TOBN(0x7d5fc738, 0x1f2dc308), TOBN(0x20faa7bf, 0xd98454be),
380 TOBN(0x95374bee, 0xa517b031), TOBN(0xf036b9b1, 0x642692ac),
381 TOBN(0xc5106109, 0x39842194), TOBN(0xb7e2353e, 0x49d05295),
382 TOBN(0xfc8c1d5c, 0xefb42ee0), TOBN(0xe04884eb, 0x08ce811c),
383 TOBN(0xf1f75d81, 0x7419f40e), TOBN(0x5b0ac162, 0xa995c241),
384 TOBN(0x120921bb, 0xc4c55646), TOBN(0x713520c2, 0x8d33cf97),
385 TOBN(0xb4a65a5c, 0xe98c5100), TOBN(0x6cec871d, 0x2ddd0f5a),
386 TOBN(0x251f0b7f, 0x9ba2e78b), TOBN(0x224a8434, 0xce3a2a5f),
387 TOBN(0x26827f61, 0x25f5c46f), TOBN(0x6a22bedc, 0x48545ec0),
388 TOBN(0x25ae5fa0, 0xb1bb5cdc), TOBN(0xd693682f, 0xfcb9b98f),
389 TOBN(0x32027fe8, 0x91e5d7d3), TOBN(0xf14b7d17, 0x73a07678),
390 TOBN(0xf88497b3, 0xc0dfdd61), TOBN(0xf7c2eec0, 0x2a8c4f48),
391 TOBN(0xaa5573f4, 0x3756e621), TOBN(0xc013a240, 0x1825b948),
392 TOBN(0x1c03b345, 0x63878572), TOBN(0xa0472bea, 0x653a4184),
393 TOBN(0xf4222e27, 0x0ac69a80), TOBN(0x34096d25, 0xf51e54f6),
394 TOBN(0x00a648cb, 0x8fffa591), TOBN(0x4e87acdc, 0x69b6527f),
395 TOBN(0x0575e037, 0xe285ccb4), TOBN(0x188089e4, 0x50ddcf52),
396 TOBN(0xaa96c9a8, 0x870ff719), TOBN(0x74a56cd8, 0x1fc7e369),
397 TOBN(0x41d04ee2, 0x1726931a), TOBN(0x0bbbb2c8, 0x3660ecfd),
398 TOBN(0xa6ef6de5, 0x24818e18), TOBN(0xe421cc51, 0xe7d57887),
399 TOBN(0xf127d208, 0xbea87be6), TOBN(0x16a475d3, 0xb1cdd682),
400 TOBN(0x9db1b684, 0x439b63f7), TOBN(0x5359b3db, 0xf0f113b6),
401 TOBN(0xdfccf1de, 0x8bf06e31), TOBN(0x1fdf8f44, 0xdd383901),
402 TOBN(0x10775cad, 0x5017e7d2), TOBN(0xdfc3a597, 0x58d11eef),
403 TOBN(0x6ec9c8a0, 0xb1ecff10), TOBN(0xee6ed6cc, 0x28400549),
404 TOBN(0xb5ad7bae, 0x1b4f8d73), TOBN(0x61b4f11d, 0xe00aaab9),
405 TOBN(0x7b32d69b, 0xd4eff2d7), TOBN(0x88ae6771, 0x4288b60f),
406 TOBN(0x159461b4, 0x37a1e723), TOBN(0x1f3d4789, 0x570aae8c),
407 TOBN(0x869118c0, 0x7f9871da), TOBN(0x35fbda78, 0xf635e278),
408 TOBN(0x738f3641, 0xe1541dac), TOBN(0x6794b13a, 0xc0dae45f),
409 TOBN(0x065064ac, 0x09cc0917), TOBN(0x27c53729, 0xc68540fd),
410 TOBN(0x0d2d4c8e, 0xef227671), TOBN(0xd23a9f80, 0xa1785a04),
411 TOBN(0x98c59528, 0x52650359), TOBN(0xfa09ad01, 0x74a1acad),
412 TOBN(0x082d5a29, 0x0b55bf5c), TOBN(0xa40f1c67, 0x419b8084),
413 TOBN(0x3a5c752e, 0xdcc18770), TOBN(0x4baf1f2f, 0x8825c3a5),
414 TOBN(0xebd63f74, 0x21b153ed), TOBN(0xa2383e47, 0xb2f64723),
415 TOBN(0xe7bf620a, 0x2646d19a), TOBN(0x56cb44ec, 0x03c83ffd),
416 TOBN(0xaf7267c9, 0x4f6be9f1), TOBN(0x8b2dfd7b, 0xc06bb5e9),
417 TOBN(0xb87072f2, 0xa672c5c7), TOBN(0xeacb11c8, 0x0d53c5e2),
418 TOBN(0x22dac29d, 0xff435932), TOBN(0x37bdb99d, 0x4408693c),
419 TOBN(0xf6e62fb6, 0x2899c20f), TOBN(0x3535d512, 0x447ece24),
420 TOBN(0xfbdc6b88, 0xff577ce3), TOBN(0x726693bd, 0x190575f2),
421 TOBN(0x6772b0e5, 0xab4b35a2), TOBN(0x1d8b6001, 0xf5eeaacf),
422 TOBN(0x728f7ce4, 0x795b9580), TOBN(0x4a20ed2a, 0x41fb81da),
423 TOBN(0x9f685cd4, 0x4fec01e6), TOBN(0x3ed7ddcc, 0xa7ff50ad),
424 TOBN(0x460fd264, 0x0c2d97fd), TOBN(0x3a241426, 0xeb82f4f9),
425 TOBN(0x17d1df2c, 0x6a8ea820), TOBN(0xb2b50d3b, 0xf22cc254),
426 TOBN(0x03856cba, 0xb7291426), TOBN(0x87fd26ae, 0x04f5ee39),
427 TOBN(0x9cb696cc, 0x02bee4ba), TOBN(0x53121804, 0x06820fd6),
428 TOBN(0xa5dfc269, 0x0212e985), TOBN(0x666f7ffa, 0x160f9a09),
429 TOBN(0xc503cd33, 0xbccd9617), TOBN(0x365dede4, 0xba7730a3),
430 TOBN(0x798c6355, 0x5ddb0786), TOBN(0xa6c3200e, 0xfc9cd3bc),
431 TOBN(0x060ffb2c, 0xe5e35efd), TOBN(0x99a4e25b, 0x5555a1c1),
432 TOBN(0x11d95375, 0xf70b3751), TOBN(0x0a57354a, 0x160e1bf6),
433 TOBN(0xecb3ae4b, 0xf8e4b065), TOBN(0x07a834c4, 0x2e53022b),
434 TOBN(0x1cd300b3, 0x8692ed96), TOBN(0x16a6f792, 0x61ee14ec),
435 TOBN(0x8f1063c6, 0x6a8649ed), TOBN(0xfbcdfcfe, 0x869f3e14),
436 TOBN(0x2cfb97c1, 0x00a7b3ec), TOBN(0xcea49b3c, 0x7130c2f1),
437 TOBN(0x462d044f, 0xe9d96488), TOBN(0x4b53d52e, 0x8182a0c1),
438 TOBN(0x84b6ddd3, 0x0391e9e9), TOBN(0x80ab7b48, 0xb1741a09),
439 TOBN(0xec0e15d4, 0x27d3317f), TOBN(0x8dfc1ddb, 0x1a64671e),
440 TOBN(0x93cc5d5f, 0xd49c5b92), TOBN(0xc995d53d, 0x3674a331),
441 TOBN(0x302e41ec, 0x090090ae), TOBN(0x2278a0cc, 0xedb06830),
442 TOBN(0x1d025932, 0xfbc99690), TOBN(0x0c32fbd2, 0xb80d68da),
443 TOBN(0xd79146da, 0xf341a6c1), TOBN(0xae0ba139, 0x1bef68a0),
444 TOBN(0xc6b8a563, 0x8d774b3a), TOBN(0x1cf307bd, 0x880ba4d7),
445 TOBN(0xc033bdc7, 0x19803511), TOBN(0xa9f97b3b, 0x8888c3be),
446 TOBN(0x3d68aebc, 0x85c6d05e), TOBN(0xc3b88a9d, 0x193919eb),
447 TOBN(0x2d300748, 0xc48b0ee3), TOBN(0x7506bc7c, 0x07a746c1),
448 TOBN(0xfc48437c, 0x6e6d57f3), TOBN(0x5bd71587, 0xcfeaa91a),
449 TOBN(0xa4ed0408, 0xc1bc5225), TOBN(0xd0b946db, 0x2719226d),
450 TOBN(0x109ecd62, 0x758d2d43), TOBN(0x75c8485a, 0x2751759b),
451 TOBN(0xb0b75f49, 0x9ce4177a), TOBN(0x4fa61a1e, 0x79c10c3d),
452 TOBN(0xc062d300, 0xa167fcd7), TOBN(0x4df3874c, 0x750f0fa8),
453 TOBN(0x29ae2cf9, 0x83dfedc9), TOBN(0xf8437134, 0x8d87631a),
454 TOBN(0xaf571711, 0x7429c8d2), TOBN(0x18d15867, 0x146d9272),
455 TOBN(0x83053ecf, 0x69769bb7), TOBN(0xc55eb856, 0xc479ab82),
456 TOBN(0x5ef7791c, 0x21b0f4b2), TOBN(0xaa5956ba, 0x3d491525),
457 TOBN(0x407a96c2, 0x9fe20eba), TOBN(0xf27168bb, 0xe52a5ad3),
458 TOBN(0x43b60ab3, 0xbf1d9d89), TOBN(0xe45c51ef, 0x710e727a),
459 TOBN(0xdfca5276, 0x099b4221), TOBN(0x8dc6407c, 0x2557a159),
460 TOBN(0x0ead8335, 0x91035895), TOBN(0x0a9db957, 0x9c55dc32),
461 TOBN(0xe40736d3, 0xdf61bc76), TOBN(0x13a619c0, 0x3f778cdb),
462 TOBN(0x6dd921a4, 0xc56ea28f), TOBN(0x76a52433, 0x2fa647b4),
463 TOBN(0x23591891, 0xac5bdc5d), TOBN(0xff4a1a72, 0xbac7dc01),
464 TOBN(0x9905e261, 0x62df8453), TOBN(0x3ac045df, 0xe63b265f),
465 TOBN(0x8a3f341b, 0xad53dba7), TOBN(0x8ec269cc, 0x837b625a),
466 TOBN(0xd71a2782, 0x3ae31189), TOBN(0x8fb4f9a3, 0x55e96120),
467 TOBN(0x804af823, 0xff9875cf), TOBN(0x23224f57, 0x5d442a9b),
468 TOBN(0x1c4d3b9e, 0xecc62679), TOBN(0x91da22fb, 0xa0e7ddb1),
469 TOBN(0xa370324d, 0x6c04a661), TOBN(0x9710d3b6, 0x5e376d17),
470 TOBN(0xed8c98f0, 0x3044e357), TOBN(0xc364ebbe, 0x6422701c),
471 TOBN(0x347f5d51, 0x7733d61c), TOBN(0xd55644b9, 0xcea826c3),
472 TOBN(0x80c6e0ad, 0x55a25548), TOBN(0x0aa7641d, 0x844220a7),
473 TOBN(0x1438ec81, 0x31810660), TOBN(0x9dfa6507, 0xde4b4043),
474 TOBN(0x10b515d8, 0xcc3e0273), TOBN(0x1b6066dd, 0x28d8cfb2),
475 TOBN(0xd3b04591, 0x9c9efebd), TOBN(0x425d4bdf, 0xa21c1ff4),
476 TOBN(0x5fe5af19, 0xd57607d3), TOBN(0xbbf773f7, 0x54481084),
477 TOBN(0x8435bd69, 0x94b03ed1), TOBN(0xd9ad1de3, 0x634cc546),
478 TOBN(0x2cf423fc, 0x00e420ca), TOBN(0xeed26d80, 0xa03096dd),
479 TOBN(0xd7f60be7, 0xa4db09d2), TOBN(0xf47f569d, 0x960622f7),
480 TOBN(0xe5925fd7, 0x7296c729), TOBN(0xeff2db26, 0x26ca2715),
481 TOBN(0xa6fcd014, 0xb913e759), TOBN(0x53da4786, 0x8ff4de93),
482 TOBN(0x14616d79, 0xc32068e1), TOBN(0xb187d664, 0xccdf352e),
483 TOBN(0xf7afb650, 0x1dc90b59), TOBN(0x8170e943, 0x7daa1b26),
484 TOBN(0xc8e3bdd8, 0x700c0a84), TOBN(0x6e8d345f, 0x6482bdfa),
485 TOBN(0x84cfbfa1, 0xc5c5ea50), TOBN(0xd3baf14c, 0x67960681),
486 TOBN(0x26398403, 0x0dd50942), TOBN(0xe4b7839c, 0x4716a663),
487 TOBN(0xd5f1f794, 0xe7de6dc0), TOBN(0x5cd0f4d4, 0x622aa7ce),
488 TOBN(0x5295f3f1, 0x59acfeec), TOBN(0x8d933552, 0x953e0607),
489 TOBN(0xc7db8ec5, 0x776c5722), TOBN(0xdc467e62, 0x2b5f290c),
490 TOBN(0xd4297e70, 0x4ff425a9), TOBN(0x4be924c1, 0x0cf7bb72),
491 TOBN(0x0d5dc5ae, 0xa1892131), TOBN(0x8bf8a8e3, 0xa705c992),
492 TOBN(0x73a0b064, 0x7a305ac5), TOBN(0x00c9ca4e, 0x9a8c77a8),
493 TOBN(0x5dfee80f, 0x83774bdd), TOBN(0x63131602, 0x85734485),
494 TOBN(0xa1b524ae, 0x914a69a9), TOBN(0xebc2ffaf, 0xd4e300d7),
495 TOBN(0x52c93db7, 0x7cfa46a5), TOBN(0x71e6161f, 0x21653b50),
496 TOBN(0x3574fc57, 0xa4bc580a), TOBN(0xc09015dd, 0xe1bc1253),
497 TOBN(0x4b7b47b2, 0xd174d7aa), TOBN(0x4072d8e8, 0xf3a15d04),
498 TOBN(0xeeb7d47f, 0xd6fa07ed), TOBN(0x6f2b9ff9, 0xedbdafb1),
499 TOBN(0x18c51615, 0x3760fe8a), TOBN(0x7a96e6bf, 0xf06c6c13),
500 TOBN(0x4d7a0410, 0x0ea2d071), TOBN(0xa1914e9b, 0x0be2a5ce),
501 TOBN(0x5726e357, 0xd8a3c5cf), TOBN(0x1197ecc3, 0x2abb2b13),
502 TOBN(0x6c0d7f7f, 0x31ae88dd), TOBN(0x15b20d1a, 0xfdbb3efe),
503 TOBN(0xcd06aa26, 0x70584039), TOBN(0x2277c969, 0xa7dc9747),
504 TOBN(0xbca69587, 0x7855d815), TOBN(0x899ea238, 0x5188b32a),
505 TOBN(0x37d9228b, 0x760c1c9d), TOBN(0xc7efbb11, 0x9b5c18da),
506 TOBN(0x7f0d1bc8, 0x19f6dbc5), TOBN(0x4875384b, 0x07e6905b),
507 TOBN(0xc7c50baa, 0x3ba8cd86), TOBN(0xb0ce40fb, 0xc2905de0),
508 TOBN(0x70840673, 0x7a231952), TOBN(0xa912a262, 0xcf43de26),
509 TOBN(0x9c38ddcc, 0xeb5b76c1), TOBN(0x746f5285, 0x26fc0ab4),
510 TOBN(0x52a63a50, 0xd62c269f), TOBN(0x60049c55, 0x99458621),
511 TOBN(0xe7f48f82, 0x3c2f7c9e), TOBN(0x6bd99043, 0x917d5cf3),
512 TOBN(0xeb1317a8, 0x8701f469), TOBN(0xbd3fe2ed, 0x9a449fe0),
513 TOBN(0x421e79ca, 0x12ef3d36), TOBN(0x9ee3c36c, 0x3e7ea5de),
514 TOBN(0xe48198b5, 0xcdff36f7), TOBN(0xaff4f967, 0xc6b82228),
515 TOBN(0x15e19dd0, 0xc47adb7e), TOBN(0x45699b23, 0x032e7dfa),
516 TOBN(0x40680c8b, 0x1fae026a), TOBN(0x5a347a48, 0x550dbf4d),
517 TOBN(0xe652533b, 0x3cef0d7d), TOBN(0xd94f7b18, 0x2bbb4381),
518 TOBN(0x838752be, 0x0e80f500), TOBN(0x8e6e2488, 0x9e9c9bfb),
519 TOBN(0xc9751697, 0x16caca6a), TOBN(0x866c49d8, 0x38531ad9),
520 TOBN(0xc917e239, 0x7151ade1), TOBN(0x2d016ec1, 0x6037c407),
521 TOBN(0xa407ccc9, 0x00eac3f9), TOBN(0x835f6280, 0xe2ed4748),
522 TOBN(0xcc54c347, 0x1cc98e0d), TOBN(0x0e969937, 0xdcb572eb),
523 TOBN(0x1b16c8e8, 0x8f30c9cb), TOBN(0xa606ae75, 0x373c4661),
524 TOBN(0x47aa689b, 0x35502cab), TOBN(0xf89014ae, 0x4d9bb64f),
525 TOBN(0x202f6a9c, 0x31c71f7b), TOBN(0x01f95aa3, 0x296ffe5c),
526 TOBN(0x5fc06014, 0x53cec3a3), TOBN(0xeb991237, 0x5f498a45),
527 TOBN(0xae9a935e, 0x5d91ba87), TOBN(0xc6ac6281, 0x0b564a19),
528 TOBN(0x8a8fe81c, 0x3bd44e69), TOBN(0x7c8b467f, 0x9dd11d45),
529 TOBN(0xf772251f, 0xea5b8e69), TOBN(0xaeecb3bd, 0xc5b75fbc),
530 TOBN(0x1aca3331, 0x887ff0e5), TOBN(0xbe5d49ff, 0x19f0a131),
531 TOBN(0x582c13aa, 0xe5c8646f), TOBN(0xdbaa12e8, 0x20e19980),
532 TOBN(0x8f40f31a, 0xf7abbd94), TOBN(0x1f13f5a8, 0x1dfc7663),
533 TOBN(0x5d81f1ee, 0xaceb4fc0), TOBN(0x36256002, 0x5e6f0f42),
534 TOBN(0x4b67d6d7, 0x751370c8), TOBN(0x2608b698, 0x03e80589),
535 TOBN(0xcfc0d2fc, 0x05268301), TOBN(0xa6943d39, 0x40309212),
536 TOBN(0x192a90c2, 0x1fd0e1c2), TOBN(0xb209f113, 0x37f1dc76),
537 TOBN(0xefcc5e06, 0x97bf1298), TOBN(0xcbdb6730, 0x219d639e),
538 TOBN(0xd009c116, 0xb81e8c6f), TOBN(0xa3ffdde3, 0x1a7ce2e5),
539 TOBN(0xc53fbaaa, 0xa914d3ba), TOBN(0x836d500f, 0x88df85ee),
540 TOBN(0xd98dc71b, 0x66ee0751), TOBN(0x5a3d7005, 0x714516fd),
541 TOBN(0x21d3634d, 0x39eedbba), TOBN(0x35cd2e68, 0x0455a46d),
542 TOBN(0xc8cafe65, 0xf9d7eb0c), TOBN(0xbda3ce9e, 0x00cefb3e),
543 TOBN(0xddc17a60, 0x2c9cf7a4), TOBN(0x01572ee4, 0x7bcb8773),
544 TOBN(0xa92b2b01, 0x8c7548df), TOBN(0x732fd309, 0xa84600e3),
545 TOBN(0xe22109c7, 0x16543a40), TOBN(0x9acafd36, 0xfede3c6c),
546 TOBN(0xfb206852, 0x6824e614), TOBN(0x2a4544a9, 0xda25dca0),
547 TOBN(0x25985262, 0x91d60b06), TOBN(0x281b7be9, 0x28753545),
548 TOBN(0xec667b1a, 0x90f13b27), TOBN(0x33a83aff, 0x940e2eb4),
549 TOBN(0x80009862, 0xd5d721d5), TOBN(0x0c3357a3, 0x5bd3a182),
550 TOBN(0x27f3a83b, 0x7aa2cda4), TOBN(0xb58ae74e, 0xf6f83085),
551 TOBN(0x2a911a81, 0x2e6dad6b), TOBN(0xde286051, 0xf43d6c5b),
552 TOBN(0x4bdccc41, 0xf996c4d8), TOBN(0xe7312ec0, 0x0ae1e24e)},
553 {TOBN(0xf8d112e7, 0x6e6485b3), TOBN(0x4d3e24db, 0x771c52f8),
554 TOBN(0x48e3ee41, 0x684a2f6d), TOBN(0x7161957d, 0x21d95551),
555 TOBN(0x19631283, 0xcdb12a6c), TOBN(0xbf3fa882, 0x2e50e164),
556 TOBN(0xf6254b63, 0x3166cc73), TOBN(0x3aefa7ae, 0xaee8cc38),
557 TOBN(0x79b0fe62, 0x3b36f9fd), TOBN(0x26543b23, 0xfde19fc0),
558 TOBN(0x136e64a0, 0x958482ef), TOBN(0x23f63771, 0x9b095825),
559 TOBN(0x14cfd596, 0xb6a1142e), TOBN(0x5ea6aac6, 0x335aac0b),
560 TOBN(0x86a0e8bd, 0xf3081dd5), TOBN(0x5fb89d79, 0x003dc12a),
561 TOBN(0xf615c33a, 0xf72e34d4), TOBN(0x0bd9ea40, 0x110eec35),
562 TOBN(0x1c12bc5b, 0xc1dea34e), TOBN(0x686584c9, 0x49ae4699),
563 TOBN(0x13ad95d3, 0x8c97b942), TOBN(0x4609561a, 0x4e5c7562),
564 TOBN(0x9e94a4ae, 0xf2737f89), TOBN(0xf57594c6, 0x371c78b6),
565 TOBN(0x0f0165fc, 0xe3779ee3), TOBN(0xe00e7f9d, 0xbd495d9e),
566 TOBN(0x1fa4efa2, 0x20284e7a), TOBN(0x4564bade, 0x47ac6219),
567 TOBN(0x90e6312a, 0xc4708e8e), TOBN(0x4f5725fb, 0xa71e9adf),
568 TOBN(0xe95f55ae, 0x3d684b9f), TOBN(0x47f7ccb1, 0x1e94b415),
569 TOBN(0x7322851b, 0x8d946581), TOBN(0xf0d13133, 0xbdf4a012),
570 TOBN(0xa3510f69, 0x6584dae0), TOBN(0x03a7c171, 0x3c9f6c6d),
571 TOBN(0x5be97f38, 0xe475381a), TOBN(0xca1ba422, 0x85823334),
572 TOBN(0xf83cc5c7, 0x0be17dda), TOBN(0x158b1494, 0x0b918c0f),
573 TOBN(0xda3a77e5, 0x522e6b69), TOBN(0x69c908c3, 0xbbcd6c18),
574 TOBN(0x1f1b9e48, 0xd924fd56), TOBN(0x37c64e36, 0xaa4bb3f7),
575 TOBN(0x5a4fdbdf, 0xee478d7d), TOBN(0xba75c8bc, 0x0193f7a0),
576 TOBN(0x84bc1e84, 0x56cd16df), TOBN(0x1fb08f08, 0x46fad151),
577 TOBN(0x8a7cabf9, 0x842e9f30), TOBN(0xa331d4bf, 0x5eab83af),
578 TOBN(0xd272cfba, 0x017f2a6a), TOBN(0x27560abc, 0x83aba0e3),
579 TOBN(0x94b83387, 0x0e3a6b75), TOBN(0x25c6aea2, 0x6b9f50f5),
580 TOBN(0x803d691d, 0xb5fdf6d0), TOBN(0x03b77509, 0xe6333514),
581 TOBN(0x36178903, 0x61a341c1), TOBN(0x3604dc60, 0x0cfd6142),
582 TOBN(0x022295eb, 0x8533316c), TOBN(0x3dbde4ac, 0x44af2922),
583 TOBN(0x898afc5d, 0x1c7eef69), TOBN(0x58896805, 0xd14f4fa1),
584 TOBN(0x05002160, 0x203c21ca), TOBN(0x6f0d1f30, 0x40ef730b),
585 TOBN(0x8e8c44d4, 0x196224f8), TOBN(0x75a4ab95, 0x374d079d),
586 TOBN(0x79085ecc, 0x7d48f123), TOBN(0x56f04d31, 0x1bf65ad8),
587 TOBN(0xe220bf1c, 0xbda602b2), TOBN(0x73ee1742, 0xf9612c69),
588 TOBN(0x76008fc8, 0x084fd06b), TOBN(0x4000ef9f, 0xf11380d1),
589 TOBN(0x48201b4b, 0x12cfe297), TOBN(0x3eee129c, 0x292f74e5),
590 TOBN(0xe1fe114e, 0xc9e874e8), TOBN(0x899b055c, 0x92c5fc41),
591 TOBN(0x4e477a64, 0x3a39c8cf), TOBN(0x82f09efe, 0x78963cc9),
592 TOBN(0x6fd3fd8f, 0xd333f863), TOBN(0x85132b2a, 0xdc949c63),
593 TOBN(0x7e06a3ab, 0x516eb17b), TOBN(0x73bec06f, 0xd2c7372b),
594 TOBN(0xe4f74f55, 0xba896da6), TOBN(0xbb4afef8, 0x8e9eb40f),
595 TOBN(0x2d75bec8, 0xe61d66b0), TOBN(0x02bda4b4, 0xef29300b),
596 TOBN(0x8bbaa8de, 0x026baa5a), TOBN(0xff54befd, 0xa07f4440),
597 TOBN(0xbd9b8b1d, 0xbe7a2af3), TOBN(0xec51caa9, 0x4fb74a72),
598 TOBN(0xb9937a4b, 0x63879697), TOBN(0x7c9a9d20, 0xec2687d5),
599 TOBN(0x1773e44f, 0x6ef5f014), TOBN(0x8abcf412, 0xe90c6900),
600 TOBN(0x387bd022, 0x8142161e), TOBN(0x50393755, 0xfcb6ff2a),
601 TOBN(0x9813fd56, 0xed6def63), TOBN(0x53cf6482, 0x7d53106c),
602 TOBN(0x991a35bd, 0x431f7ac1), TOBN(0xf1e274dd, 0x63e65faf),
603 TOBN(0xf63ffa3c, 0x44cc7880), TOBN(0x411a426b, 0x7c256981),
604 TOBN(0xb698b9fd, 0x93a420e0), TOBN(0x89fdddc0, 0xae53f8fe),
605 TOBN(0x766e0722, 0x32398baa), TOBN(0x205fee42, 0x5cfca031),
606 TOBN(0xa49f5341, 0x7a029cf2), TOBN(0xa88c68b8, 0x4023890d),
607 TOBN(0xbc275041, 0x7337aaa8), TOBN(0x9ed364ad, 0x0eb384f4),
608 TOBN(0xe0816f85, 0x29aba92f), TOBN(0x2e9e1941, 0x04e38a88),
609 TOBN(0x57eef44a, 0x3dafd2d5), TOBN(0x35d1fae5, 0x97ed98d8),
610 TOBN(0x50628c09, 0x2307f9b1), TOBN(0x09d84aae, 0xd6cba5c6),
611 TOBN(0x67071bc7, 0x88aaa691), TOBN(0x2dea57a9, 0xafe6cb03),
612 TOBN(0xdfe11bb4, 0x3d78ac01), TOBN(0x7286418c, 0x7fd7aa51),
613 TOBN(0xfabf7709, 0x77f7195a), TOBN(0x8ec86167, 0xadeb838f),
614 TOBN(0xea1285a8, 0xbb4f012d), TOBN(0xd6883503, 0x9a3eab3f),
615 TOBN(0xee5d24f8, 0x309004c2), TOBN(0xa96e4b76, 0x13ffe95e),
616 TOBN(0x0cdffe12, 0xbd223ea4), TOBN(0x8f5c2ee5, 0xb6739a53),
617 TOBN(0x5cb4aaa5, 0xdd968198), TOBN(0xfa131c52, 0x72413a6c),
618 TOBN(0x53d46a90, 0x9536d903), TOBN(0xb270f0d3, 0x48606d8e),
619 TOBN(0x518c7564, 0xa053a3bc), TOBN(0x088254b7, 0x1a86caef),
620 TOBN(0xb3ba8cb4, 0x0ab5efd0), TOBN(0x5c59900e, 0x4605945d),
621 TOBN(0xecace1dd, 0xa1887395), TOBN(0x40960f36, 0x932a65de),
622 TOBN(0x9611ff5c, 0x3aa95529), TOBN(0xc58215b0, 0x7c1e5a36),
623 TOBN(0xd48c9b58, 0xf0e1a524), TOBN(0xb406856b, 0xf590dfb8),
624 TOBN(0xc7605e04, 0x9cd95662), TOBN(0x0dd036ee, 0xa33ecf82),
625 TOBN(0xa50171ac, 0xc33156b3), TOBN(0xf09d24ea, 0x4a80172e),
626 TOBN(0x4e1f72c6, 0x76dc8eef), TOBN(0xe60caadc, 0x5e3d44ee),
627 TOBN(0x006ef8a6, 0x979b1d8f), TOBN(0x60908a1c, 0x97788d26),
628 TOBN(0x6e08f95b, 0x266feec0), TOBN(0x618427c2, 0x22e8c94e),
629 TOBN(0x3d613339, 0x59145a65), TOBN(0xcd9bc368, 0xfa406337),
630 TOBN(0x82d11be3, 0x2d8a52a0), TOBN(0xf6877b27, 0x97a1c590),
631 TOBN(0x837a819b, 0xf5cbdb25), TOBN(0x2a4fd1d8, 0xde090249),
632 TOBN(0x622a7de7, 0x74990e5f), TOBN(0x840fa5a0, 0x7945511b),
633 TOBN(0x30b974be, 0x6558842d), TOBN(0x70df8c64, 0x17f3d0a6),
634 TOBN(0x7c803520, 0x7542e46d), TOBN(0x7251fe7f, 0xe4ecc823),
635 TOBN(0xe59134cb, 0x5e9aac9a), TOBN(0x11bb0934, 0xf0045d71),
636 TOBN(0x53e5d9b5, 0xdbcb1d4e), TOBN(0x8d97a905, 0x92defc91),
637 TOBN(0xfe289327, 0x7946d3f9), TOBN(0xe132bd24, 0x07472273),
638 TOBN(0xeeeb510c, 0x1eb6ae86), TOBN(0x777708c5, 0xf0595067),
639 TOBN(0x18e2c8cd, 0x1297029e), TOBN(0x2c61095c, 0xbbf9305e),
640 TOBN(0xe466c258, 0x6b85d6d9), TOBN(0x8ac06c36, 0xda1ea530),
641 TOBN(0xa365dc39, 0xa1304668), TOBN(0xe4a9c885, 0x07f89606),
642 TOBN(0x65a4898f, 0xacc7228d), TOBN(0x3e2347ff, 0x84ca8303),
643 TOBN(0xa5f6fb77, 0xea7d23a3), TOBN(0x2fac257d, 0x672a71cd),
644 TOBN(0x6908bef8, 0x7e6a44d3), TOBN(0x8ff87566, 0x891d3d7a),
645 TOBN(0xe58e90b3, 0x6b0cf82e), TOBN(0x6438d246, 0x2615b5e7),
646 TOBN(0x07b1f8fc, 0x669c145a), TOBN(0xb0d8b2da, 0x36f1e1cb),
647 TOBN(0x54d5dadb, 0xd9184c4d), TOBN(0x3dbb18d5, 0xf93d9976),
648 TOBN(0x0a3e0f56, 0xd1147d47), TOBN(0x2afa8c8d, 0xa0a48609),
649 TOBN(0x275353e8, 0xbc36742c), TOBN(0x898f427e, 0xeea0ed90),
650 TOBN(0x26f4947e, 0x3e477b00), TOBN(0x8ad8848a, 0x308741e3),
651 TOBN(0x6c703c38, 0xd74a2a46), TOBN(0x5e3e05a9, 0x9ba17ba2),
652 TOBN(0xc1fa6f66, 0x4ab9a9e4), TOBN(0x474a2d9a, 0x3841d6ec),
653 TOBN(0x871239ad, 0x653ae326), TOBN(0x14bcf72a, 0xa74cbb43),
654 TOBN(0x8737650e, 0x20d4c083), TOBN(0x3df86536, 0x110ed4af),
655 TOBN(0xd2d86fe7, 0xb53ca555), TOBN(0x688cb00d, 0xabd5d538),
656 TOBN(0xcf81bda3, 0x1ad38468), TOBN(0x7ccfe3cc, 0xf01167b6),
657 TOBN(0xcf4f47e0, 0x6c4c1fe6), TOBN(0x557e1f1a, 0x298bbb79),
658 TOBN(0xf93b974f, 0x30d45a14), TOBN(0x174a1d2d, 0x0baf97c4),
659 TOBN(0x7a003b30, 0xc51fbf53), TOBN(0xd8940991, 0xee68b225),
660 TOBN(0x5b0aa7b7, 0x1c0f4173), TOBN(0x975797c9, 0xa20a7153),
661 TOBN(0x26e08c07, 0xe3533d77), TOBN(0xd7222e6a, 0x2e341c99),
662 TOBN(0x9d60ec3d, 0x8d2dc4ed), TOBN(0xbdfe0d8f, 0x7c476cf8),
663 TOBN(0x1fe59ab6, 0x1d056605), TOBN(0xa9ea9df6, 0x86a8551f),
664 TOBN(0x8489941e, 0x47fb8d8c), TOBN(0xfeb874eb, 0x4a7f1b10),
665 TOBN(0xfe5fea86, 0x7ee0d98f), TOBN(0x201ad34b, 0xdbf61864),
666 TOBN(0x45d8fe47, 0x37c031d4), TOBN(0xd5f49fae, 0x795f0822),
667 TOBN(0xdb0fb291, 0xc7f4a40c), TOBN(0x2e69d9c1, 0x730ddd92),
668 TOBN(0x754e1054, 0x49d76987), TOBN(0x8a24911d, 0x7662db87),
669 TOBN(0x61fc1810, 0x60a71676), TOBN(0xe852d1a8, 0xf66a8ad1),
670 TOBN(0x172bbd65, 0x6417231e), TOBN(0x0d6de7bd, 0x3babb11f),
671 TOBN(0x6fde6f88, 0xc8e347f8), TOBN(0x1c587547, 0x9bd99cc3),
672 TOBN(0x78e54ed0, 0x34076950), TOBN(0x97f0f334, 0x796e83ba),
673 TOBN(0xe4dbe1ce, 0x4924867a), TOBN(0xbd5f51b0, 0x60b84917),
674 TOBN(0x37530040, 0x3cb09a79), TOBN(0xdb3fe0f8, 0xff1743d8),
675 TOBN(0xed7894d8, 0x556fa9db), TOBN(0xfa262169, 0x23412fbf),
676 TOBN(0x563be0db, 0xba7b9291), TOBN(0x6ca8b8c0, 0x0c9fb234),
677 TOBN(0xed406aa9, 0xbd763802), TOBN(0xc21486a0, 0x65303da1),
678 TOBN(0x61ae291e, 0xc7e62ec4), TOBN(0x622a0492, 0xdf99333e),
679 TOBN(0x7fd80c9d, 0xbb7a8ee0), TOBN(0xdc2ed3bc, 0x6c01aedb),
680 TOBN(0x35c35a12, 0x08be74ec), TOBN(0xd540cb1a, 0x469f671f),
681 TOBN(0xd16ced4e, 0xcf84f6c7), TOBN(0x8561fb9c, 0x2d090f43),
682 TOBN(0x7e693d79, 0x6f239db4), TOBN(0xa736f928, 0x77bd0d94),
683 TOBN(0x07b4d929, 0x2c1950ee), TOBN(0xda177543, 0x56dc11b3),
684 TOBN(0xa5dfbbaa, 0x7a6a878e), TOBN(0x1c70cb29, 0x4decb08a),
685 TOBN(0xfba28c8b, 0x6f0f7c50), TOBN(0xa8eba2b8, 0x854dcc6d),
686 TOBN(0x5ff8e89a, 0x36b78642), TOBN(0x070c1c8e, 0xf6873adf),
687 TOBN(0xbbd3c371, 0x6484d2e4), TOBN(0xfb78318f, 0x0d414129),
688 TOBN(0x2621a39c, 0x6ad93b0b), TOBN(0x979d74c2, 0xa9e917f7),
689 TOBN(0xfc195647, 0x61fb0428), TOBN(0x4d78954a, 0xbee624d4),
690 TOBN(0xb94896e0, 0xb8ae86fd), TOBN(0x6667ac0c, 0xc91c8b13),
691 TOBN(0x9f180512, 0x43bcf832), TOBN(0xfbadf8b7, 0xa0010137),
692 TOBN(0xc69b4089, 0xb3ba8aa7), TOBN(0xfac4bacd, 0xe687ce85),
693 TOBN(0x9164088d, 0x977eab40), TOBN(0x51f4c5b6, 0x2760b390),
694 TOBN(0xd238238f, 0x340dd553), TOBN(0x358566c3, 0xdb1d31c9),
695 TOBN(0x3a5ad69e, 0x5068f5ff), TOBN(0xf31435fc, 0xdaff6b06),
696 TOBN(0xae549a5b, 0xd6debff0), TOBN(0x59e5f0b7, 0x75e01331),
697 TOBN(0x5d492fb8, 0x98559acf), TOBN(0x96018c2e, 0x4db79b50),
698 TOBN(0x55f4a48f, 0x609f66aa), TOBN(0x1943b3af, 0x4900a14f),
699 TOBN(0xc22496df, 0x15a40d39), TOBN(0xb2a44684, 0x4c20f7c5),
700 TOBN(0x76a35afa, 0x3b98404c), TOBN(0xbec75725, 0xff5d1b77),
701 TOBN(0xb67aa163, 0xbea06444), TOBN(0x27e95bb2, 0xf724b6f2),
702 TOBN(0x3c20e3e9, 0xd238c8ab), TOBN(0x1213754e, 0xddd6ae17),
703 TOBN(0x8c431020, 0x716e0f74), TOBN(0x6679c82e, 0xffc095c2),
704 TOBN(0x2eb3adf4, 0xd0ac2932), TOBN(0x2cc970d3, 0x01bb7a76),
705 TOBN(0x70c71f2f, 0x740f0e66), TOBN(0x545c616b, 0x2b6b23cc),
706 TOBN(0x4528cfcb, 0xb40a8bd7), TOBN(0xff839633, 0x2ab27722),
707 TOBN(0x049127d9, 0x025ac99a), TOBN(0xd314d4a0, 0x2b63e33b),
708 TOBN(0xc8c310e7, 0x28d84519), TOBN(0x0fcb8983, 0xb3bc84ba),
709 TOBN(0x2cc52261, 0x38634818), TOBN(0x501814f4, 0xb44c2e0b),
710 TOBN(0xf7e181aa, 0x54dfdba3), TOBN(0xcfd58ff0, 0xe759718c),
711 TOBN(0xf90cdb14, 0xd3b507a8), TOBN(0x57bd478e, 0xc50bdad8),
712 TOBN(0x29c197e2, 0x50e5f9aa), TOBN(0x4db6eef8, 0xe40bc855),
713 TOBN(0x2cc8f21a, 0xd1fc0654), TOBN(0xc71cc963, 0x81269d73),
714 TOBN(0xecfbb204, 0x077f49f9), TOBN(0xdde92571, 0xca56b793),
715 TOBN(0x9abed6a3, 0xf97ad8f7), TOBN(0xe6c19d3f, 0x924de3bd),
716 TOBN(0x8dce92f4, 0xa140a800), TOBN(0x85f44d1e, 0x1337af07),
717 TOBN(0x5953c08b, 0x09d64c52), TOBN(0xa1b5e49f, 0xf5df9749),
718 TOBN(0x336a8fb8, 0x52735f7d), TOBN(0xb332b6db, 0x9add676b),
719 TOBN(0x558b88a0, 0xb4511aa4), TOBN(0x09788752, 0xdbd5cc55),
720 TOBN(0x16b43b9c, 0xd8cd52bd), TOBN(0x7f0bc5a0, 0xc2a2696b),
721 TOBN(0x146e12d4, 0xc11f61ef), TOBN(0x9ce10754, 0x3a83e79e),
722 TOBN(0x08ec73d9, 0x6cbfca15), TOBN(0x09ff29ad, 0x5b49653f),
723 TOBN(0xe31b72bd, 0xe7da946e), TOBN(0xebf9eb3b, 0xee80a4f2),
724 TOBN(0xd1aabd08, 0x17598ce4), TOBN(0x18b5fef4, 0x53f37e80),
725 TOBN(0xd5d5cdd3, 0x5958cd79), TOBN(0x3580a1b5, 0x1d373114),
726 TOBN(0xa36e4c91, 0xfa935726), TOBN(0xa38c534d, 0xef20d760),
727 TOBN(0x7088e40a, 0x2ff5845b), TOBN(0xe5bb40bd, 0xbd78177f),
728 TOBN(0x4f06a7a8, 0x857f9920), TOBN(0xe3cc3e50, 0xe968f05d),
729 TOBN(0x1d68b7fe, 0xe5682d26), TOBN(0x5206f76f, 0xaec7f87c),
730 TOBN(0x41110530, 0x041951ab), TOBN(0x58ec52c1, 0xd4b5a71a),
731 TOBN(0xf3488f99, 0x0f75cf9a), TOBN(0xf411951f, 0xba82d0d5),
732 TOBN(0x27ee75be, 0x618895ab), TOBN(0xeae060d4, 0x6d8aab14),
733 TOBN(0x9ae1df73, 0x7fb54dc2), TOBN(0x1f3e391b, 0x25963649),
734 TOBN(0x242ec32a, 0xfe055081), TOBN(0x5bd450ef, 0x8491c9bd),
735 TOBN(0x367efc67, 0x981eb389), TOBN(0xed7e1928, 0x3a0550d5),
736 TOBN(0x362e776b, 0xab3ce75c), TOBN(0xe890e308, 0x1f24c523),
737 TOBN(0xb961b682, 0xfeccef76), TOBN(0x8b8e11f5, 0x8bba6d92),
738 TOBN(0x8f2ccc4c, 0x2b2375c4), TOBN(0x0d7f7a52, 0xe2f86cfa),
739 TOBN(0xfd94d30a, 0x9efe5633), TOBN(0x2d8d246b, 0x5451f934),
740 TOBN(0x2234c6e3, 0x244e6a00), TOBN(0xde2b5b0d, 0xddec8c50),
741 TOBN(0x2ce53c5a, 0xbf776f5b), TOBN(0x6f724071, 0x60357b05),
742 TOBN(0xb2593717, 0x71bf3f7a), TOBN(0x87d2501c, 0x440c4a9f),
743 TOBN(0x440552e1, 0x87b05340), TOBN(0xb7bf7cc8, 0x21624c32),
744 TOBN(0x4155a6ce, 0x22facddb), TOBN(0x5a4228cb, 0x889837ef),
745 TOBN(0xef87d6d6, 0xfd4fd671), TOBN(0xa233687e, 0xc2daa10e),
746 TOBN(0x75622244, 0x03c0eb96), TOBN(0x7632d184, 0x8bf19be6),
747 TOBN(0x05d0f8e9, 0x40735ff4), TOBN(0x3a3e6e13, 0xc00931f1),
748 TOBN(0x31ccde6a, 0xdafe3f18), TOBN(0xf381366a, 0xcfe51207),
749 TOBN(0x24c222a9, 0x60167d92), TOBN(0x62f9d6f8, 0x7529f18c),
750 TOBN(0x412397c0, 0x0353b114), TOBN(0x334d89dc, 0xef808043),
751 TOBN(0xd9ec63ba, 0x2a4383ce), TOBN(0xcec8e937, 0x5cf92ba0),
752 TOBN(0xfb8b4288, 0xc8be74c0), TOBN(0x67d6912f, 0x105d4391),
753 TOBN(0x7b996c46, 0x1b913149), TOBN(0x36aae2ef, 0x3a4e02da),
754 TOBN(0xb68aa003, 0x972de594), TOBN(0x284ec70d, 0x4ec6d545),
755 TOBN(0xf3d2b2d0, 0x61391d54), TOBN(0x69c5d5d6, 0xfe114e92),
756 TOBN(0xbe0f00b5, 0xb4482dff), TOBN(0xe1596fa5, 0xf5bf33c5),
757 TOBN(0x10595b56, 0x96a71cba), TOBN(0x944938b2, 0xfdcadeb7),
758 TOBN(0xa282da4c, 0xfccd8471), TOBN(0x98ec05f3, 0x0d37bfe1),
759 TOBN(0xe171ce1b, 0x0698304a), TOBN(0x2d691444, 0x21bdf79b),
760 TOBN(0xd0cd3b74, 0x1b21dec1), TOBN(0x712ecd8b, 0x16a15f71),
761 TOBN(0x8d4c00a7, 0x00fd56e1), TOBN(0x02ec9692, 0xf9527c18),
762 TOBN(0x21c44937, 0x4a3e42e1), TOBN(0x9176fbab, 0x1392ae0a),
763 TOBN(0x8726f1ba, 0x44b7b618), TOBN(0xb4d7aae9, 0xf1de491c),
764 TOBN(0xf91df7b9, 0x07b582c0), TOBN(0x7e116c30, 0xef60aa3a),
765 TOBN(0x99270f81, 0x466265d7), TOBN(0xb15b6fe2, 0x4df7adf0),
766 TOBN(0xfe33b2d3, 0xf9738f7f), TOBN(0x48553ab9, 0xd6d70f95),
767 TOBN(0x2cc72ac8, 0xc21e94db), TOBN(0x795ac38d, 0xbdc0bbee),
768 TOBN(0x0a1be449, 0x2e40478f), TOBN(0x81bd3394, 0x052bde55),
769 TOBN(0x63c8dbe9, 0x56b3c4f2), TOBN(0x017a99cf, 0x904177cc),
770 TOBN(0x947bbddb, 0x4d010fc1), TOBN(0xacf9b00b, 0xbb2c9b21),
771 TOBN(0x2970bc8d, 0x47173611), TOBN(0x1a4cbe08, 0xac7d756f),
772 TOBN(0x06d9f4aa, 0x67d541a2), TOBN(0xa3e8b689, 0x59c2cf44),
773 TOBN(0xaad066da, 0x4d88f1dd), TOBN(0xc604f165, 0x7ad35dea),
774 TOBN(0x7edc0720, 0x4478ca67), TOBN(0xa10dfae0, 0xba02ce06),
775 TOBN(0xeceb1c76, 0xaf36f4e4), TOBN(0x994b2292, 0xaf3f8f48),
776 TOBN(0xbf9ed77b, 0x77c8a68c), TOBN(0x74f544ea, 0x51744c9d),
777 TOBN(0x82d05bb9, 0x8113a757), TOBN(0x4ef2d2b4, 0x8a9885e4),
778 TOBN(0x1e332be5, 0x1aa7865f), TOBN(0x22b76b18, 0x290d1a52),
779 TOBN(0x308a2310, 0x44351683), TOBN(0x9d861896, 0xa3f22840),
780 TOBN(0x5959ddcd, 0x841ed947), TOBN(0x0def0c94, 0x154b73bf),
781 TOBN(0xf0105417, 0x4c7c15e0), TOBN(0x539bfb02, 0x3a277c32),
782 TOBN(0xe699268e, 0xf9dccf5f), TOBN(0x9f5796a5, 0x0247a3bd),
783 TOBN(0x8b839de8, 0x4f157269), TOBN(0xc825c1e5, 0x7a30196b),
784 TOBN(0x6ef0aabc, 0xdc8a5a91), TOBN(0xf4a8ce6c, 0x498b7fe6),
785 TOBN(0x1cce35a7, 0x70cbac78), TOBN(0x83488e9b, 0xf6b23958),
786 TOBN(0x0341a070, 0xd76cb011), TOBN(0xda6c9d06, 0xae1b2658),
787 TOBN(0xb701fb30, 0xdd648c52), TOBN(0x994ca02c, 0x52fb9fd1),
788 TOBN(0x06933117, 0x6f563086), TOBN(0x3d2b8100, 0x17856bab),
789 TOBN(0xe89f48c8, 0x5963a46e), TOBN(0x658ab875, 0xa99e61c7),
790 TOBN(0x6e296f87, 0x4b8517b4), TOBN(0x36c4fcdc, 0xfc1bc656),
791 TOBN(0xde5227a1, 0xa3906def), TOBN(0x9fe95f57, 0x62418945),
792 TOBN(0x20c91e81, 0xfdd96cde), TOBN(0x5adbe47e, 0xda4480de),
793 TOBN(0xa009370f, 0x396de2b6), TOBN(0x98583d4b, 0xf0ecc7bd),
794 TOBN(0xf44f6b57, 0xe51d0672), TOBN(0x03d6b078, 0x556b1984),
795 TOBN(0x27dbdd93, 0xb0b64912), TOBN(0x9b3a3434, 0x15687b09),
796 TOBN(0x0dba6461, 0x51ec20a9), TOBN(0xec93db7f, 0xff28187c),
797 TOBN(0x00ff8c24, 0x66e48bdd), TOBN(0x2514f2f9, 0x11ccd78e),
798 TOBN(0xeba11f4f, 0xe1250603), TOBN(0x8a22cd41, 0x243fa156),
799 TOBN(0xa4e58df4, 0xb283e4c6), TOBN(0x78c29859, 0x8b39783f),
800 TOBN(0x5235aee2, 0xa5259809), TOBN(0xc16284b5, 0x0e0227dd),
801 TOBN(0xa5f57916, 0x1338830d), TOBN(0x6d4b8a6b, 0xd2123fca),
802 TOBN(0x236ea68a, 0xf9c546f8), TOBN(0xc1d36873, 0xfa608d36),
803 TOBN(0xcd76e495, 0x8d436d13), TOBN(0xd4d9c221, 0x8fb080af),
804 TOBN(0x665c1728, 0xe8ad3fb5), TOBN(0xcf1ebe4d, 0xb3d572e0),
805 TOBN(0xa7a8746a, 0x584c5e20), TOBN(0x267e4ea1, 0xb9dc7035),
806 TOBN(0x593a15cf, 0xb9548c9b), TOBN(0x5e6e2135, 0x4bd012f3),
807 TOBN(0xdf31cc6a, 0x8c8f936e), TOBN(0x8af84d04, 0xb5c241dc),
808 TOBN(0x63990a6f, 0x345efb86), TOBN(0x6fef4e61, 0xb9b962cb)},
809 {TOBN(0xf6368f09, 0x25722608), TOBN(0x131260db, 0x131cf5c6),
810 TOBN(0x40eb353b, 0xfab4f7ac), TOBN(0x85c78880, 0x37eee829),
811 TOBN(0x4c1581ff, 0xc3bdf24e), TOBN(0x5bff75cb, 0xf5c3c5a8),
812 TOBN(0x35e8c83f, 0xa14e6f40), TOBN(0xb81d1c0f, 0x0295e0ca),
813 TOBN(0xfcde7cc8, 0xf43a730f), TOBN(0xe89b6f3c, 0x33ab590e),
814 TOBN(0xc823f529, 0xad03240b), TOBN(0x82b79afe, 0x98bea5db),
815 TOBN(0x568f2856, 0x962fe5de), TOBN(0x0c590adb, 0x60c591f3),
816 TOBN(0x1fc74a14, 0x4a28a858), TOBN(0x3b662498, 0xb3203f4c),
817 TOBN(0x91e3cf0d, 0x6c39765a), TOBN(0xa2db3acd, 0xac3cca0b),
818 TOBN(0x288f2f08, 0xcb953b50), TOBN(0x2414582c, 0xcf43cf1a),
819 TOBN(0x8dec8bbc, 0x60eee9a8), TOBN(0x54c79f02, 0x729aa042),
820 TOBN(0xd81cd5ec, 0x6532f5d5), TOBN(0xa672303a, 0xcf82e15f),
821 TOBN(0x376aafa8, 0x719c0563), TOBN(0xcd8ad2dc, 0xbc5fc79f),
822 TOBN(0x303fdb9f, 0xcb750cd3), TOBN(0x14ff052f, 0x4418b08e),
823 TOBN(0xf75084cf, 0x3e2d6520), TOBN(0x7ebdf0f8, 0x144ed509),
824 TOBN(0xf43bf0f2, 0xd3f25b98), TOBN(0x86ad71cf, 0xa354d837),
825 TOBN(0xb827fe92, 0x26f43572), TOBN(0xdfd3ab5b, 0x5d824758),
826 TOBN(0x315dd23a, 0x539094c1), TOBN(0x85c0e37a, 0x66623d68),
827 TOBN(0x575c7972, 0x7be19ae0), TOBN(0x616a3396, 0xdf0d36b5),
828 TOBN(0xa1ebb3c8, 0x26b1ff7e), TOBN(0x635b9485, 0x140ad453),
829 TOBN(0x92bf3cda, 0xda430c0b), TOBN(0x4702850e, 0x3a96dac6),
830 TOBN(0xc91cf0a5, 0x15ac326a), TOBN(0x95de4f49, 0xab8c25e4),
831 TOBN(0xb01bad09, 0xe265c17c), TOBN(0x24e45464, 0x087b3881),
832 TOBN(0xd43e583c, 0xe1fac5ca), TOBN(0xe17cb318, 0x6ead97a6),
833 TOBN(0x6cc39243, 0x74dcec46), TOBN(0x33cfc02d, 0x54c2b73f),
834 TOBN(0x82917844, 0xf26cd99c), TOBN(0x8819dd95, 0xd1773f89),
835 TOBN(0x09572aa6, 0x0871f427), TOBN(0x8e0cf365, 0xf6f01c34),
836 TOBN(0x7fa52988, 0xbff1f5af), TOBN(0x4eb357ea, 0xe75e8e50),
837 TOBN(0xd9d0c8c4, 0x868af75d), TOBN(0xd7325cff, 0x45c8c7ea),
838 TOBN(0xab471996, 0xcc81ecb0), TOBN(0xff5d55f3, 0x611824ed),
839 TOBN(0xbe314541, 0x1977a0ee), TOBN(0x5085c4c5, 0x722038c6),
840 TOBN(0x2d5335bf, 0xf94bb495), TOBN(0x894ad8a6, 0xc8e2a082),
841 TOBN(0x5c3e2341, 0xada35438), TOBN(0xf4a9fc89, 0x049b8c4e),
842 TOBN(0xbeeb355a, 0x9f17cf34), TOBN(0x3f311e0e, 0x6c91fe10),
843 TOBN(0xc2d20038, 0x92ab9891), TOBN(0x257bdcc1, 0x3e8ce9a9),
844 TOBN(0x1b2d9789, 0x88c53bee), TOBN(0x927ce89a, 0xcdba143a),
845 TOBN(0xb0a32cca, 0x523db280), TOBN(0x5c889f8a, 0x50d43783),
846 TOBN(0x503e04b3, 0x4897d16f), TOBN(0x8cdb6e78, 0x08f5f2e8),
847 TOBN(0x6ab91cf0, 0x179c8e74), TOBN(0xd8874e52, 0x48211d60),
848 TOBN(0xf948d4d5, 0xea851200), TOBN(0x4076d41e, 0xe6f9840a),
849 TOBN(0xc20e263c, 0x47b517ea), TOBN(0x79a448fd, 0x30685e5e),
850 TOBN(0xe55f6f78, 0xf90631a0), TOBN(0x88a790b1, 0xa79e6346),
851 TOBN(0x62160c7d, 0x80969fe8), TOBN(0x54f92fd4, 0x41491bb9),
852 TOBN(0xa6645c23, 0x5c957526), TOBN(0xf44cc5ae, 0xbea3ce7b),
853 TOBN(0xf7628327, 0x8b1e68b7), TOBN(0xc731ad7a, 0x303f29d3),
854 TOBN(0xfe5a9ca9, 0x57d03ecb), TOBN(0x96c0d50c, 0x41bc97a7),
855 TOBN(0xc4669fe7, 0x9b4f7f24), TOBN(0xfdd781d8, 0x3d9967ef),
856 TOBN(0x7892c7c3, 0x5d2c208d), TOBN(0x8bf64f7c, 0xae545cb3),
857 TOBN(0xc01f862c, 0x467be912), TOBN(0xf4c85ee9, 0xc73d30cc),
858 TOBN(0x1fa6f4be, 0x6ab83ec7), TOBN(0xa07a3c1c, 0x4e3e3cf9),
859 TOBN(0x87f8ef45, 0x0c00beb3), TOBN(0x30e2c2b3, 0x000d4c3e),
860 TOBN(0x1aa00b94, 0xfe08bf5b), TOBN(0x32c133aa, 0x9224ef52),
861 TOBN(0x38df16bb, 0x32e5685d), TOBN(0x68a9e069, 0x58e6f544),
862 TOBN(0x495aaff7, 0xcdc5ebc6), TOBN(0xf894a645, 0x378b135f),
863 TOBN(0xf316350a, 0x09e27ecf), TOBN(0xeced201e, 0x58f7179d),
864 TOBN(0x2eec273c, 0xe97861ba), TOBN(0x47ec2cae, 0xd693be2e),
865 TOBN(0xfa4c97c4, 0xf68367ce), TOBN(0xe4f47d0b, 0xbe5a5755),
866 TOBN(0x17de815d, 0xb298a979), TOBN(0xd7eca659, 0xc177dc7d),
867 TOBN(0x20fdbb71, 0x49ded0a3), TOBN(0x4cb2aad4, 0xfb34d3c5),
868 TOBN(0x2cf31d28, 0x60858a33), TOBN(0x3b6873ef, 0xa24aa40f),
869 TOBN(0x540234b2, 0x2c11bb37), TOBN(0x2d0366dd, 0xed4c74a3),
870 TOBN(0xf9a968da, 0xeec5f25d), TOBN(0x36601068, 0x67b63142),
871 TOBN(0x07cd6d2c, 0x68d7b6d4), TOBN(0xa8f74f09, 0x0c842942),
872 TOBN(0xe2751404, 0x7768b1ee), TOBN(0x4b5f7e89, 0xfe62aee4),
873 TOBN(0xc6a77177, 0x89070d26), TOBN(0xa1f28e4e, 0xdd1c8bc7),
874 TOBN(0xea5f4f06, 0x469e1f17), TOBN(0x78fc242a, 0xfbdb78e0),
875 TOBN(0xc9c7c592, 0x8b0588f1), TOBN(0xb6b7a0fd, 0x1535921e),
876 TOBN(0xcc5bdb91, 0xbde5ae35), TOBN(0xb42c485e, 0x12ff1864),
877 TOBN(0xa1113e13, 0xdbab98aa), TOBN(0xde9d469b, 0xa17b1024),
878 TOBN(0x23f48b37, 0xc0462d3a), TOBN(0x3752e537, 0x7c5c078d),
879 TOBN(0xe3a86add, 0x15544eb9), TOBN(0xf013aea7, 0x80fba279),
880 TOBN(0x8b5bb76c, 0xf22001b5), TOBN(0xe617ba14, 0xf02891ab),
881 TOBN(0xd39182a6, 0x936219d3), TOBN(0x5ce1f194, 0xae51cb19),
882 TOBN(0xc78f8598, 0xbf07a74c), TOBN(0x6d7158f2, 0x22cbf1bc),
883 TOBN(0x3b846b21, 0xe300ce18), TOBN(0x35fba630, 0x2d11275d),
884 TOBN(0x5fe25c36, 0xa0239b9b), TOBN(0xd8beb35d, 0xdf05d940),
885 TOBN(0x4db02bb0, 0x1f7e320d), TOBN(0x0641c364, 0x6da320ea),
886 TOBN(0x6d95fa5d, 0x821389a3), TOBN(0x92699748, 0x8fcd8e3d),
887 TOBN(0x316fef17, 0xceb6c143), TOBN(0x67fcb841, 0xd933762b),
888 TOBN(0xbb837e35, 0x118b17f8), TOBN(0x4b92552f, 0x9fd24821),
889 TOBN(0xae6bc70e, 0x46aca793), TOBN(0x1cf0b0e4, 0xe579311b),
890 TOBN(0x8dc631be, 0x5802f716), TOBN(0x099bdc6f, 0xbddbee4d),
891 TOBN(0xcc352bb2, 0x0caf8b05), TOBN(0xf74d505a, 0x72d63df2),
892 TOBN(0xb9876d4b, 0x91c4f408), TOBN(0x1ce18473, 0x9e229b2d),
893 TOBN(0x49507597, 0x83abdb4a), TOBN(0x850fbcb6, 0xdee84b18),
894 TOBN(0x6325236e, 0x609e67dc), TOBN(0x04d831d9, 0x9336c6d8),
895 TOBN(0x8deaae3b, 0xfa12d45d), TOBN(0xe425f8ce, 0x4746e246),
896 TOBN(0x8004c175, 0x24f5f31e), TOBN(0xaca16d8f, 0xad62c3b7),
897 TOBN(0x0dc15a6a, 0x9152f934), TOBN(0xf1235e5d, 0xed0e12c1),
898 TOBN(0xc33c06ec, 0xda477dac), TOBN(0x76be8732, 0xb2ea0006),
899 TOBN(0xcf3f7831, 0x0c0cd313), TOBN(0x3c524553, 0xa614260d),
900 TOBN(0x31a756f8, 0xcab22d15), TOBN(0x03ee10d1, 0x77827a20),
901 TOBN(0xd1e059b2, 0x1994ef20), TOBN(0x2a653b69, 0x638ae318),
902 TOBN(0x70d5eb58, 0x2f699010), TOBN(0x279739f7, 0x09f5f84a),
903 TOBN(0x5da4663c, 0x8b799336), TOBN(0xfdfdf14d, 0x203c37eb),
904 TOBN(0x32d8a9dc, 0xa1dbfb2d), TOBN(0xab40cff0, 0x77d48f9b),
905 TOBN(0xc018b383, 0xd20b42d5), TOBN(0xf9a810ef, 0x9f78845f),
906 TOBN(0x40af3753, 0xbdba9df0), TOBN(0xb90bdcfc, 0x131dfdf9),
907 TOBN(0x18720591, 0xf01ab782), TOBN(0xc823f211, 0x6af12a88),
908 TOBN(0xa51b80f3, 0x0dc14401), TOBN(0xde248f77, 0xfb2dfbe3),
909 TOBN(0xef5a44e5, 0x0cafe751), TOBN(0x73997c9c, 0xd4dcd221),
910 TOBN(0x32fd86d1, 0xde854024), TOBN(0xd5b53adc, 0xa09b84bb),
911 TOBN(0x008d7a11, 0xdcedd8d1), TOBN(0x406bd1c8, 0x74b32c84),
912 TOBN(0x5d4472ff, 0x05dde8b1), TOBN(0x2e25f2cd, 0xfce2b32f),
913 TOBN(0xbec0dd5e, 0x29dfc254), TOBN(0x4455fcf6, 0x2b98b267),
914 TOBN(0x0b4d43a5, 0xc72df2ad), TOBN(0xea70e6be, 0x48a75397),
915 TOBN(0x2aad6169, 0x5820f3bf), TOBN(0xf410d2dd, 0x9e37f68f),
916 TOBN(0x70fb7dba, 0x7be5ac83), TOBN(0x636bb645, 0x36ec3eec),
917 TOBN(0x27104ea3, 0x9754e21c), TOBN(0xbc87a3e6, 0x8d63c373),
918 TOBN(0x483351d7, 0x4109db9a), TOBN(0x0fa724e3, 0x60134da7),
919 TOBN(0x9ff44c29, 0xb0720b16), TOBN(0x2dd0cf13, 0x06aceead),
920 TOBN(0x5942758c, 0xe26929a6), TOBN(0x96c5db92, 0xb766a92b),
921 TOBN(0xcec7d4c0, 0x5f18395e), TOBN(0xd3f22744, 0x1f80d032),
922 TOBN(0x7a68b37a, 0xcb86075b), TOBN(0x074764dd, 0xafef92db),
923 TOBN(0xded1e950, 0x7bc7f389), TOBN(0xc580c850, 0xb9756460),
924 TOBN(0xaeeec2a4, 0x7da48157), TOBN(0x3f0b4e7f, 0x82c587b3),
925 TOBN(0x231c6de8, 0xa9f19c53), TOBN(0x5717bd73, 0x6974e34e),
926 TOBN(0xd9e1d216, 0xf1508fa9), TOBN(0x9f112361, 0xdadaa124),
927 TOBN(0x80145e31, 0x823b7348), TOBN(0x4dd8f0d5, 0xac634069),
928 TOBN(0xe3d82fc7, 0x2297c258), TOBN(0x276fcfee, 0x9cee7431),
929 TOBN(0x8eb61b5e, 0x2bc0aea9), TOBN(0x4f668fd5, 0xde329431),
930 TOBN(0x03a32ab1, 0x38e4b87e), TOBN(0xe1374517, 0x73d0ef0b),
931 TOBN(0x1a46f7e6, 0x853ac983), TOBN(0xc3bdf42e, 0x68e78a57),
932 TOBN(0xacf20785, 0x2ea96dd1), TOBN(0xa10649b9, 0xf1638460),
933 TOBN(0xf2369f0b, 0x879fbbed), TOBN(0x0ff0ae86, 0xda9d1869),
934 TOBN(0x5251d759, 0x56766f45), TOBN(0x4984d8c0, 0x2be8d0fc),
935 TOBN(0x7ecc95a6, 0xd21008f0), TOBN(0x29bd54a0, 0x3a1a1c49),
936 TOBN(0xab9828c5, 0xd26c50f3), TOBN(0x32c0087c, 0x51d0d251),
937 TOBN(0x9bac3ce6, 0x0c1cdb26), TOBN(0xcd94d947, 0x557ca205),
938 TOBN(0x1b1bd598, 0x9db1fdcd), TOBN(0x0eda0108, 0xa3d8b149),
939 TOBN(0x95066610, 0x56152fcc), TOBN(0xc2f037e6, 0xe7192b33),
940 TOBN(0xdeffb41a, 0xc92e05a4), TOBN(0x1105f6c2, 0xc2f6c62e),
941 TOBN(0x68e73500, 0x8733913c), TOBN(0xcce86163, 0x3f3adc40),
942 TOBN(0xf407a942, 0x38a278e9), TOBN(0xd13c1b9d, 0x2ab21292),
943 TOBN(0x93ed7ec7, 0x1c74cf5c), TOBN(0x8887dc48, 0xf1a4c1b4),
944 TOBN(0x3830ff30, 0x4b3a11f1), TOBN(0x358c5a3c, 0x58937cb6),
945 TOBN(0x027dc404, 0x89022829), TOBN(0x40e93977, 0x3b798f79),
946 TOBN(0x90ad3337, 0x38be6ead), TOBN(0x9c23f6bc, 0xf34c0a5d),
947 TOBN(0xd1711a35, 0xfbffd8bb), TOBN(0x60fcfb49, 0x1949d3dd),
948 TOBN(0x09c8ef4b, 0x7825d93a), TOBN(0x24233cff, 0xa0a8c968),
949 TOBN(0x67ade46c, 0xe6d982af), TOBN(0xebb6bf3e, 0xe7544d7c),
950 TOBN(0xd6b9ba76, 0x3d8bd087), TOBN(0x46fe382d, 0x4dc61280),
951 TOBN(0xbd39a7e8, 0xb5bdbd75), TOBN(0xab381331, 0xb8f228fe),
952 TOBN(0x0709a77c, 0xce1c4300), TOBN(0x6a247e56, 0xf337ceac),
953 TOBN(0x8f34f21b, 0x636288be), TOBN(0x9dfdca74, 0xc8a7c305),
954 TOBN(0x6decfd1b, 0xea919e04), TOBN(0xcdf2688d, 0x8e1991f8),
955 TOBN(0xe607df44, 0xd0f8a67e), TOBN(0xd985df4b, 0x0b58d010),
956 TOBN(0x57f834c5, 0x0c24f8f4), TOBN(0xe976ef56, 0xa0bf01ae),
957 TOBN(0x536395ac, 0xa1c32373), TOBN(0x351027aa, 0x734c0a13),
958 TOBN(0xd2f1b5d6, 0x5e6bd5bc), TOBN(0x2b539e24, 0x223debed),
959 TOBN(0xd4994cec, 0x0eaa1d71), TOBN(0x2a83381d, 0x661dcf65),
960 TOBN(0x5f1aed2f, 0x7b54c740), TOBN(0x0bea3fa5, 0xd6dda5ee),
961 TOBN(0x9d4fb684, 0x36cc6134), TOBN(0x8eb9bbf3, 0xc0a443dd),
962 TOBN(0xfc500e2e, 0x383b7d2a), TOBN(0x7aad621c, 0x5b775257),
963 TOBN(0x69284d74, 0x0a8f7cc0), TOBN(0xe820c2ce, 0x07562d65),
964 TOBN(0xbf9531b9, 0x499758ee), TOBN(0x73e95ca5, 0x6ee0cc2d),
965 TOBN(0xf61790ab, 0xfbaf50a5), TOBN(0xdf55e76b, 0x684e0750),
966 TOBN(0xec516da7, 0xf176b005), TOBN(0x575553bb, 0x7a2dddc7),
967 TOBN(0x37c87ca3, 0x553afa73), TOBN(0x315f3ffc, 0x4d55c251),
968 TOBN(0xe846442a, 0xaf3e5d35), TOBN(0x61b91149, 0x6495ff28),
969 TOBN(0x23cc95d3, 0xfa326dc3), TOBN(0x1df4da1f, 0x18fc2cea),
970 TOBN(0x24bf9adc, 0xd0a37d59), TOBN(0xb6710053, 0x320d6e1e),
971 TOBN(0x96f9667e, 0x618344d1), TOBN(0xcc7ce042, 0xa06445af),
972 TOBN(0xa02d8514, 0xd68dbc3a), TOBN(0x4ea109e4, 0x280b5a5b),
973 TOBN(0x5741a7ac, 0xb40961bf), TOBN(0x4ada5937, 0x6aa56bfa),
974 TOBN(0x7feb9145, 0x02b765d1), TOBN(0x561e97be, 0xe6ad1582),
975 TOBN(0xbbc4a5b6, 0xda3982f5), TOBN(0x0c2659ed, 0xb546f468),
976 TOBN(0xb8e7e6aa, 0x59612d20), TOBN(0xd83dfe20, 0xac19e8e0),
977 TOBN(0x8530c45f, 0xb835398c), TOBN(0x6106a8bf, 0xb38a41c2),
978 TOBN(0x21e8f9a6, 0x35f5dcdb), TOBN(0x39707137, 0xcae498ed),
979 TOBN(0x70c23834, 0xd8249f00), TOBN(0x9f14b58f, 0xab2537a0),
980 TOBN(0xd043c365, 0x5f61c0c2), TOBN(0xdc5926d6, 0x09a194a7),
981 TOBN(0xddec0339, 0x8e77738a), TOBN(0xd07a63ef, 0xfba46426),
982 TOBN(0x2e58e79c, 0xee7f6e86), TOBN(0xe59b0459, 0xff32d241),
983 TOBN(0xc5ec84e5, 0x20fa0338), TOBN(0x97939ac8, 0xeaff5ace),
984 TOBN(0x0310a4e3, 0xb4a38313), TOBN(0x9115fba2, 0x8f9d9885),
985 TOBN(0x8dd710c2, 0x5fadf8c3), TOBN(0x66be38a2, 0xce19c0e2),
986 TOBN(0xd42a279c, 0x4cfe5022), TOBN(0x597bb530, 0x0e24e1b8),
987 TOBN(0x3cde86b7, 0xc153ca7f), TOBN(0xa8d30fb3, 0x707d63bd),
988 TOBN(0xac905f92, 0xbd60d21e), TOBN(0x98e7ffb6, 0x7b9a54ab),
989 TOBN(0xd7147df8, 0xe9726a30), TOBN(0xb5e216ff, 0xafce3533),
990 TOBN(0xb550b799, 0x2ff1ec40), TOBN(0x6b613b87, 0xa1e953fd),
991 TOBN(0x87b88dba, 0x792d5610), TOBN(0x2ee1270a, 0xa190fbe1),
992 TOBN(0x02f4e2dc, 0x2ef581da), TOBN(0x016530e4, 0xeff82a95),
993 TOBN(0xcbb93dfd, 0x8fd6ee89), TOBN(0x16d3d986, 0x46848fff),
994 TOBN(0x600eff24, 0x1da47adf), TOBN(0x1b9754a0, 0x0ad47a71),
995 TOBN(0x8f9266df, 0x70c33b98), TOBN(0xaadc87ae, 0xdf34186e),
996 TOBN(0x0d2ce8e1, 0x4ad24132), TOBN(0x8a47cbfc, 0x19946eba),
997 TOBN(0x47feeb66, 0x62b5f3af), TOBN(0xcefab561, 0x0abb3734),
998 TOBN(0x449de60e, 0x19f35cb1), TOBN(0x39f8db14, 0x157f0eb9),
999 TOBN(0xffaecc5b, 0x3c61bfd6), TOBN(0xa5a4d41d, 0x41216703),
1000 TOBN(0x7f8fabed, 0x224e1cc2), TOBN(0x0d5a8186, 0x871ad953),
1001 TOBN(0xf10774f7, 0xd22da9a9), TOBN(0x45b8a678, 0xcc8a9b0d),
1002 TOBN(0xd9c2e722, 0xbdc32cff), TOBN(0xbf71b5f5, 0x337202a5),
1003 TOBN(0x95c57f2f, 0x69fc4db9), TOBN(0xb6dad34c, 0x765d01e1),
1004 TOBN(0x7e0bd13f, 0xcb904635), TOBN(0x61751253, 0x763a588c),
1005 TOBN(0xd85c2997, 0x81af2c2d), TOBN(0xc0f7d9c4, 0x81b9d7da),
1006 TOBN(0x838a34ae, 0x08533e8d), TOBN(0x15c4cb08, 0x311d8311),
1007 TOBN(0x97f83285, 0x8e121e14), TOBN(0xeea7dc1e, 0x85000a5f),
1008 TOBN(0x0c6059b6, 0x5d256274), TOBN(0xec9beace, 0xb95075c0),
1009 TOBN(0x173daad7, 0x1df97828), TOBN(0xbf851cb5, 0xa8937877),
1010 TOBN(0xb083c594, 0x01646f3c), TOBN(0x3bad30cf, 0x50c6d352),
1011 TOBN(0xfeb2b202, 0x496bbcea), TOBN(0x3cf9fd4f, 0x18a1e8ba),
1012 TOBN(0xd26de7ff, 0x1c066029), TOBN(0x39c81e9e, 0x4e9ed4f8),
1013 TOBN(0xd8be0cb9, 0x7b390d35), TOBN(0x01df2bbd, 0x964aab27),
1014 TOBN(0x3e8c1a65, 0xc3ef64f8), TOBN(0x567291d1, 0x716ed1dd),
1015 TOBN(0x95499c6c, 0x5f5406d3), TOBN(0x71fdda39, 0x5ba8e23f),
1016 TOBN(0xcfeb320e, 0xd5096ece), TOBN(0xbe7ba92b, 0xca66dd16),
1017 TOBN(0x4608d36b, 0xc6fb5a7d), TOBN(0xe3eea15a, 0x6d2dd0e0),
1018 TOBN(0x75b0a3eb, 0x8f97a36a), TOBN(0xf59814cc, 0x1c83de1e),
1019 TOBN(0x56c9c5b0, 0x1c33c23f), TOBN(0xa96c1da4, 0x6faa4136),
1020 TOBN(0x46bf2074, 0xde316551), TOBN(0x3b866e7b, 0x1f756c8f),
1021 TOBN(0x727727d8, 0x1495ed6b), TOBN(0xb2394243, 0xb682dce7),
1022 TOBN(0x8ab8454e, 0x758610f3), TOBN(0xc243ce84, 0x857d72a4),
1023 TOBN(0x7b320d71, 0xdbbf370f), TOBN(0xff9afa37, 0x78e0f7ca),
1024 TOBN(0x0119d1e0, 0xea7b523f), TOBN(0xb997f8cb, 0x058c7d42),
1025 TOBN(0x285bcd2a, 0x37bbb184), TOBN(0x51dcec49, 0xa45d1fa6),
1026 TOBN(0x6ade3b64, 0xe29634cb), TOBN(0x080c94a7, 0x26b86ef1),
1027 TOBN(0xba583db1, 0x2283fbe3), TOBN(0x902bddc8, 0x5a9315ed),
1028 TOBN(0x07c1ccb3, 0x86964bec), TOBN(0x78f4eacf, 0xb6258301),
1029 TOBN(0x4bdf3a49, 0x56f90823), TOBN(0xba0f5080, 0x741d777b),
1030 TOBN(0x091d71c3, 0xf38bf760), TOBN(0x9633d50f, 0x9b625b02),
1031 TOBN(0x03ecb743, 0xb8c9de61), TOBN(0xb4751254, 0x5de74720),
1032 TOBN(0x9f9defc9, 0x74ce1cb2), TOBN(0x774a4f6a, 0x00bd32ef),
1033 TOBN(0xaca385f7, 0x73848f22), TOBN(0x53dad716, 0xf3f8558e),
1034 TOBN(0xab7b34b0, 0x93c471f9), TOBN(0xf530e069, 0x19644bc7),
1035 TOBN(0x3d9fb1ff, 0xdd59d31a), TOBN(0x4382e0df, 0x08daa795),
1036 TOBN(0x165c6f4b, 0xd5cc88d7), TOBN(0xeaa392d5, 0x4a18c900),
1037 TOBN(0x94203c67, 0x648024ee), TOBN(0x188763f2, 0x8c2fabcd),
1038 TOBN(0xa80f87ac, 0xbbaec835), TOBN(0x632c96e0, 0xf29d8d54),
1039 TOBN(0x29b0a60e, 0x4c00a95e), TOBN(0x2ef17f40, 0xe011e9fa),
1040 TOBN(0xf6c0e1d1, 0x15b77223), TOBN(0xaaec2c62, 0x14b04e32),
1041 TOBN(0xd35688d8, 0x3d84e58c), TOBN(0x2af5094c, 0x958571db),
1042 TOBN(0x4fff7e19, 0x760682a6), TOBN(0x4cb27077, 0xe39a407c),
1043 TOBN(0x0f59c547, 0x4ff0e321), TOBN(0x169f34a6, 0x1b34c8ff),
1044 TOBN(0x2bff1096, 0x52bc1ba7), TOBN(0xa25423b7, 0x83583544),
1045 TOBN(0x5d55d5d5, 0x0ac8b782), TOBN(0xff6622ec, 0x2db3c892),
1046 TOBN(0x48fce741, 0x6b8bb642), TOBN(0x31d6998c, 0x69d7e3dc),
1047 TOBN(0xdbaf8004, 0xcadcaed0), TOBN(0x801b0142, 0xd81d053c),
1048 TOBN(0x94b189fc, 0x59630ec6), TOBN(0x120e9934, 0xaf762c8e),
1049 TOBN(0x53a29aa4, 0xfdc6a404), TOBN(0x19d8e01e, 0xa1909948),
1050 TOBN(0x3cfcabf1, 0xd7e89681), TOBN(0x3321a50d, 0x4e132d37),
1051 TOBN(0xd0496863, 0xe9a86111), TOBN(0x8c0cde61, 0x06a3bc65),
1052 TOBN(0xaf866c49, 0xfc9f8eef), TOBN(0x2066350e, 0xff7f5141),
1053 TOBN(0x4f8a4689, 0xe56ddfbd), TOBN(0xea1b0c07, 0xfe32983a),
1054 TOBN(0x2b317462, 0x873cb8cb), TOBN(0x658deddc, 0x2d93229f),
1055 TOBN(0x65efaf4d, 0x0f64ef58), TOBN(0xfe43287d, 0x730cc7a8),
1056 TOBN(0xaebc0c72, 0x3d047d70), TOBN(0x92efa539, 0xd92d26c9),
1057 TOBN(0x06e78457, 0x94b56526), TOBN(0x415cb80f, 0x0961002d),
1058 TOBN(0x89e5c565, 0x76dcb10f), TOBN(0x8bbb6982, 0xff9259fe),
1059 TOBN(0x4fe8795b, 0x9abc2668), TOBN(0xb5d4f534, 0x1e678fb1),
1060 TOBN(0x6601f3be, 0x7b7da2b9), TOBN(0x98da59e2, 0xa13d6805),
1061 TOBN(0x190d8ea6, 0x01799a52), TOBN(0xa20cec41, 0xb86d2952),
1062 TOBN(0x3062ffb2, 0x7fff2a7c), TOBN(0x741b32e5, 0x79f19d37),
1063 TOBN(0xf80d8181, 0x4eb57d47), TOBN(0x7a2d0ed4, 0x16aef06b),
1064 TOBN(0x09735fb0, 0x1cecb588), TOBN(0x1641caaa, 0xc6061f5b)},
1065 {TOBN(0x7f99824f, 0x20151427), TOBN(0x206828b6, 0x92430206),
1066 TOBN(0xaa9097d7, 0xe1112357), TOBN(0xacf9a2f2, 0x09e414ec),
1067 TOBN(0xdbdac9da, 0x27915356), TOBN(0x7e0734b7, 0x001efee3),
1068 TOBN(0x54fab5bb, 0xd2b288e2), TOBN(0x4c630fc4, 0xf62dd09c),
1069 TOBN(0x8537107a, 0x1ac2703b), TOBN(0xb49258d8, 0x6bc857b5),
1070 TOBN(0x57df14de, 0xbcdaccd1), TOBN(0x24ab68d7, 0xc4ae8529),
1071 TOBN(0x7ed8b5d4, 0x734e59d0), TOBN(0x5f8740c8, 0xc495cc80),
1072 TOBN(0x84aedd5a, 0x291db9b3), TOBN(0x80b360f8, 0x4fb995be),
1073 TOBN(0xae915f5d, 0x5fa067d1), TOBN(0x4134b57f, 0x9668960c),
1074 TOBN(0xbd3656d6, 0xa48edaac), TOBN(0xdac1e3e4, 0xfc1d7436),
1075 TOBN(0x674ff869, 0xd81fbb26), TOBN(0x449ed3ec, 0xb26c33d4),
1076 TOBN(0x85138705, 0xd94203e8), TOBN(0xccde538b, 0xbeeb6f4a),
1077 TOBN(0x55d5c68d, 0xa61a76fa), TOBN(0x598b441d, 0xca1554dc),
1078 TOBN(0xd39923b9, 0x773b279c), TOBN(0x33331d3c, 0x36bf9efc),
1079 TOBN(0x2d4c848e, 0x298de399), TOBN(0xcfdb8e77, 0xa1a27f56),
1080 TOBN(0x94c855ea, 0x57b8ab70), TOBN(0xdcdb9dae, 0x6f7879ba),
1081 TOBN(0x7bdff8c2, 0x019f2a59), TOBN(0xb3ce5bb3, 0xcb4fbc74),
1082 TOBN(0xea907f68, 0x8a9173dd), TOBN(0x6cd3d0d3, 0x95a75439),
1083 TOBN(0x92ecc4d6, 0xefed021c), TOBN(0x09a9f9b0, 0x6a77339a),
1084 TOBN(0x87ca6b15, 0x7188c64a), TOBN(0x10c29968, 0x44899158),
1085 TOBN(0x5859a229, 0xed6e82ef), TOBN(0x16f338e3, 0x65ebaf4e),
1086 TOBN(0x0cd31387, 0x5ead67ae), TOBN(0x1c73d228, 0x54ef0bb4),
1087 TOBN(0x4cb55131, 0x74a5c8c7), TOBN(0x01cd2970, 0x7f69ad6a),
1088 TOBN(0xa04d00dd, 0xe966f87e), TOBN(0xd96fe447, 0x0b7b0321),
1089 TOBN(0x342ac06e, 0x88fbd381), TOBN(0x02cd4a84, 0x5c35a493),
1090 TOBN(0xe8fa89de, 0x54f1bbcd), TOBN(0x341d6367, 0x2575ed4c),
1091 TOBN(0xebe357fb, 0xd238202b), TOBN(0x600b4d1a, 0xa984ead9),
1092 TOBN(0xc35c9f44, 0x52436ea0), TOBN(0x96fe0a39, 0xa370751b),
1093 TOBN(0x4c4f0736, 0x7f636a38), TOBN(0x9f943fb7, 0x0e76d5cb),
1094 TOBN(0xb03510ba, 0xa8b68b8b), TOBN(0xc246780a, 0x9ed07a1f),
1095 TOBN(0x3c051415, 0x6d549fc2), TOBN(0xc2953f31, 0x607781ca),
1096 TOBN(0x955e2c69, 0xd8d95413), TOBN(0xb300fadc, 0x7bd282e3),
1097 TOBN(0x81fe7b50, 0x87e9189f), TOBN(0xdb17375c, 0xf42dda27),
1098 TOBN(0x22f7d896, 0xcf0a5904), TOBN(0xa0e57c5a, 0xebe348e6),
1099 TOBN(0xa61011d3, 0xf40e3c80), TOBN(0xb1189321, 0x8db705c5),
1100 TOBN(0x4ed9309e, 0x50fedec3), TOBN(0xdcf14a10, 0x4d6d5c1d),
1101 TOBN(0x056c265b, 0x55691342), TOBN(0xe8e08504, 0x91049dc7),
1102 TOBN(0x131329f5, 0xc9bae20a), TOBN(0x96c8b3e8, 0xd9dccdb4),
1103 TOBN(0x8c5ff838, 0xfb4ee6b4), TOBN(0xfc5a9aeb, 0x41e8ccf0),
1104 TOBN(0x7417b764, 0xfae050c6), TOBN(0x0953c3d7, 0x00452080),
1105 TOBN(0x21372682, 0x38dfe7e8), TOBN(0xea417e15, 0x2bb79d4b),
1106 TOBN(0x59641f1c, 0x76e7cf2d), TOBN(0x271e3059, 0xea0bcfcc),
1107 TOBN(0x624c7dfd, 0x7253ecbd), TOBN(0x2f552e25, 0x4fca6186),
1108 TOBN(0xcbf84ecd, 0x4d866e9c), TOBN(0x73967709, 0xf68d4610),
1109 TOBN(0xa14b1163, 0xc27901b4), TOBN(0xfd9236e0, 0x899b8bf3),
1110 TOBN(0x42b091ec, 0xcbc6da0a), TOBN(0xbb1dac6f, 0x5ad1d297),
1111 TOBN(0x80e61d53, 0xa91cf76e), TOBN(0x4110a412, 0xd31f1ee7),
1112 TOBN(0x2d87c3ba, 0x13efcf77), TOBN(0x1f374bb4, 0xdf450d76),
1113 TOBN(0x5e78e2f2, 0x0d188dab), TOBN(0xe3968ed0, 0xf4b885ef),
1114 TOBN(0x46c0568e, 0x7314570f), TOBN(0x31616338, 0x01170521),
1115 TOBN(0x18e1e7e2, 0x4f0c8afe), TOBN(0x4caa75ff, 0xdeea78da),
1116 TOBN(0x82db67f2, 0x7c5d8a51), TOBN(0x36a44d86, 0x6f505370),
1117 TOBN(0xd72c5bda, 0x0333974f), TOBN(0x5db516ae, 0x27a70146),
1118 TOBN(0x34705281, 0x210ef921), TOBN(0xbff17a8f, 0x0c9c38e5),
1119 TOBN(0x78f4814e, 0x12476da1), TOBN(0xc1e16613, 0x33c16980),
1120 TOBN(0x9e5b386f, 0x424d4bca), TOBN(0x4c274e87, 0xc85740de),
1121 TOBN(0xb6a9b88d, 0x6c2f5226), TOBN(0x14d1b944, 0x550d7ca8),
1122 TOBN(0x580c85fc, 0x1fc41709), TOBN(0xc1da368b, 0x54c6d519),
1123 TOBN(0x2b0785ce, 0xd5113cf7), TOBN(0x0670f633, 0x5a34708f),
1124 TOBN(0x46e23767, 0x15cc3f88), TOBN(0x1b480cfa, 0x50c72c8f),
1125 TOBN(0x20288602, 0x4147519a), TOBN(0xd0981eac, 0x26b372f0),
1126 TOBN(0xa9d4a7ca, 0xa785ebc8), TOBN(0xd953c50d, 0xdbdf58e9),
1127 TOBN(0x9d6361cc, 0xfd590f8f), TOBN(0x72e9626b, 0x44e6c917),
1128 TOBN(0x7fd96110, 0x22eb64cf), TOBN(0x863ebb7e, 0x9eb288f3),
1129 TOBN(0x6e6ab761, 0x6aca8ee7), TOBN(0x97d10b39, 0xd7b40358),
1130 TOBN(0x1687d377, 0x1e5feb0d), TOBN(0xc83e50e4, 0x8265a27a),
1131 TOBN(0x8f75a9fe, 0xc954b313), TOBN(0xcc2e8f47, 0x310d1f61),
1132 TOBN(0xf5ba81c5, 0x6557d0e0), TOBN(0x25f9680c, 0x3eaf6207),
1133 TOBN(0xf95c6609, 0x4354080b), TOBN(0x5225bfa5, 0x7bf2fe1c),
1134 TOBN(0xc5c004e2, 0x5c7d98fa), TOBN(0x3561bf1c, 0x019aaf60),
1135 TOBN(0x5e6f9f17, 0xba151474), TOBN(0xdec2f934, 0xb04f6eca),
1136 TOBN(0x64e368a1, 0x269acb1e), TOBN(0x1332d9e4, 0x0cdda493),
1137 TOBN(0x60d6cf69, 0xdf23de05), TOBN(0x66d17da2, 0x009339a0),
1138 TOBN(0x9fcac985, 0x0a693923), TOBN(0xbcf057fc, 0xed7c6a6d),
1139 TOBN(0xc3c5c8c5, 0xf0b5662c), TOBN(0x25318dd8, 0xdcba4f24),
1140 TOBN(0x60e8cb75, 0x082b69ff), TOBN(0x7c23b3ee, 0x1e728c01),
1141 TOBN(0x15e10a0a, 0x097e4403), TOBN(0xcb3d0a86, 0x19854665),
1142 TOBN(0x88d8e211, 0xd67d4826), TOBN(0xb39af66e, 0x0b9d2839),
1143 TOBN(0xa5f94588, 0xbd475ca8), TOBN(0xe06b7966, 0xc077b80b),
1144 TOBN(0xfedb1485, 0xda27c26c), TOBN(0xd290d33a, 0xfe0fd5e0),
1145 TOBN(0xa40bcc47, 0xf34fb0fa), TOBN(0xb4760cc8, 0x1fb1ab09),
1146 TOBN(0x8fca0993, 0xa273bfe3), TOBN(0x13e4fe07, 0xf70b213c),
1147 TOBN(0x3bcdb992, 0xfdb05163), TOBN(0x8c484b11, 0x0c2b19b6),
1148 TOBN(0x1acb815f, 0xaaf2e3e2), TOBN(0xc6905935, 0xb89ff1b4),
1149 TOBN(0xb2ad6f9d, 0x586e74e1), TOBN(0x488883ad, 0x67b80484),
1150 TOBN(0x758aa2c7, 0x369c3ddb), TOBN(0x8ab74e69, 0x9f9afd31),
1151 TOBN(0x10fc2d28, 0x5e21beb1), TOBN(0x3484518a, 0x318c42f9),
1152 TOBN(0x377427dc, 0x53cf40c3), TOBN(0x9de0781a, 0x391bc1d9),
1153 TOBN(0x8faee858, 0x693807e1), TOBN(0xa3865327, 0x4e81ccc7),
1154 TOBN(0x02c30ff2, 0x6f835b84), TOBN(0xb604437b, 0x0d3d38d4),
1155 TOBN(0xb3fc8a98, 0x5ca1823d), TOBN(0xb82f7ec9, 0x03be0324),
1156 TOBN(0xee36d761, 0xcf684a33), TOBN(0x5a01df0e, 0x9f29bf7d),
1157 TOBN(0x686202f3, 0x1306583d), TOBN(0x05b10da0, 0x437c622e),
1158 TOBN(0xbf9aaa0f, 0x076a7bc8), TOBN(0x25e94efb, 0x8f8f4e43),
1159 TOBN(0x8a35c9b7, 0xfa3dc26d), TOBN(0xe0e5fb93, 0x96ff03c5),
1160 TOBN(0xa77e3843, 0xebc394ce), TOBN(0xcede6595, 0x8361de60),
1161 TOBN(0xd27c22f6, 0xa1993545), TOBN(0xab01cc36, 0x24d671ba),
1162 TOBN(0x63fa2877, 0xa169c28e), TOBN(0x925ef904, 0x2eb08376),
1163 TOBN(0x3b2fa3cf, 0x53aa0b32), TOBN(0xb27beb5b, 0x71c49d7a),
1164 TOBN(0xb60e1834, 0xd105e27f), TOBN(0xd6089788, 0x4f68570d),
1165 TOBN(0x23094ce0, 0xd6fbc2ac), TOBN(0x738037a1, 0x815ff551),
1166 TOBN(0xda73b1bb, 0x6bef119c), TOBN(0xdcf6c430, 0xeef506ba),
1167 TOBN(0x00e4fe7b, 0xe3ef104a), TOBN(0xebdd9a2c, 0x0a065628),
1168 TOBN(0x853a81c3, 0x8792043e), TOBN(0x22ad6ece, 0xb3b59108),
1169 TOBN(0x9fb813c0, 0x39cd297d), TOBN(0x8ec7e16e, 0x05bda5d9),
1170 TOBN(0x2834797c, 0x0d104b96), TOBN(0xcc11a2e7, 0x7c511510),
1171 TOBN(0x96ca5a53, 0x96ee6380), TOBN(0x054c8655, 0xcea38742),
1172 TOBN(0xb5946852, 0xd54dfa7d), TOBN(0x97c422e7, 0x1f4ab207),
1173 TOBN(0xbf907509, 0x0c22b540), TOBN(0x2cde42aa, 0xb7c267d4),
1174 TOBN(0xba18f9ed, 0x5ab0d693), TOBN(0x3ba62aa6, 0x6e4660d9),
1175 TOBN(0xb24bf97b, 0xab9ea96a), TOBN(0x5d039642, 0xe3b60e32),
1176 TOBN(0x4e6a4506, 0x7c4d9bd5), TOBN(0x666c5b9e, 0x7ed4a6a4),
1177 TOBN(0xfa3fdcd9, 0x8edbd7cc), TOBN(0x4660bb87, 0xc6ccd753),
1178 TOBN(0x9ae90820, 0x21e6b64f), TOBN(0x8a56a713, 0xb36bfb3f),
1179 TOBN(0xabfce096, 0x5726d47f), TOBN(0x9eed01b2, 0x0b1a9a7f),
1180 TOBN(0x30e9cad4, 0x4eb74a37), TOBN(0x7b2524cc, 0x53e9666d),
1181 TOBN(0x6a29683b, 0x8f4b002f), TOBN(0xc2200d7a, 0x41f4fc20),
1182 TOBN(0xcf3af47a, 0x3a338acc), TOBN(0x6539a4fb, 0xe7128975),
1183 TOBN(0xcec31c14, 0xc33c7fcf), TOBN(0x7eb6799b, 0xc7be322b),
1184 TOBN(0x119ef4e9, 0x6646f623), TOBN(0x7b7a26a5, 0x54d7299b),
1185 TOBN(0xcb37f08d, 0x403f46f2), TOBN(0x94b8fc43, 0x1a0ec0c7),
1186 TOBN(0xbb8514e3, 0xc332142f), TOBN(0xf3ed2c33, 0xe80d2a7a),
1187 TOBN(0x8d2080af, 0xb639126c), TOBN(0xf7b6be60, 0xe3553ade),
1188 TOBN(0x3950aa9f, 0x1c7e2b09), TOBN(0x847ff958, 0x6410f02b),
1189 TOBN(0x877b7cf5, 0x678a31b0), TOBN(0xd50301ae, 0x3998b620),
1190 TOBN(0x734257c5, 0xc00fb396), TOBN(0xf9fb18a0, 0x04e672a6),
1191 TOBN(0xff8bd8eb, 0xe8758851), TOBN(0x1e64e4c6, 0x5d99ba44),
1192 TOBN(0x4b8eaedf, 0x7dfd93b7), TOBN(0xba2f2a98, 0x04e76b8c),
1193 TOBN(0x7d790cba, 0xe8053433), TOBN(0xc8e725a0, 0x3d2c9585),
1194 TOBN(0x58c5c476, 0xcdd8f5ed), TOBN(0xd106b952, 0xefa9fe1d),
1195 TOBN(0x3c5c775b, 0x0eff13a9), TOBN(0x242442ba, 0xe057b930),
1196 TOBN(0xe9f458d4, 0xc9b70cbd), TOBN(0x69b71448, 0xa3cdb89a),
1197 TOBN(0x41ee46f6, 0x0e2ed742), TOBN(0x573f1045, 0x40067493),
1198 TOBN(0xb1e154ff, 0x9d54c304), TOBN(0x2ad0436a, 0x8d3a7502),
1199 TOBN(0xee4aaa2d, 0x431a8121), TOBN(0xcd38b3ab, 0x886f11ed),
1200 TOBN(0x57d49ea6, 0x034a0eb7), TOBN(0xd2b773bd, 0xf7e85e58),
1201 TOBN(0x4a559ac4, 0x9b5c1f14), TOBN(0xc444be1a, 0x3e54df2b),
1202 TOBN(0x13aad704, 0xeda41891), TOBN(0xcd927bec, 0x5eb5c788),
1203 TOBN(0xeb3c8516, 0xe48c8a34), TOBN(0x1b7ac812, 0x4b546669),
1204 TOBN(0x1815f896, 0x594df8ec), TOBN(0x87c6a79c, 0x79227865),
1205 TOBN(0xae02a2f0, 0x9b56ddbd), TOBN(0x1339b5ac, 0x8a2f1cf3),
1206 TOBN(0xf2b569c7, 0x839dff0d), TOBN(0xb0b9e864, 0xfee9a43d),
1207 TOBN(0x4ff8ca41, 0x77bb064e), TOBN(0x145a2812, 0xfd249f63),
1208 TOBN(0x3ab7beac, 0xf86f689a), TOBN(0x9bafec27, 0x01d35f5e),
1209 TOBN(0x28054c65, 0x4265aa91), TOBN(0xa4b18304, 0x035efe42),
1210 TOBN(0x6887b0e6, 0x9639dec7), TOBN(0xf4b8f6ad, 0x3d52aea5),
1211 TOBN(0xfb9293cc, 0x971a8a13), TOBN(0x3f159e5d, 0x4c934d07),
1212 TOBN(0x2c50e9b1, 0x09acbc29), TOBN(0x08eb65e6, 0x7154d129),
1213 TOBN(0x4feff589, 0x30b75c3e), TOBN(0x0bb82fe2, 0x94491c93),
1214 TOBN(0xd8ac377a, 0x89af62bb), TOBN(0xd7b51490, 0x9685e49f),
1215 TOBN(0xabca9a7b, 0x04497f19), TOBN(0x1b35ed0a, 0x1a7ad13f),
1216 TOBN(0x6b601e21, 0x3ec86ed6), TOBN(0xda91fcb9, 0xce0c76f1),
1217 TOBN(0x9e28507b, 0xd7ab27e1), TOBN(0x7c19a555, 0x63945b7b),
1218 TOBN(0x6b43f0a1, 0xaafc9827), TOBN(0x443b4fbd, 0x3aa55b91),
1219 TOBN(0x962b2e65, 0x6962c88f), TOBN(0x139da8d4, 0xce0db0ca),
1220 TOBN(0xb93f05dd, 0x1b8d6c4f), TOBN(0x779cdff7, 0x180b9824),
1221 TOBN(0xbba23fdd, 0xae57c7b7), TOBN(0x345342f2, 0x1b932522),
1222 TOBN(0xfd9c80fe, 0x556d4aa3), TOBN(0xa03907ba, 0x6525bb61),
1223 TOBN(0x38b010e1, 0xff218933), TOBN(0xc066b654, 0xaa52117b),
1224 TOBN(0x8e141920, 0x94f2e6ea), TOBN(0x66a27dca, 0x0d32f2b2),
1225 TOBN(0x69c7f993, 0x048b3717), TOBN(0xbf5a989a, 0xb178ae1c),
1226 TOBN(0x49fa9058, 0x564f1d6b), TOBN(0x27ec6e15, 0xd31fde4e),
1227 TOBN(0x4cce0373, 0x7276e7fc), TOBN(0x64086d79, 0x89d6bf02),
1228 TOBN(0x5a72f046, 0x4ccdd979), TOBN(0x909c3566, 0x47775631),
1229 TOBN(0x1c07bc6b, 0x75dd7125), TOBN(0xb4c6bc97, 0x87a0428d),
1230 TOBN(0x507ece52, 0xfdeb6b9d), TOBN(0xfca56512, 0xb2c95432),
1231 TOBN(0x15d97181, 0xd0e8bd06), TOBN(0x384dd317, 0xc6bb46ea),
1232 TOBN(0x5441ea20, 0x3952b624), TOBN(0xbcf70dee, 0x4e7dc2fb),
1233 TOBN(0x372b016e, 0x6628e8c3), TOBN(0x07a0d667, 0xb60a7522),
1234 TOBN(0xcf05751b, 0x0a344ee2), TOBN(0x0ec09a48, 0x118bdeec),
1235 TOBN(0x6e4b3d4e, 0xd83dce46), TOBN(0x43a6316d, 0x99d2fc6e),
1236 TOBN(0xa99d8989, 0x56cf044c), TOBN(0x7c7f4454, 0xae3e5fb7),
1237 TOBN(0xb2e6b121, 0xfbabbe92), TOBN(0x281850fb, 0xe1330076),
1238 TOBN(0x093581ec, 0x97890015), TOBN(0x69b1dded, 0x75ff77f5),
1239 TOBN(0x7cf0b18f, 0xab105105), TOBN(0x953ced31, 0xa89ccfef),
1240 TOBN(0x3151f85f, 0xeb914009), TOBN(0x3c9f1b87, 0x88ed48ad),
1241 TOBN(0xc9aba1a1, 0x4a7eadcb), TOBN(0x928e7501, 0x522e71cf),
1242 TOBN(0xeaede727, 0x3a2e4f83), TOBN(0x467e10d1, 0x1ce3bbd3),
1243 TOBN(0xf3442ac3, 0xb955dcf0), TOBN(0xba96307d, 0xd3d5e527),
1244 TOBN(0xf763a10e, 0xfd77f474), TOBN(0x5d744bd0, 0x6a6e1ff0),
1245 TOBN(0xd287282a, 0xa777899e), TOBN(0xe20eda8f, 0xd03f3cde),
1246 TOBN(0x6a7e75bb, 0x50b07d31), TOBN(0x0b7e2a94, 0x6f379de4),
1247 TOBN(0x31cb64ad, 0x19f593cf), TOBN(0x7b1a9e4f, 0x1e76ef1d),
1248 TOBN(0xe18c9c9d, 0xb62d609c), TOBN(0x439bad6d, 0xe779a650),
1249 TOBN(0x219d9066, 0xe032f144), TOBN(0x1db632b8, 0xe8b2ec6a),
1250 TOBN(0xff0d0fd4, 0xfda12f78), TOBN(0x56fb4c2d, 0x2a25d265),
1251 TOBN(0x5f4e2ee1, 0x255a03f1), TOBN(0x61cd6af2, 0xe96af176),
1252 TOBN(0xe0317ba8, 0xd068bc97), TOBN(0x927d6bab, 0x264b988e),
1253 TOBN(0xa18f07e0, 0xe90fb21e), TOBN(0x00fd2b80, 0xbba7fca1),
1254 TOBN(0x20387f27, 0x95cd67b5), TOBN(0x5b89a4e7, 0xd39707f7),
1255 TOBN(0x8f83ad3f, 0x894407ce), TOBN(0xa0025b94, 0x6c226132),
1256 TOBN(0xc79563c7, 0xf906c13b), TOBN(0x5f548f31, 0x4e7bb025),
1257 TOBN(0x2b4c6b8f, 0xeac6d113), TOBN(0xa67e3f9c, 0x0e813c76),
1258 TOBN(0x3982717c, 0x3fe1f4b9), TOBN(0x58865819, 0x26d8050e),
1259 TOBN(0x99f3640c, 0xf7f06f20), TOBN(0xdc610216, 0x2a66ebc2),
1260 TOBN(0x52f2c175, 0x767a1e08), TOBN(0x05660e1a, 0x5999871b),
1261 TOBN(0x6b0f1762, 0x6d3c4693), TOBN(0xf0e7d627, 0x37ed7bea),
1262 TOBN(0xc51758c7, 0xb75b226d), TOBN(0x40a88628, 0x1f91613b),
1263 TOBN(0x889dbaa7, 0xbbb38ce0), TOBN(0xe0404b65, 0xbddcad81),
1264 TOBN(0xfebccd3a, 0x8bc9671f), TOBN(0xfbf9a357, 0xee1f5375),
1265 TOBN(0x5dc169b0, 0x28f33398), TOBN(0xb07ec11d, 0x72e90f65),
1266 TOBN(0xae7f3b4a, 0xfaab1eb1), TOBN(0xd970195e, 0x5f17538a),
1267 TOBN(0x52b05cbe, 0x0181e640), TOBN(0xf5debd62, 0x2643313d),
1268 TOBN(0x76148154, 0x5df31f82), TOBN(0x23e03b33, 0x3a9e13c5),
1269 TOBN(0xff758949, 0x4fde0c1f), TOBN(0xbf8a1abe, 0xe5b6ec20),
1270 TOBN(0x702278fb, 0x87e1db6c), TOBN(0xc447ad7a, 0x35ed658f),
1271 TOBN(0x48d4aa38, 0x03d0ccf2), TOBN(0x80acb338, 0x819a7c03),
1272 TOBN(0x9bc7c89e, 0x6e17cecc), TOBN(0x46736b8b, 0x03be1d82),
1273 TOBN(0xd65d7b60, 0xc0432f96), TOBN(0xddebe7a3, 0xdeb5442f),
1274 TOBN(0x79a25307, 0x7dff69a2), TOBN(0x37a56d94, 0x02cf3122),
1275 TOBN(0x8bab8aed, 0xf2350d0a), TOBN(0x13c3f276, 0x037b0d9a),
1276 TOBN(0xc664957c, 0x44c65cae), TOBN(0x88b44089, 0xc2e71a88),
1277 TOBN(0xdb88e5a3, 0x5cb02664), TOBN(0x5d4c0bf1, 0x8686c72e),
1278 TOBN(0xea3d9b62, 0xa682d53e), TOBN(0x9b605ef4, 0x0b2ad431),
1279 TOBN(0x71bac202, 0xc69645d0), TOBN(0xa115f03a, 0x6a1b66e7),
1280 TOBN(0xfe2c563a, 0x158f4dc4), TOBN(0xf715b3a0, 0x4d12a78c),
1281 TOBN(0x8f7f0a48, 0xd413213a), TOBN(0x2035806d, 0xc04becdb),
1282 TOBN(0xecd34a99, 0x5d8587f5), TOBN(0x4d8c3079, 0x9f6d3a71),
1283 TOBN(0x1b2a2a67, 0x8d95a8f6), TOBN(0xc58c9d7d, 0xf2110d0d),
1284 TOBN(0xdeee81d5, 0xcf8fba3f), TOBN(0xa42be3c0, 0x0c7cdf68),
1285 TOBN(0x2126f742, 0xd43b5eaa), TOBN(0x054a0766, 0xdfa59b85),
1286 TOBN(0x9d0d5e36, 0x126bfd45), TOBN(0xa1f8fbd7, 0x384f8a8f),
1287 TOBN(0x317680f5, 0xd563fccc), TOBN(0x48ca5055, 0xf280a928),
1288 TOBN(0xe00b81b2, 0x27b578cf), TOBN(0x10aad918, 0x2994a514),
1289 TOBN(0xd9e07b62, 0xb7bdc953), TOBN(0x9f0f6ff2, 0x5bc086dd),
1290 TOBN(0x09d1ccff, 0x655eee77), TOBN(0x45475f79, 0x5bef7df1),
1291 TOBN(0x3faa28fa, 0x86f702cc), TOBN(0x92e60905, 0x0f021f07),
1292 TOBN(0xe9e62968, 0x7f8fa8c6), TOBN(0xbd71419a, 0xf036ea2c),
1293 TOBN(0x171ee1cc, 0x6028da9a), TOBN(0x5352fe1a, 0xc251f573),
1294 TOBN(0xf8ff236e, 0x3fa997f4), TOBN(0xd831b6c9, 0xa5749d5f),
1295 TOBN(0x7c872e1d, 0xe350e2c2), TOBN(0xc56240d9, 0x1e0ce403),
1296 TOBN(0xf9deb077, 0x6974f5cb), TOBN(0x7d50ba87, 0x961c3728),
1297 TOBN(0xd6f89426, 0x5a3a2518), TOBN(0xcf817799, 0xc6303d43),
1298 TOBN(0x510a0471, 0x619e5696), TOBN(0xab049ff6, 0x3a5e307b),
1299 TOBN(0xe4cdf9b0, 0xfeb13ec7), TOBN(0xd5e97117, 0x9d8ff90c),
1300 TOBN(0xf6f64d06, 0x9afa96af), TOBN(0x00d0bf5e, 0x9d2012a2),
1301 TOBN(0xe63f301f, 0x358bcdc0), TOBN(0x07689e99, 0x0a9d47f8),
1302 TOBN(0x1f689e2f, 0x4f43d43a), TOBN(0x4d542a16, 0x90920904),
1303 TOBN(0xaea293d5, 0x9ca0a707), TOBN(0xd061fe45, 0x8ac68065),
1304 TOBN(0x1033bf1b, 0x0090008c), TOBN(0x29749558, 0xc08a6db6),
1305 TOBN(0x74b5fc59, 0xc1d5d034), TOBN(0xf712e9f6, 0x67e215e0),
1306 TOBN(0xfd520cbd, 0x860200e6), TOBN(0x0229acb4, 0x3ea22588),
1307 TOBN(0x9cd1e14c, 0xfff0c82e), TOBN(0x87684b62, 0x59c69e73),
1308 TOBN(0xda85e61c, 0x96ccb989), TOBN(0x2d5dbb02, 0xa3d06493),
1309 TOBN(0xf22ad33a, 0xe86b173c), TOBN(0xe8e41ea5, 0xa79ff0e3),
1310 TOBN(0x01d2d725, 0xdd0d0c10), TOBN(0x31f39088, 0x032d28f9),
1311 TOBN(0x7b3f71e1, 0x7829839e), TOBN(0x0cf691b4, 0x4502ae58),
1312 TOBN(0xef658dbd, 0xbefc6115), TOBN(0xa5cd6ee5, 0xb3ab5314),
1313 TOBN(0x206c8d7b, 0x5f1d2347), TOBN(0x794645ba, 0x4cc2253a),
1314 TOBN(0xd517d8ff, 0x58389e08), TOBN(0x4fa20dee, 0x9f847288),
1315 TOBN(0xeba072d8, 0xd797770a), TOBN(0x7360c91d, 0xbf429e26),
1316 TOBN(0x7200a3b3, 0x80af8279), TOBN(0x6a1c9150, 0x82dadce3),
1317 TOBN(0x0ee6d3a7, 0xc35d8794), TOBN(0x042e6558, 0x0356bae5),
1318 TOBN(0x9f59698d, 0x643322fd), TOBN(0x9379ae15, 0x50a61967),
1319 TOBN(0x64b9ae62, 0xfcc9981e), TOBN(0xaed3d631, 0x6d2934c6),
1320 TOBN(0x2454b302, 0x5e4e65eb), TOBN(0xab09f647, 0xf9950428)},
1321 {TOBN(0xb2083a12, 0x22248acc), TOBN(0x1f6ec0ef, 0x3264e366),
1322 TOBN(0x5659b704, 0x5afdee28), TOBN(0x7a823a40, 0xe6430bb5),
1323 TOBN(0x24592a04, 0xe1900a79), TOBN(0xcde09d4a, 0xc9ee6576),
1324 TOBN(0x52b6463f, 0x4b5ea54a), TOBN(0x1efe9ed3, 0xd3ca65a7),
1325 TOBN(0xe27a6dbe, 0x305406dd), TOBN(0x8eb7dc7f, 0xdd5d1957),
1326 TOBN(0xf54a6876, 0x387d4d8f), TOBN(0x9c479409, 0xc7762de4),
1327 TOBN(0xbe4d5b5d, 0x99b30778), TOBN(0x25380c56, 0x6e793682),
1328 TOBN(0x602d37f3, 0xdac740e3), TOBN(0x140deabe, 0x1566e4ae),
1329 TOBN(0x4481d067, 0xafd32acf), TOBN(0xd8f0fcca, 0xe1f71ccf),
1330 TOBN(0xd208dd0c, 0xb596f2da), TOBN(0xd049d730, 0x9aad93f9),
1331 TOBN(0xc79f263d, 0x42ab580e), TOBN(0x09411bb1, 0x23f707b4),
1332 TOBN(0x8cfde1ff, 0x835e0eda), TOBN(0x72707490, 0x90f03402),
1333 TOBN(0xeaee6126, 0xc49a861e), TOBN(0x024f3b65, 0xe14f0d06),
1334 TOBN(0x51a3f1e8, 0xc69bfc17), TOBN(0xc3c3a8e9, 0xa7686381),
1335 TOBN(0x3400752c, 0xb103d4c8), TOBN(0x02bc4613, 0x9218b36b),
1336 TOBN(0xc67f75eb, 0x7651504a), TOBN(0xd6848b56, 0xd02aebfa),
1337 TOBN(0xbd9802e6, 0xc30fa92b), TOBN(0x5a70d96d, 0x9a552784),
1338 TOBN(0x9085c4ea, 0x3f83169b), TOBN(0xfa9423bb, 0x06908228),
1339 TOBN(0x2ffebe12, 0xfe97a5b9), TOBN(0x85da6049, 0x71b99118),
1340 TOBN(0x9cbc2f7f, 0x63178846), TOBN(0xfd96bc70, 0x9153218e),
1341 TOBN(0x958381db, 0x1782269b), TOBN(0xae34bf79, 0x2597e550),
1342 TOBN(0xbb5c6064, 0x5f385153), TOBN(0x6f0e96af, 0xe3088048),
1343 TOBN(0xbf6a0215, 0x77884456), TOBN(0xb3b5688c, 0x69310ea7),
1344 TOBN(0x17c94295, 0x04fad2de), TOBN(0xe020f0e5, 0x17896d4d),
1345 TOBN(0x730ba0ab, 0x0976505f), TOBN(0x567f6813, 0x095e2ec5),
1346 TOBN(0x47062010, 0x6331ab71), TOBN(0x72cfa977, 0x41d22b9f),
1347 TOBN(0x33e55ead, 0x8a2373da), TOBN(0xa8d0d5f4, 0x7ba45a68),
1348 TOBN(0xba1d8f9c, 0x03029d15), TOBN(0x8f34f1cc, 0xfc55b9f3),
1349 TOBN(0xcca4428d, 0xbbe5a1a9), TOBN(0x8187fd5f, 0x3126bd67),
1350 TOBN(0x0036973a, 0x48105826), TOBN(0xa39b6663, 0xb8bd61a0),
1351 TOBN(0x6d42deef, 0x2d65a808), TOBN(0x4969044f, 0x94636b19),
1352 TOBN(0xf611ee47, 0xdd5d564c), TOBN(0x7b2f3a49, 0xd2873077),
1353 TOBN(0x94157d45, 0x300eb294), TOBN(0x2b2a656e, 0x169c1494),
1354 TOBN(0xc000dd76, 0xd3a47aa9), TOBN(0xa2864e4f, 0xa6243ea4),
1355 TOBN(0x82716c47, 0xdb89842e), TOBN(0x12dfd7d7, 0x61479fb7),
1356 TOBN(0x3b9a2c56, 0xe0b2f6dc), TOBN(0x46be862a, 0xd7f85d67),
1357 TOBN(0x03b0d8dd, 0x0f82b214), TOBN(0x460c34f9, 0xf103cbc6),
1358 TOBN(0xf32e5c03, 0x18d79e19), TOBN(0x8b8888ba, 0xa84117f8),
1359 TOBN(0x8f3c37dc, 0xc0722677), TOBN(0x10d21be9, 0x1c1c0f27),
1360 TOBN(0xd47c8468, 0xe0f7a0c6), TOBN(0x9bf02213, 0xadecc0e0),
1361 TOBN(0x0baa7d12, 0x42b48b99), TOBN(0x1bcb665d, 0x48424096),
1362 TOBN(0x8b847cd6, 0xebfb5cfb), TOBN(0x87c2ae56, 0x9ad4d10d),
1363 TOBN(0xf1cbb122, 0x0de36726), TOBN(0xe7043c68, 0x3fdfbd21),
1364 TOBN(0x4bd0826a, 0x4e79d460), TOBN(0x11f5e598, 0x4bd1a2cb),
1365 TOBN(0x97554160, 0xb7fe7b6e), TOBN(0x7d16189a, 0x400a3fb2),
1366 TOBN(0xd73e9bea, 0xe328ca1e), TOBN(0x0dd04b97, 0xe793d8cc),
1367 TOBN(0xa9c83c9b, 0x506db8cc), TOBN(0x5cd47aae, 0xcf38814c),
1368 TOBN(0x26fc430d, 0xb64b45e6), TOBN(0x079b5499, 0xd818ea84),
1369 TOBN(0xebb01102, 0xc1c24a3b), TOBN(0xca24e568, 0x1c161c1a),
1370 TOBN(0x103eea69, 0x36f00a4a), TOBN(0x9ad76ee8, 0x76176c7b),
1371 TOBN(0x97451fc2, 0x538e0ff7), TOBN(0x94f89809, 0x6604b3b0),
1372 TOBN(0x6311436e, 0x3249cfd7), TOBN(0x27b4a7bd, 0x41224f69),
1373 TOBN(0x03b5d21a, 0xe0ac2941), TOBN(0x279b0254, 0xc2d31937),
1374 TOBN(0x3307c052, 0xcac992d0), TOBN(0x6aa7cb92, 0xefa8b1f3),
1375 TOBN(0x5a182580, 0x0d37c7a5), TOBN(0x13380c37, 0x342d5422),
1376 TOBN(0x92ac2d66, 0xd5d2ef92), TOBN(0x035a70c9, 0x030c63c6),
1377 TOBN(0xc16025dd, 0x4ce4f152), TOBN(0x1f419a71, 0xf9df7c06),
1378 TOBN(0x6d5b2214, 0x91e4bb14), TOBN(0xfc43c6cc, 0x839fb4ce),
1379 TOBN(0x49f06591, 0x925d6b2d), TOBN(0x4b37d9d3, 0x62186598),
1380 TOBN(0x8c54a971, 0xd01b1629), TOBN(0xe1a9c29f, 0x51d50e05),
1381 TOBN(0x5109b785, 0x71ba1861), TOBN(0x48b22d5c, 0xd0c8f93d),
1382 TOBN(0xe8fa84a7, 0x8633bb93), TOBN(0x53fba6ba, 0x5aebbd08),
1383 TOBN(0x7ff27df3, 0xe5eea7d8), TOBN(0x521c8796, 0x68ca7158),
1384 TOBN(0xb9d5133b, 0xce6f1a05), TOBN(0x2d50cd53, 0xfd0ebee4),
1385 TOBN(0xc82115d6, 0xc5a3ef16), TOBN(0x993eff9d, 0xba079221),
1386 TOBN(0xe4da2c5e, 0x4b5da81c), TOBN(0x9a89dbdb, 0x8033fd85),
1387 TOBN(0x60819ebf, 0x2b892891), TOBN(0x53902b21, 0x5d14a4d5),
1388 TOBN(0x6ac35051, 0xd7fda421), TOBN(0xcc6ab885, 0x61c83284),
1389 TOBN(0x14eba133, 0xf74cff17), TOBN(0x240aaa03, 0xecb813f2),
1390 TOBN(0xcfbb6540, 0x6f665bee), TOBN(0x084b1fe4, 0xa425ad73),
1391 TOBN(0x009d5d16, 0xd081f6a6), TOBN(0x35304fe8, 0xeef82c90),
1392 TOBN(0xf20346d5, 0xaa9eaa22), TOBN(0x0ada9f07, 0xac1c91e3),
1393 TOBN(0xa6e21678, 0x968a6144), TOBN(0x54c1f77c, 0x07b31a1e),
1394 TOBN(0xd6bb787e, 0x5781fbe1), TOBN(0x61bd2ee0, 0xe31f1c4a),
1395 TOBN(0xf25aa1e9, 0x781105fc), TOBN(0x9cf2971f, 0x7b2f8e80),
1396 TOBN(0x26d15412, 0xcdff919b), TOBN(0x01db4ebe, 0x34bc896e),
1397 TOBN(0x7d9b3e23, 0xb40df1cf), TOBN(0x59337373, 0x94e971b4),
1398 TOBN(0xbf57bd14, 0x669cf921), TOBN(0x865daedf, 0x0c1a1064),
1399 TOBN(0x3eb70bd3, 0x83279125), TOBN(0xbc3d5b9f, 0x34ecdaab),
1400 TOBN(0x91e3ed7e, 0x5f755caf), TOBN(0x49699f54, 0xd41e6f02),
1401 TOBN(0x185770e1, 0xd4a7a15b), TOBN(0x08f3587a, 0xeaac87e7),
1402 TOBN(0x352018db, 0x473133ea), TOBN(0x674ce719, 0x04fd30fc),
1403 TOBN(0x7b8d9835, 0x088b3e0e), TOBN(0x7a0356a9, 0x5d0d47a1),
1404 TOBN(0x9d9e7659, 0x6474a3c4), TOBN(0x61ea48a7, 0xff66966c),
1405 TOBN(0x30417758, 0x0f3e4834), TOBN(0xfdbb21c2, 0x17a9afcb),
1406 TOBN(0x756fa17f, 0x2f9a67b3), TOBN(0x2a6b2421, 0xa245c1a8),
1407 TOBN(0x64be2794, 0x4af02291), TOBN(0xade465c6, 0x2a5804fe),
1408 TOBN(0x8dffbd39, 0xa6f08fd7), TOBN(0xc4efa84c, 0xaa14403b),
1409 TOBN(0xa1b91b2a, 0x442b0f5c), TOBN(0xb748e317, 0xcf997736),
1410 TOBN(0x8d1b62bf, 0xcee90e16), TOBN(0x907ae271, 0x0b2078c0),
1411 TOBN(0xdf31534b, 0x0c9bcddd), TOBN(0x043fb054, 0x39adce83),
1412 TOBN(0x99031043, 0xd826846a), TOBN(0x61a9c0d6, 0xb144f393),
1413 TOBN(0xdab48046, 0x47718427), TOBN(0xdf17ff9b, 0x6e830f8b),
1414 TOBN(0x408d7ee8, 0xe49a1347), TOBN(0x6ac71e23, 0x91c1d4ae),
1415 TOBN(0xc8cbb9fd, 0x1defd73c), TOBN(0x19840657, 0xbbbbfec5),
1416 TOBN(0x39db1cb5, 0x9e7ef8ea), TOBN(0x78aa8296, 0x64105f30),
1417 TOBN(0xa3d9b7f0, 0xa3738c29), TOBN(0x0a2f235a, 0xbc3250a3),
1418 TOBN(0x55e506f6, 0x445e4caf), TOBN(0x0974f73d, 0x33475f7a),
1419 TOBN(0xd37dbba3, 0x5ba2f5a8), TOBN(0x542c6e63, 0x6af40066),
1420 TOBN(0x26d99b53, 0xc5d73e2c), TOBN(0x06060d7d, 0x6c3ca33e),
1421 TOBN(0xcdbef1c2, 0x065fef4a), TOBN(0x77e60f7d, 0xfd5b92e3),
1422 TOBN(0xd7c549f0, 0x26708350), TOBN(0x201b3ad0, 0x34f121bf),
1423 TOBN(0x5fcac2a1, 0x0334fc14), TOBN(0x8a9a9e09, 0x344552f6),
1424 TOBN(0x7dd8a1d3, 0x97653082), TOBN(0x5fc0738f, 0x79d4f289),
1425 TOBN(0x787d244d, 0x17d2d8c3), TOBN(0xeffc6345, 0x70830684),
1426 TOBN(0x5ddb96dd, 0xe4f73ae5), TOBN(0x8efb14b1, 0x172549a5),
1427 TOBN(0x6eb73eee, 0x2245ae7a), TOBN(0xbca4061e, 0xea11f13e),
1428 TOBN(0xb577421d, 0x30b01f5d), TOBN(0xaa688b24, 0x782e152c),
1429 TOBN(0x67608e71, 0xbd3502ba), TOBN(0x4ef41f24, 0xb4de75a0),
1430 TOBN(0xb08dde5e, 0xfd6125e5), TOBN(0xde484825, 0xa409543f),
1431 TOBN(0x1f198d98, 0x65cc2295), TOBN(0x428a3771, 0x6e0edfa2),
1432 TOBN(0x4f9697a2, 0xadf35fc7), TOBN(0x01a43c79, 0xf7cac3c7),
1433 TOBN(0xb05d7059, 0x0fd3659a), TOBN(0x8927f30c, 0xbb7f2d9a),
1434 TOBN(0x4023d1ac, 0x8cf984d3), TOBN(0x32125ed3, 0x02897a45),
1435 TOBN(0xfb572dad, 0x3d414205), TOBN(0x73000ef2, 0xe3fa82a9),
1436 TOBN(0x4c0868e9, 0xf10a5581), TOBN(0x5b61fc67, 0x6b0b3ca5),
1437 TOBN(0xc1258d5b, 0x7cae440c), TOBN(0x21c08b41, 0x402b7531),
1438 TOBN(0xf61a8955, 0xde932321), TOBN(0x3568faf8, 0x2d1408af),
1439 TOBN(0x71b15e99, 0x9ecf965b), TOBN(0xf14ed248, 0xe917276f),
1440 TOBN(0xc6f4caa1, 0x820cf9e2), TOBN(0x681b20b2, 0x18d83c7e),
1441 TOBN(0x6cde738d, 0xc6c01120), TOBN(0x71db0813, 0xae70e0db),
1442 TOBN(0x95fc0644, 0x74afe18c), TOBN(0x34619053, 0x129e2be7),
1443 TOBN(0x80615cea, 0xdb2a3b15), TOBN(0x0a49a19e, 0xdb4c7073),
1444 TOBN(0x0e1b84c8, 0x8fd2d367), TOBN(0xd74bf462, 0x033fb8aa),
1445 TOBN(0x889f6d65, 0x533ef217), TOBN(0x7158c7e4, 0xc3ca2e87),
1446 TOBN(0xfb670dfb, 0xdc2b4167), TOBN(0x75910a01, 0x844c257f),
1447 TOBN(0xf336bf07, 0xcf88577d), TOBN(0x22245250, 0xe45e2ace),
1448 TOBN(0x2ed92e8d, 0x7ca23d85), TOBN(0x29f8be4c, 0x2b812f58),
1449 TOBN(0xdd9ebaa7, 0x076fe12b), TOBN(0x3f2400cb, 0xae1537f9),
1450 TOBN(0x1aa93528, 0x17bdfb46), TOBN(0xc0f98430, 0x67883b41),
1451 TOBN(0x5590ede1, 0x0170911d), TOBN(0x7562f5bb, 0x34d4b17f),
1452 TOBN(0xe1fa1df2, 0x1826b8d2), TOBN(0xb40b796a, 0x6bd80d59),
1453 TOBN(0xd65bf197, 0x3467ba92), TOBN(0x8c9b46db, 0xf70954b0),
1454 TOBN(0x97c8a0f3, 0x0e78f15d), TOBN(0xa8f3a69a, 0x85a4c961),
1455 TOBN(0x4242660f, 0x61e4ce9b), TOBN(0xbf06aab3, 0x6ea6790c),
1456 TOBN(0xc6706f8e, 0xec986416), TOBN(0x9e56dec1, 0x9a9fc225),
1457 TOBN(0x527c46f4, 0x9a9898d9), TOBN(0xd799e77b, 0x5633cdef),
1458 TOBN(0x24eacc16, 0x7d9e4297), TOBN(0xabb61cea, 0x6b1cb734),
1459 TOBN(0xbee2e8a7, 0xf778443c), TOBN(0x3bb42bf1, 0x29de2fe6),
1460 TOBN(0xcbed86a1, 0x3003bb6f), TOBN(0xd3918e6c, 0xd781cdf6),
1461 TOBN(0x4bee3271, 0x9a5103f1), TOBN(0x5243efc6, 0xf50eac06),
1462 TOBN(0xb8e122cb, 0x6adcc119), TOBN(0x1b7faa84, 0xc0b80a08),
1463 TOBN(0x32c3d1bd, 0x6dfcd08c), TOBN(0x129dec4e, 0x0be427de),
1464 TOBN(0x98ab679c, 0x1d263c83), TOBN(0xafc83cb7, 0xcef64eff),
1465 TOBN(0x85eb6088, 0x2fa6be76), TOBN(0x892585fb, 0x1328cbfe),
1466 TOBN(0xc154d3ed, 0xcf618dda), TOBN(0xc44f601b, 0x3abaf26e),
1467 TOBN(0x7bf57d0b, 0x2be1fdfd), TOBN(0xa833bd2d, 0x21137fee),
1468 TOBN(0x9353af36, 0x2db591a8), TOBN(0xc76f26dc, 0x5562a056),
1469 TOBN(0x1d87e47d, 0x3fdf5a51), TOBN(0x7afb5f93, 0x55c9cab0),
1470 TOBN(0x91bbf58f, 0x89e0586e), TOBN(0x7c72c018, 0x0d843709),
1471 TOBN(0xa9a5aafb, 0x99b5c3dc), TOBN(0xa48a0f1d, 0x3844aeb0),
1472 TOBN(0x7178b7dd, 0xb667e482), TOBN(0x453985e9, 0x6e23a59a),
1473 TOBN(0x4a54c860, 0x01b25dd8), TOBN(0x0dd37f48, 0xfb897c8a),
1474 TOBN(0x5f8aa610, 0x0ea90cd9), TOBN(0xc8892c68, 0x16d5830d),
1475 TOBN(0xeb4befc0, 0xef514ca5), TOBN(0x478eb679, 0xe72c9ee6),
1476 TOBN(0x9bca20da, 0xdbc40d5f), TOBN(0xf015de21, 0xdde4f64a),
1477 TOBN(0xaa6a4de0, 0xeaf4b8a5), TOBN(0x68cfd9ca, 0x4bc60e32),
1478 TOBN(0x668a4b01, 0x7fd15e70), TOBN(0xd9f0694a, 0xf27dc09d),
1479 TOBN(0xf6c3cad5, 0xba708bcd), TOBN(0x5cd2ba69, 0x5bb95c2a),
1480 TOBN(0xaa28c1d3, 0x33c0a58f), TOBN(0x23e274e3, 0xabc77870),
1481 TOBN(0x44c3692d, 0xdfd20a4a), TOBN(0x091c5fd3, 0x81a66653),
1482 TOBN(0x6c0bb691, 0x09a0757d), TOBN(0x9072e8b9, 0x667343ea),
1483 TOBN(0x31d40eb0, 0x80848bec), TOBN(0x95bd480a, 0x79fd36cc),
1484 TOBN(0x01a77c61, 0x65ed43f5), TOBN(0xafccd127, 0x2e0d40bf),
1485 TOBN(0xeccfc82d, 0x1cc1884b), TOBN(0xc85ac201, 0x5d4753b4),
1486 TOBN(0xc7a6caac, 0x658e099f), TOBN(0xcf46369e, 0x04b27390),
1487 TOBN(0xe2e7d049, 0x506467ea), TOBN(0x481b63a2, 0x37cdeccc),
1488 TOBN(0x4029abd8, 0xed80143a), TOBN(0x28bfe3c7, 0xbcb00b88),
1489 TOBN(0x3bec1009, 0x0643d84a), TOBN(0x885f3668, 0xabd11041),
1490 TOBN(0xdb02432c, 0xf83a34d6), TOBN(0x32f7b360, 0x719ceebe),
1491 TOBN(0xf06c7837, 0xdad1fe7a), TOBN(0x60a157a9, 0x5441a0b0),
1492 TOBN(0x704970e9, 0xe2d47550), TOBN(0xcd2bd553, 0x271b9020),
1493 TOBN(0xff57f82f, 0x33e24a0b), TOBN(0x9cbee23f, 0xf2565079),
1494 TOBN(0x16353427, 0xeb5f5825), TOBN(0x276feec4, 0xe948d662),
1495 TOBN(0xd1b62bc6, 0xda10032b), TOBN(0x718351dd, 0xf0e72a53),
1496 TOBN(0x93452076, 0x2420e7ba), TOBN(0x96368fff, 0x3a00118d),
1497 TOBN(0x00ce2d26, 0x150a49e4), TOBN(0x0c28b636, 0x3f04706b),
1498 TOBN(0xbad65a46, 0x58b196d0), TOBN(0x6c8455fc, 0xec9f8b7c),
1499 TOBN(0xe90c895f, 0x2d71867e), TOBN(0x5c0be31b, 0xedf9f38c),
1500 TOBN(0x2a37a15e, 0xd8f6ec04), TOBN(0x239639e7, 0x8cd85251),
1501 TOBN(0xd8975315, 0x9c7c4c6b), TOBN(0x603aa3c0, 0xd7409af7),
1502 TOBN(0xb8d53d0c, 0x007132fb), TOBN(0x68d12af7, 0xa6849238),
1503 TOBN(0xbe0607e7, 0xbf5d9279), TOBN(0x9aa50055, 0xaada74ce),
1504 TOBN(0xe81079cb, 0xba7e8ccb), TOBN(0x610c71d1, 0xa5f4ff5e),
1505 TOBN(0x9e2ee1a7, 0x5aa07093), TOBN(0xca84004b, 0xa75da47c),
1506 TOBN(0x074d3951, 0x3de75401), TOBN(0xf938f756, 0xbb311592),
1507 TOBN(0x96197618, 0x00a43421), TOBN(0x39a25362, 0x07bc78c8),
1508 TOBN(0x278f710a, 0x0a171276), TOBN(0xb28446ea, 0x8d1a8f08),
1509 TOBN(0x184781bf, 0xe3b6a661), TOBN(0x7751cb1d, 0xe6d279f7),
1510 TOBN(0xf8ff95d6, 0xc59eb662), TOBN(0x186d90b7, 0x58d3dea7),
1511 TOBN(0x0e4bb6c1, 0xdfb4f754), TOBN(0x5c5cf56b, 0x2b2801dc),
1512 TOBN(0xc561e452, 0x1f54564d), TOBN(0xb4fb8c60, 0xf0dd7f13),
1513 TOBN(0xf8849630, 0x33ff98c7), TOBN(0x9619fffa, 0xcf17769c),
1514 TOBN(0xf8090bf6, 0x1bfdd80a), TOBN(0x14d9a149, 0x422cfe63),
1515 TOBN(0xb354c360, 0x6f6df9ea), TOBN(0xdbcf770d, 0x218f17ea),
1516 TOBN(0x207db7c8, 0x79eb3480), TOBN(0x213dbda8, 0x559b6a26),
1517 TOBN(0xac4c200b, 0x29fc81b3), TOBN(0xebc3e09f, 0x171d87c1),
1518 TOBN(0x91799530, 0x1481aa9e), TOBN(0x051b92e1, 0x92e114fa),
1519 TOBN(0xdf8f92e9, 0xecb5537f), TOBN(0x44b1b2cc, 0x290c7483),
1520 TOBN(0xa711455a, 0x2adeb016), TOBN(0x964b6856, 0x81a10c2c),
1521 TOBN(0x4f159d99, 0xcec03623), TOBN(0x05532225, 0xef3271ea),
1522 TOBN(0xb231bea3, 0xc5ee4849), TOBN(0x57a54f50, 0x7094f103),
1523 TOBN(0x3e2d421d, 0x9598b352), TOBN(0xe865a49c, 0x67412ab4),
1524 TOBN(0xd2998a25, 0x1cc3a912), TOBN(0x5d092808, 0x0c74d65d),
1525 TOBN(0x73f45908, 0x4088567a), TOBN(0xeb6b280e, 0x1f214a61),
1526 TOBN(0x8c9adc34, 0xcaf0c13d), TOBN(0x39d12938, 0xf561fb80),
1527 TOBN(0xb2dc3a5e, 0xbc6edfb4), TOBN(0x7485b1b1, 0xfe4d210e),
1528 TOBN(0x062e0400, 0xe186ae72), TOBN(0x91e32d5c, 0x6eeb3b88),
1529 TOBN(0x6df574d7, 0x4be59224), TOBN(0xebc88ccc, 0x716d55f3),
1530 TOBN(0x26c2e6d0, 0xcad6ed33), TOBN(0xc6e21e7d, 0x0d3e8b10),
1531 TOBN(0x2cc5840e, 0x5bcc36bb), TOBN(0x9292445e, 0x7da74f69),
1532 TOBN(0x8be8d321, 0x4e5193a8), TOBN(0x3ec23629, 0x8df06413),
1533 TOBN(0xc7e9ae85, 0xb134defa), TOBN(0x6073b1d0, 0x1bb2d475),
1534 TOBN(0xb9ad615e, 0x2863c00d), TOBN(0x9e29493d, 0x525f4ac4),
1535 TOBN(0xc32b1dea, 0x4e9acf4f), TOBN(0x3e1f01c8, 0xa50db88d),
1536 TOBN(0xb05d70ea, 0x04da916c), TOBN(0x714b0d0a, 0xd865803e),
1537 TOBN(0x4bd493fc, 0x9920cb5e), TOBN(0x5b44b1f7, 0x92c7a3ac),
1538 TOBN(0xa2a77293, 0xbcec9235), TOBN(0x5ee06e87, 0xcd378553),
1539 TOBN(0xceff8173, 0xda621607), TOBN(0x2bb03e4c, 0x99f5d290),
1540 TOBN(0x2945106a, 0xa6f734ac), TOBN(0xb5056604, 0xd25c4732),
1541 TOBN(0x5945920c, 0xe079afee), TOBN(0x686e17a0, 0x6789831f),
1542 TOBN(0x5966bee8, 0xb74a5ae5), TOBN(0x38a673a2, 0x1e258d46),
1543 TOBN(0xbd1cc1f2, 0x83141c95), TOBN(0x3b2ecf4f, 0x0e96e486),
1544 TOBN(0xcd3aa896, 0x74e5fc78), TOBN(0x415ec10c, 0x2482fa7a),
1545 TOBN(0x15234419, 0x80503380), TOBN(0x513d917a, 0xd314b392),
1546 TOBN(0xb0b52f4e, 0x63caecae), TOBN(0x07bf22ad, 0x2dc7780b),
1547 TOBN(0xe761e8a1, 0xe4306839), TOBN(0x1b3be962, 0x5dd7feaa),
1548 TOBN(0x4fe728de, 0x74c778f1), TOBN(0xf1fa0bda, 0x5e0070f6),
1549 TOBN(0x85205a31, 0x6ec3f510), TOBN(0x2c7e4a14, 0xd2980475),
1550 TOBN(0xde3c19c0, 0x6f30ebfd), TOBN(0xdb1c1f38, 0xd4b7e644),
1551 TOBN(0xfe291a75, 0x5dce364a), TOBN(0xb7b22a3c, 0x058f5be3),
1552 TOBN(0x2cd2c302, 0x37fea38c), TOBN(0x2930967a, 0x2e17be17),
1553 TOBN(0x87f009de, 0x0c061c65), TOBN(0xcb014aac, 0xedc6ed44),
1554 TOBN(0x49bd1cb4, 0x3bafb1eb), TOBN(0x81bd8b5c, 0x282d3688),
1555 TOBN(0x1cdab87e, 0xf01a17af), TOBN(0x21f37ac4, 0xe710063b),
1556 TOBN(0x5a6c5676, 0x42fc8193), TOBN(0xf4753e70, 0x56a6015c),
1557 TOBN(0x020f795e, 0xa15b0a44), TOBN(0x8f37c8d7, 0x8958a958),
1558 TOBN(0x63b7e89b, 0xa4b675b5), TOBN(0xb4fb0c0c, 0x0fc31aea),
1559 TOBN(0xed95e639, 0xa7ff1f2e), TOBN(0x9880f5a3, 0x619614fb),
1560 TOBN(0xdeb6ff02, 0x947151ab), TOBN(0x5bc5118c, 0xa868dcdb),
1561 TOBN(0xd8da2055, 0x4c20cea5), TOBN(0xcac2776e, 0x14c4d69a),
1562 TOBN(0xcccb22c1, 0x622d599b), TOBN(0xa4ddb653, 0x68a9bb50),
1563 TOBN(0x2c4ff151, 0x1b4941b4), TOBN(0xe1ff19b4, 0x6efba588),
1564 TOBN(0x35034363, 0xc48345e0), TOBN(0x45542e3d, 0x1e29dfc4),
1565 TOBN(0xf197cb91, 0x349f7aed), TOBN(0x3b2b5a00, 0x8fca8420),
1566 TOBN(0x7c175ee8, 0x23aaf6d8), TOBN(0x54dcf421, 0x35af32b6),
1567 TOBN(0x0ba14307, 0x27d6561e), TOBN(0x879d5ee4, 0xd175b1e2),
1568 TOBN(0xc7c43673, 0x99807db5), TOBN(0x77a54455, 0x9cd55bcd),
1569 TOBN(0xe6c2ff13, 0x0105c072), TOBN(0x18f7a99f, 0x8dda7da4),
1570 TOBN(0x4c301820, 0x0e2d35c1), TOBN(0x06a53ca0, 0xd9cc6c82),
1571 TOBN(0xaa21cc1e, 0xf1aa1d9e), TOBN(0x32414334, 0x4a75b1e8),
1572 TOBN(0x2a6d1328, 0x0ebe9fdc), TOBN(0x16bd173f, 0x98a4755a),
1573 TOBN(0xfbb9b245, 0x2133ffd9), TOBN(0x39a8b2f1, 0x830f1a20),
1574 TOBN(0x484bc97d, 0xd5a1f52a), TOBN(0xd6aebf56, 0xa40eddf8),
1575 TOBN(0x32257acb, 0x76ccdac6), TOBN(0xaf4d36ec, 0x1586ff27),
1576 TOBN(0x8eaa8863, 0xf8de7dd1), TOBN(0x0045d5cf, 0x88647c16)},
1577 {TOBN(0xa6f3d574, 0xc005979d), TOBN(0xc2072b42, 0x6a40e350),
1578 TOBN(0xfca5c156, 0x8de2ecf9), TOBN(0xa8c8bf5b, 0xa515344e),
1579 TOBN(0x97aee555, 0x114df14a), TOBN(0xd4374a4d, 0xfdc5ec6b),
1580 TOBN(0x754cc28f, 0x2ca85418), TOBN(0x71cb9e27, 0xd3c41f78),
1581 TOBN(0x89105079, 0x03605c39), TOBN(0xf0843d9e, 0xa142c96c),
1582 TOBN(0xf3744934, 0x16923684), TOBN(0x732caa2f, 0xfa0a2893),
1583 TOBN(0xb2e8c270, 0x61160170), TOBN(0xc32788cc, 0x437fbaa3),
1584 TOBN(0x39cd818e, 0xa6eda3ac), TOBN(0xe2e94239, 0x9e2b2e07),
1585 TOBN(0x6967d39b, 0x0260e52a), TOBN(0xd42585cc, 0x90653325),
1586 TOBN(0x0d9bd605, 0x21ca7954), TOBN(0x4fa20877, 0x81ed57b3),
1587 TOBN(0x60c1eff8, 0xe34a0bbe), TOBN(0x56b0040c, 0x84f6ef64),
1588 TOBN(0x28be2b24, 0xb1af8483), TOBN(0xb2278163, 0xf5531614),
1589 TOBN(0x8df27545, 0x5922ac1c), TOBN(0xa7b3ef5c, 0xa52b3f63),
1590 TOBN(0x8e77b214, 0x71de57c4), TOBN(0x31682c10, 0x834c008b),
1591 TOBN(0xc76824f0, 0x4bd55d31), TOBN(0xb6d1c086, 0x17b61c71),
1592 TOBN(0x31db0903, 0xc2a5089d), TOBN(0x9c092172, 0x184e5d3f),
1593 TOBN(0xdd7ced5b, 0xc00cc638), TOBN(0x1a2015eb, 0x61278fc2),
1594 TOBN(0x2e8e5288, 0x6a37f8d6), TOBN(0xc457786f, 0xe79933ad),
1595 TOBN(0xb3fe4cce, 0x2c51211a), TOBN(0xad9b10b2, 0x24c20498),
1596 TOBN(0x90d87a4f, 0xd28db5e5), TOBN(0x698cd105, 0x3aca2fc3),
1597 TOBN(0x4f112d07, 0xe91b536d), TOBN(0xceb982f2, 0x9eba09d6),
1598 TOBN(0x3c157b2c, 0x197c396f), TOBN(0xe23c2d41, 0x7b66eb24),
1599 TOBN(0x480c57d9, 0x3f330d37), TOBN(0xb3a4c8a1, 0x79108deb),
1600 TOBN(0x702388de, 0xcb199ce5), TOBN(0x0b019211, 0xb944a8d4),
1601 TOBN(0x24f2a692, 0x840bb336), TOBN(0x7c353bdc, 0xa669fa7b),
1602 TOBN(0xda20d6fc, 0xdec9c300), TOBN(0x625fbe2f, 0xa13a4f17),
1603 TOBN(0xa2b1b61a, 0xdbc17328), TOBN(0x008965bf, 0xa9515621),
1604 TOBN(0x49690939, 0xc620ff46), TOBN(0x182dd27d, 0x8717e91c),
1605 TOBN(0x5ace5035, 0xea6c3997), TOBN(0x54259aaa, 0xc2610bef),
1606 TOBN(0xef18bb3f, 0x3c80dd39), TOBN(0x6910b95b, 0x5fc3fa39),
1607 TOBN(0xfce2f510, 0x43e09aee), TOBN(0xced56c9f, 0xa7675665),
1608 TOBN(0x10e265ac, 0xd872db61), TOBN(0x6982812e, 0xae9fce69),
1609 TOBN(0x29be11c6, 0xce800998), TOBN(0x72bb1752, 0xb90360d9),
1610 TOBN(0x2c193197, 0x5a4ad590), TOBN(0x2ba2f548, 0x9fc1dbc0),
1611 TOBN(0x7fe4eebb, 0xe490ebe0), TOBN(0x12a0a4cd, 0x7fae11c0),
1612 TOBN(0x7197cf81, 0xe903ba37), TOBN(0xcf7d4aa8, 0xde1c6dd8),
1613 TOBN(0x92af6bf4, 0x3fd5684c), TOBN(0x2b26eecf, 0x80360aa1),
1614 TOBN(0xbd960f30, 0x00546a82), TOBN(0x407b3c43, 0xf59ad8fe),
1615 TOBN(0x86cae5fe, 0x249c82ba), TOBN(0x9e0faec7, 0x2463744c),
1616 TOBN(0x87f551e8, 0x94916272), TOBN(0x033f9344, 0x6ceb0615),
1617 TOBN(0x1e5eb0d1, 0x8be82e84), TOBN(0x89967f0e, 0x7a582fef),
1618 TOBN(0xbcf687d5, 0xa6e921fa), TOBN(0xdfee4cf3, 0xd37a09ba),
1619 TOBN(0x94f06965, 0xb493c465), TOBN(0x638b9a1c, 0x7635c030),
1620 TOBN(0x76667864, 0x66f05e9f), TOBN(0xccaf6808, 0xc04da725),
1621 TOBN(0xca2eb690, 0x768fccfc), TOBN(0xf402d37d, 0xb835b362),
1622 TOBN(0x0efac0d0, 0xe2fdfcce), TOBN(0xefc9cdef, 0xb638d990),
1623 TOBN(0x2af12b72, 0xd1669a8b), TOBN(0x33c536bc, 0x5774ccbd),
1624 TOBN(0x30b21909, 0xfb34870e), TOBN(0xc38fa2f7, 0x7df25aca),
1625 TOBN(0x74c5f02b, 0xbf81f3f5), TOBN(0x0525a5ae, 0xaf7e4581),
1626 TOBN(0x88d2aaba, 0x433c54ae), TOBN(0xed9775db, 0x806a56c5),
1627 TOBN(0xd320738a, 0xc0edb37d), TOBN(0x25fdb6ee, 0x66cc1f51),
1628 TOBN(0xac661d17, 0x10600d76), TOBN(0x931ec1f3, 0xbdd1ed76),
1629 TOBN(0x65c11d62, 0x19ee43f1), TOBN(0x5cd57c3e, 0x60829d97),
1630 TOBN(0xd26c91a3, 0x984be6e8), TOBN(0xf08d9309, 0x8b0c53bd),
1631 TOBN(0x94bc9e5b, 0xc016e4ea), TOBN(0xd3916839, 0x11d43d2b),
1632 TOBN(0x886c5ad7, 0x73701155), TOBN(0xe0377626, 0x20b00715),
1633 TOBN(0x7f01c9ec, 0xaa80ba59), TOBN(0x3083411a, 0x68538e51),
1634 TOBN(0x970370f1, 0xe88128af), TOBN(0x625cc3db, 0x91dec14b),
1635 TOBN(0xfef9666c, 0x01ac3107), TOBN(0xb2a8d577, 0xd5057ac3),
1636 TOBN(0xb0f26299, 0x92be5df7), TOBN(0xf579c8e5, 0x00353924),
1637 TOBN(0xb8fa3d93, 0x1341ed7a), TOBN(0x4223272c, 0xa7b59d49),
1638 TOBN(0x3dcb1947, 0x83b8c4a4), TOBN(0x4e413c01, 0xed1302e4),
1639 TOBN(0x6d999127, 0xe17e44ce), TOBN(0xee86bf75, 0x33b3adfb),
1640 TOBN(0xf6902fe6, 0x25aa96ca), TOBN(0xb73540e4, 0xe5aae47d),
1641 TOBN(0x32801d7b, 0x1b4a158c), TOBN(0xe571c99e, 0x27e2a369),
1642 TOBN(0x40cb76c0, 0x10d9f197), TOBN(0xc308c289, 0x3167c0ae),
1643 TOBN(0xa6ef9dd3, 0xeb7958f2), TOBN(0xa7226dfc, 0x300879b1),
1644 TOBN(0x6cd0b362, 0x7edf0636), TOBN(0x4efbce6c, 0x7bc37eed),
1645 TOBN(0x75f92a05, 0x8d699021), TOBN(0x586d4c79, 0x772566e3),
1646 TOBN(0x378ca5f1, 0x761ad23a), TOBN(0x650d86fc, 0x1465a8ac),
1647 TOBN(0x7a4ed457, 0x842ba251), TOBN(0x6b65e3e6, 0x42234933),
1648 TOBN(0xaf1543b7, 0x31aad657), TOBN(0xa4cefe98, 0xcbfec369),
1649 TOBN(0xb587da90, 0x9f47befb), TOBN(0x6562e9fb, 0x41312d13),
1650 TOBN(0xa691ea59, 0xeff1cefe), TOBN(0xcc30477a, 0x05fc4cf6),
1651 TOBN(0xa1632461, 0x0b0ffd3d), TOBN(0xa1f16f3b, 0x5b355956),
1652 TOBN(0x5b148d53, 0x4224ec24), TOBN(0xdc834e7b, 0xf977012a),
1653 TOBN(0x7bfc5e75, 0xb2c69dbc), TOBN(0x3aa77a29, 0x03c3da6c),
1654 TOBN(0xde0df03c, 0xca910271), TOBN(0xcbd5ca4a, 0x7806dc55),
1655 TOBN(0xe1ca5807, 0x6db476cb), TOBN(0xfde15d62, 0x5f37a31e),
1656 TOBN(0xf49af520, 0xf41af416), TOBN(0x96c5c5b1, 0x7d342db5),
1657 TOBN(0x155c43b7, 0xeb4ceb9b), TOBN(0x2e993010, 0x4e77371a),
1658 TOBN(0x1d2987da, 0x675d43af), TOBN(0xef2bc1c0, 0x8599fd72),
1659 TOBN(0x96894b7b, 0x9342f6b2), TOBN(0x201eadf2, 0x7c8e71f0),
1660 TOBN(0xf3479d9f, 0x4a1f3efc), TOBN(0xe0f8a742, 0x702a9704),
1661 TOBN(0xeafd44b6, 0xb3eba40c), TOBN(0xf9739f29, 0xc1c1e0d0),
1662 TOBN(0x0091471a, 0x619d505e), TOBN(0xc15f9c96, 0x9d7c263e),
1663 TOBN(0x5be47285, 0x83afbe33), TOBN(0xa3b6d6af, 0x04f1e092),
1664 TOBN(0xe76526b9, 0x751a9d11), TOBN(0x2ec5b26d, 0x9a4ae4d2),
1665 TOBN(0xeb66f4d9, 0x02f6fb8d), TOBN(0x4063c561, 0x96912164),
1666 TOBN(0xeb7050c1, 0x80ef3000), TOBN(0x288d1c33, 0xeaa5b3f0),
1667 TOBN(0xe87c68d6, 0x07806fd8), TOBN(0xb2f7f9d5, 0x4bbbf50f),
1668 TOBN(0x25972f3a, 0xac8d6627), TOBN(0xf8547774, 0x10e8c13b),
1669 TOBN(0xcc50ef6c, 0x872b4a60), TOBN(0xab2a34a4, 0x4613521b),
1670 TOBN(0x39c5c190, 0x983e15d1), TOBN(0x61dde5df, 0x59905512),
1671 TOBN(0xe417f621, 0x9f2275f3), TOBN(0x0750c8b6, 0x451d894b),
1672 TOBN(0x75b04ab9, 0x78b0bdaa), TOBN(0x3bfd9fd4, 0x458589bd),
1673 TOBN(0xf1013e30, 0xee9120b6), TOBN(0x2b51af93, 0x23a4743e),
1674 TOBN(0xea96ffae, 0x48d14d9e), TOBN(0x71dc0dbe, 0x698a1d32),
1675 TOBN(0x914962d2, 0x0180cca4), TOBN(0x1ae60677, 0xc3568963),
1676 TOBN(0x8cf227b1, 0x437bc444), TOBN(0xc650c83b, 0xc9962c7a),
1677 TOBN(0x23c2c7dd, 0xfe7ccfc4), TOBN(0xf925c89d, 0x1b929d48),
1678 TOBN(0x4460f74b, 0x06783c33), TOBN(0xac2c8d49, 0xa590475a),
1679 TOBN(0xfb40b407, 0xb807bba0), TOBN(0x9d1e362d, 0x69ff8f3a),
1680 TOBN(0xa33e9681, 0xcbef64a4), TOBN(0x67ece5fa, 0x332fb4b2),
1681 TOBN(0x6900a99b, 0x739f10e3), TOBN(0xc3341ca9, 0xff525925),
1682 TOBN(0xee18a626, 0xa9e2d041), TOBN(0xa5a83685, 0x29580ddd),
1683 TOBN(0xf3470c81, 0x9d7de3cd), TOBN(0xedf02586, 0x2062cf9c),
1684 TOBN(0xf43522fa, 0xc010edb0), TOBN(0x30314135, 0x13a4b1ae),
1685 TOBN(0xc792e02a, 0xdb22b94b), TOBN(0x993d8ae9, 0xa1eaa45b),
1686 TOBN(0x8aad6cd3, 0xcd1e1c63), TOBN(0x89529ca7, 0xc5ce688a),
1687 TOBN(0x2ccee3aa, 0xe572a253), TOBN(0xe02b6438, 0x02a21efb),
1688 TOBN(0xa7091b6e, 0xc9430358), TOBN(0x06d1b1fa, 0x9d7db504),
1689 TOBN(0x58846d32, 0xc4744733), TOBN(0x40517c71, 0x379f9e34),
1690 TOBN(0x2f65655f, 0x130ef6ca), TOBN(0x526e4488, 0xf1f3503f),
1691 TOBN(0x8467bd17, 0x7ee4a976), TOBN(0x1d9dc913, 0x921363d1),
1692 TOBN(0xd8d24c33, 0xb069e041), TOBN(0x5eb5da0a, 0x2cdf7f51),
1693 TOBN(0x1c0f3cb1, 0x197b994f), TOBN(0x3c95a6c5, 0x2843eae9),
1694 TOBN(0x7766ffc9, 0xa6097ea5), TOBN(0x7bea4093, 0xd723b867),
1695 TOBN(0xb48e1f73, 0x4db378f9), TOBN(0x70025b00, 0xe37b77ac),
1696 TOBN(0x943dc8e7, 0xaf24ad46), TOBN(0xb98a15ac, 0x16d00a85),
1697 TOBN(0x3adc38ba, 0x2743b004), TOBN(0xb1c7f4f7, 0x334415ee),
1698 TOBN(0xea43df8f, 0x1e62d05a), TOBN(0x32618905, 0x9d76a3b6),
1699 TOBN(0x2fbd0bb5, 0xa23a0f46), TOBN(0x5bc971db, 0x6a01918c),
1700 TOBN(0x7801d94a, 0xb4743f94), TOBN(0xb94df65e, 0x676ae22b),
1701 TOBN(0xaafcbfab, 0xaf95894c), TOBN(0x7b9bdc07, 0x276b2241),
1702 TOBN(0xeaf98362, 0x5bdda48b), TOBN(0x5977faf2, 0xa3fcb4df),
1703 TOBN(0xbed042ef, 0x052c4b5b), TOBN(0x9fe87f71, 0x067591f0),
1704 TOBN(0xc89c73ca, 0x22f24ec7), TOBN(0x7d37fa9e, 0xe64a9f1b),
1705 TOBN(0x2710841a, 0x15562627), TOBN(0x2c01a613, 0xc243b034),
1706 TOBN(0x1d135c56, 0x2bc68609), TOBN(0xc2ca1715, 0x8b03f1f6),
1707 TOBN(0xc9966c2d, 0x3eb81d82), TOBN(0xc02abf4a, 0x8f6df13e),
1708 TOBN(0x77b34bd7, 0x8f72b43b), TOBN(0xaff6218f, 0x360c82b0),
1709 TOBN(0x0aa5726c, 0x8d55b9d2), TOBN(0xdc0adbe9, 0x99e9bffb),
1710 TOBN(0x9097549c, 0xefb9e72a), TOBN(0x16755712, 0x9dfb3111),
1711 TOBN(0xdd8bf984, 0xf26847f9), TOBN(0xbcb8e387, 0xdfb30cb7),
1712 TOBN(0xc1fd32a7, 0x5171ef9c), TOBN(0x977f3fc7, 0x389b363f),
1713 TOBN(0x116eaf2b, 0xf4babda0), TOBN(0xfeab68bd, 0xf7113c8e),
1714 TOBN(0xd1e3f064, 0xb7def526), TOBN(0x1ac30885, 0xe0b3fa02),
1715 TOBN(0x1c5a6e7b, 0x40142d9d), TOBN(0x839b5603, 0x30921c0b),
1716 TOBN(0x48f301fa, 0x36a116a3), TOBN(0x380e1107, 0xcfd9ee6d),
1717 TOBN(0x7945ead8, 0x58854be1), TOBN(0x4111c12e, 0xcbd4d49d),
1718 TOBN(0xece3b1ec, 0x3a29c2ef), TOBN(0x6356d404, 0x8d3616f5),
1719 TOBN(0x9f0d6a8f, 0x594d320e), TOBN(0x0989316d, 0xf651ccd2),
1720 TOBN(0x6c32117a, 0x0f8fdde4), TOBN(0x9abe5cc5, 0xa26a9bbc),
1721 TOBN(0xcff560fb, 0x9723f671), TOBN(0x21b2a12d, 0x7f3d593c),
1722 TOBN(0xe4cb18da, 0x24ba0696), TOBN(0x186e2220, 0xc3543384),
1723 TOBN(0x722f64e0, 0x88312c29), TOBN(0x94282a99, 0x17dc7752),
1724 TOBN(0x62467bbf, 0x5a85ee89), TOBN(0xf435c650, 0xf10076a0),
1725 TOBN(0xc9ff1539, 0x43b3a50b), TOBN(0x7132130c, 0x1a53efbc),
1726 TOBN(0x31bfe063, 0xf7b0c5b7), TOBN(0xb0179a7d, 0x4ea994cc),
1727 TOBN(0x12d064b3, 0xc85f455b), TOBN(0x47259328, 0x8f6e0062),
1728 TOBN(0xf64e590b, 0xb875d6d9), TOBN(0x22dd6225, 0xad92bcc7),
1729 TOBN(0xb658038e, 0xb9c3bd6d), TOBN(0x00cdb0d6, 0xfbba27c8),
1730 TOBN(0x0c681337, 0x1062c45d), TOBN(0xd8515b8c, 0x2d33407d),
1731 TOBN(0xcb8f699e, 0x8cbb5ecf), TOBN(0x8c4347f8, 0xc608d7d8),
1732 TOBN(0x2c11850a, 0xbb3e00db), TOBN(0x20a8dafd, 0xecb49d19),
1733 TOBN(0xbd781480, 0x45ee2f40), TOBN(0x75e354af, 0x416b60cf),
1734 TOBN(0xde0b58a1, 0x8d49a8c4), TOBN(0xe40e94e2, 0xfa359536),
1735 TOBN(0xbd4fa59f, 0x62accd76), TOBN(0x05cf466a, 0x8c762837),
1736 TOBN(0xb5abda99, 0x448c277b), TOBN(0x5a9e01bf, 0x48b13740),
1737 TOBN(0x9d457798, 0x326aad8d), TOBN(0xbdef4954, 0xc396f7e7),
1738 TOBN(0x6fb274a2, 0xc253e292), TOBN(0x2800bf0a, 0x1cfe53e7),
1739 TOBN(0x22426d31, 0x44438fd4), TOBN(0xef233923, 0x5e259f9a),
1740 TOBN(0x4188503c, 0x03f66264), TOBN(0x9e5e7f13, 0x7f9fdfab),
1741 TOBN(0x565eb76c, 0x5fcc1aba), TOBN(0xea632548, 0x59b5bff8),
1742 TOBN(0x5587c087, 0xaab6d3fa), TOBN(0x92b639ea, 0x6ce39c1b),
1743 TOBN(0x0706e782, 0x953b135c), TOBN(0x7308912e, 0x425268ef),
1744 TOBN(0x599e92c7, 0x090e7469), TOBN(0x83b90f52, 0x9bc35e75),
1745 TOBN(0x4750b3d0, 0x244975b3), TOBN(0xf3a44358, 0x11965d72),
1746 TOBN(0x179c6774, 0x9c8dc751), TOBN(0xff18cdfe, 0xd23d9ff0),
1747 TOBN(0xc4013833, 0x2028e247), TOBN(0x96e280e2, 0xf3bfbc79),
1748 TOBN(0xf60417bd, 0xd0880a84), TOBN(0x263c9f3d, 0x2a568151),
1749 TOBN(0x36be15b3, 0x2d2ce811), TOBN(0x846dc0c2, 0xf8291d21),
1750 TOBN(0x5cfa0ecb, 0x789fcfdb), TOBN(0x45a0beed, 0xd7535b9a),
1751 TOBN(0xec8e9f07, 0x96d69af1), TOBN(0x31a7c5b8, 0x599ab6dc),
1752 TOBN(0xd36d45ef, 0xf9e2e09f), TOBN(0x3cf49ef1, 0xdcee954b),
1753 TOBN(0x6be34cf3, 0x086cff9b), TOBN(0x88dbd491, 0x39a3360f),
1754 TOBN(0x1e96b8cc, 0x0dbfbd1d), TOBN(0xc1e5f7bf, 0xcb7e2552),
1755 TOBN(0x0547b214, 0x28819d98), TOBN(0xc770dd9c, 0x7aea9dcb),
1756 TOBN(0xaef0d4c7, 0x041d68c8), TOBN(0xcc2b9818, 0x13cb9ba8),
1757 TOBN(0x7fc7bc76, 0xfe86c607), TOBN(0x6b7b9337, 0x502a9a95),
1758 TOBN(0x1948dc27, 0xd14dab63), TOBN(0x249dd198, 0xdae047be),
1759 TOBN(0xe8356584, 0xa981a202), TOBN(0x3531dd18, 0x3a893387),
1760 TOBN(0x1be11f90, 0xc85c7209), TOBN(0x93d2fe1e, 0xe2a52b5a),
1761 TOBN(0x8225bfe2, 0xec6d6b97), TOBN(0x9cf6d6f4, 0xbd0aa5de),
1762 TOBN(0x911459cb, 0x54779f5f), TOBN(0x5649cddb, 0x86aeb1f3),
1763 TOBN(0x32133579, 0x3f26ce5a), TOBN(0xc289a102, 0x550f431e),
1764 TOBN(0x559dcfda, 0x73b84c6f), TOBN(0x84973819, 0xee3ac4d7),
1765 TOBN(0xb51e55e6, 0xf2606a82), TOBN(0xe25f7061, 0x90f2fb57),
1766 TOBN(0xacef6c2a, 0xb1a4e37c), TOBN(0x864e359d, 0x5dcf2706),
1767 TOBN(0x479e6b18, 0x7ce57316), TOBN(0x2cab2500, 0x3a96b23d),
1768 TOBN(0xed489862, 0x8ef16df7), TOBN(0x2056538c, 0xef3758b5),
1769 TOBN(0xa7df865e, 0xf15d3101), TOBN(0x80c5533a, 0x61b553d7),
1770 TOBN(0x366e1997, 0x4ed14294), TOBN(0x6620741f, 0xb3c0bcd6),
1771 TOBN(0x21d1d9c4, 0xedc45418), TOBN(0x005b859e, 0xc1cc4a9d),
1772 TOBN(0xdf01f630, 0xa1c462f0), TOBN(0x15d06cf3, 0xf26820c7),
1773 TOBN(0x9f7f24ee, 0x3484be47), TOBN(0x2ff33e96, 0x4a0c902f),
1774 TOBN(0x00bdf457, 0x5a0bc453), TOBN(0x2378dfaf, 0x1aa238db),
1775 TOBN(0x272420ec, 0x856720f2), TOBN(0x2ad9d95b, 0x96797291),
1776 TOBN(0xd1242cc6, 0x768a1558), TOBN(0x2e287f8b, 0x5cc86aa8),
1777 TOBN(0x796873d0, 0x990cecaa), TOBN(0xade55f81, 0x675d4080),
1778 TOBN(0x2645eea3, 0x21f0cd84), TOBN(0x7a1efa0f, 0xb4e17d02),
1779 TOBN(0xf6858420, 0x037cc061), TOBN(0x682e05f0, 0xd5d43e12),
1780 TOBN(0x59c36994, 0x27218710), TOBN(0x85cbba4d, 0x3f7cd2fc),
1781 TOBN(0x726f9729, 0x7a3cd22a), TOBN(0x9f8cd5dc, 0x4a628397),
1782 TOBN(0x17b93ab9, 0xc23165ed), TOBN(0xff5f5dbf, 0x122823d4),
1783 TOBN(0xc1e4e4b5, 0x654a446d), TOBN(0xd1a9496f, 0x677257ba),
1784 TOBN(0x6387ba94, 0xde766a56), TOBN(0x23608bc8, 0x521ec74a),
1785 TOBN(0x16a522d7, 0x6688c4d4), TOBN(0x9d6b4282, 0x07373abd),
1786 TOBN(0xa62f07ac, 0xb42efaa3), TOBN(0xf73e00f7, 0xe3b90180),
1787 TOBN(0x36175fec, 0x49421c3e), TOBN(0xc4e44f9b, 0x3dcf2678),
1788 TOBN(0x76df436b, 0x7220f09f), TOBN(0x172755fb, 0x3aa8b6cf),
1789 TOBN(0xbab89d57, 0x446139cc), TOBN(0x0a0a6e02, 0x5fe0208f),
1790 TOBN(0xcdbb63e2, 0x11e5d399), TOBN(0x33ecaa12, 0xa8977f0b),
1791 TOBN(0x59598b21, 0xf7c42664), TOBN(0xb3e91b32, 0xab65d08a),
1792 TOBN(0x035822ee, 0xf4502526), TOBN(0x1dcf0176, 0x720a82a9),
1793 TOBN(0x50f8598f, 0x3d589e02), TOBN(0xdf0478ff, 0xb1d63d2c),
1794 TOBN(0x8b8068bd, 0x1571cd07), TOBN(0x30c3aa4f, 0xd79670cd),
1795 TOBN(0x25e8fd4b, 0x941ade7f), TOBN(0x3d1debdc, 0x32790011),
1796 TOBN(0x65b6dcbd, 0x3a3f9ff0), TOBN(0x282736a4, 0x793de69c),
1797 TOBN(0xef69a0c3, 0xd41d3bd3), TOBN(0xb533b8c9, 0x07a26bde),
1798 TOBN(0xe2801d97, 0xdb2edf9f), TOBN(0xdc4a8269, 0xe1877af0),
1799 TOBN(0x6c1c5851, 0x3d590dbe), TOBN(0x84632f6b, 0xee4e9357),
1800 TOBN(0xd36d36b7, 0x79b33374), TOBN(0xb46833e3, 0x9bbca2e6),
1801 TOBN(0x37893913, 0xf7fc0586), TOBN(0x385315f7, 0x66bf4719),
1802 TOBN(0x72c56293, 0xb31855dc), TOBN(0xd1416d4e, 0x849061fe),
1803 TOBN(0xbeb3ab78, 0x51047213), TOBN(0x447f6e61, 0xf040c996),
1804 TOBN(0xd06d310d, 0x638b1d0c), TOBN(0xe28a413f, 0xbad1522e),
1805 TOBN(0x685a76cb, 0x82003f86), TOBN(0x610d07f7, 0x0bcdbca3),
1806 TOBN(0x6ff66021, 0x9ca4c455), TOBN(0x7df39b87, 0xcea10eec),
1807 TOBN(0xb9255f96, 0xe22db218), TOBN(0x8cc6d9eb, 0x08a34c44),
1808 TOBN(0xcd4ffb86, 0x859f9276), TOBN(0x8fa15eb2, 0x50d07335),
1809 TOBN(0xdf553845, 0xcf2c24b5), TOBN(0x89f66a9f, 0x52f9c3ba),
1810 TOBN(0x8f22b5b9, 0xe4a7ceb3), TOBN(0xaffef809, 0x0e134686),
1811 TOBN(0x3e53e1c6, 0x8eb8fac2), TOBN(0x93c1e4eb, 0x28aec98e),
1812 TOBN(0xb6b91ec5, 0x32a43bcb), TOBN(0x2dbfa947, 0xb2d74a51),
1813 TOBN(0xe065d190, 0xca84bad7), TOBN(0xfb13919f, 0xad58e65c),
1814 TOBN(0x3c41718b, 0xf1cb6e31), TOBN(0x688969f0, 0x06d05c3f),
1815 TOBN(0xd4f94ce7, 0x21264d45), TOBN(0xfdfb65e9, 0x7367532b),
1816 TOBN(0x5b1be8b1, 0x0945a39d), TOBN(0x229f789c, 0x2b8baf3b),
1817 TOBN(0xd8f41f3e, 0x6f49f15d), TOBN(0x678ce828, 0x907f0792),
1818 TOBN(0xc69ace82, 0xfca6e867), TOBN(0x106451ae, 0xd01dcc89),
1819 TOBN(0x1bb4f7f0, 0x19fc32d2), TOBN(0x64633dfc, 0xb00c52d2),
1820 TOBN(0x8f13549a, 0xad9ea445), TOBN(0x99a3bf50, 0xfb323705),
1821 TOBN(0x0c9625a2, 0x534d4dbc), TOBN(0x45b8f1d1, 0xc2a2fea3),
1822 TOBN(0x76ec21a1, 0xa530fc1a), TOBN(0x4bac9c2a, 0x9e5bd734),
1823 TOBN(0x5996d76a, 0x7b4e3587), TOBN(0x0045cdee, 0x1182d9e3),
1824 TOBN(0x1aee24b9, 0x1207f13d), TOBN(0x66452e97, 0x97345a41),
1825 TOBN(0x16e5b054, 0x9f950cd0), TOBN(0x9cc72fb1, 0xd7fdd075),
1826 TOBN(0x6edd61e7, 0x66249663), TOBN(0xde4caa4d, 0xf043cccb),
1827 TOBN(0x11b1f57a, 0x55c7ac17), TOBN(0x779cbd44, 0x1a85e24d),
1828 TOBN(0x78030f86, 0xe46081e7), TOBN(0xfd4a6032, 0x8e20f643),
1829 TOBN(0xcc7a6488, 0x0a750c0f), TOBN(0x39bacfe3, 0x4e548e83),
1830 TOBN(0x3d418c76, 0x0c110f05), TOBN(0x3e4daa4c, 0xb1f11588),
1831 TOBN(0x2733e7b5, 0x5ffc69ff), TOBN(0x46f147bc, 0x92053127),
1832 TOBN(0x885b2434, 0xd722df94), TOBN(0x6a444f65, 0xe6fc6b7c)},
1833 {TOBN(0x7a1a465a, 0xc3f16ea8), TOBN(0x115a461d, 0xb2f1d11c),
1834 TOBN(0x4767dd95, 0x6c68a172), TOBN(0x3392f2eb, 0xd13a4698),
1835 TOBN(0xc7a99ccd, 0xe526cdc7), TOBN(0x8e537fdc, 0x22292b81),
1836 TOBN(0x76d8cf69, 0xa6d39198), TOBN(0xffc5ff43, 0x2446852d),
1837 TOBN(0x97b14f7e, 0xa90567e6), TOBN(0x513257b7, 0xb6ae5cb7),
1838 TOBN(0x85454a3c, 0x9f10903d), TOBN(0xd8d2c9ad, 0x69bc3724),
1839 TOBN(0x38da9324, 0x6b29cb44), TOBN(0xb540a21d, 0x77c8cbac),
1840 TOBN(0x9bbfe435, 0x01918e42), TOBN(0xfffa707a, 0x56c3614e),
1841 TOBN(0x0ce4e3f1, 0xd4e353b7), TOBN(0x062d8a14, 0xef46b0a0),
1842 TOBN(0x6408d5ab, 0x574b73fd), TOBN(0xbc41d1c9, 0xd3273ffd),
1843 TOBN(0x3538e1e7, 0x6be77800), TOBN(0x71fe8b37, 0xc5655031),
1844 TOBN(0x1cd91621, 0x6b9b331a), TOBN(0xad825d0b, 0xbb388f73),
1845 TOBN(0x56c2e05b, 0x1cb76219), TOBN(0x0ec0bf91, 0x71567e7e),
1846 TOBN(0xe7076f86, 0x61c4c910), TOBN(0xd67b085b, 0xbabc04d9),
1847 TOBN(0x9fb90459, 0x5e93a96a), TOBN(0x7526c1ea, 0xfbdc249a),
1848 TOBN(0x0d44d367, 0xecdd0bb7), TOBN(0x95399917, 0x9dc0d695),
1849 TOBN(0x61360ee9, 0x9e240d18), TOBN(0x057cdcac, 0xb4b94466),
1850 TOBN(0xe7667cd1, 0x2fe5325c), TOBN(0x1fa297b5, 0x21974e3b),
1851 TOBN(0xfa4081e7, 0xdb083d76), TOBN(0x31993be6, 0xf206bd15),
1852 TOBN(0x8949269b, 0x14c19f8c), TOBN(0x21468d72, 0xa9d92357),
1853 TOBN(0x2ccbc583, 0xa4c506ec), TOBN(0x957ed188, 0xd1acfe97),
1854 TOBN(0x8baed833, 0x12f1aea2), TOBN(0xef2a6cb4, 0x8325362d),
1855 TOBN(0x130dde42, 0x8e195c43), TOBN(0xc842025a, 0x0e6050c6),
1856 TOBN(0x2da972a7, 0x08686a5d), TOBN(0xb52999a1, 0xe508b4a8),
1857 TOBN(0xd9f090b9, 0x10a5a8bd), TOBN(0xca91d249, 0x096864da),
1858 TOBN(0x8e6a93be, 0x3f67dbc1), TOBN(0xacae6fba, 0xf5f4764c),
1859 TOBN(0x1563c6e0, 0xd21411a0), TOBN(0x28fa787f, 0xda0a4ad8),
1860 TOBN(0xd524491c, 0x908c8030), TOBN(0x1257ba0e, 0x4c795f07),
1861 TOBN(0x83f49167, 0xceca9754), TOBN(0x426d2cf6, 0x4b7939a0),
1862 TOBN(0x2555e355, 0x723fd0bf), TOBN(0xa96e6d06, 0xc4f144e2),
1863 TOBN(0x4768a8dd, 0x87880e61), TOBN(0x15543815, 0xe508e4d5),
1864 TOBN(0x09d7e772, 0xb1b65e15), TOBN(0x63439dd6, 0xac302fa0),
1865 TOBN(0xb93f802f, 0xc14e35c2), TOBN(0x71735b7c, 0x4341333c),
1866 TOBN(0x03a25104, 0x16d4f362), TOBN(0x3f4d069b, 0xbf433c8e),
1867 TOBN(0x0d83ae01, 0xf78f5a7c), TOBN(0x50a8ffbe, 0x7c4eed07),
1868 TOBN(0xc74f8906, 0x76e10f83), TOBN(0x7d080966, 0x9ddaf8e1),
1869 TOBN(0xb11df8e1, 0x698e04cc), TOBN(0x877be203, 0x169005c8),
1870 TOBN(0x32749e8c, 0x4f3c6179), TOBN(0x2dbc9d0a, 0x7853fc05),
1871 TOBN(0x187d4f93, 0x9454d937), TOBN(0xe682ce9d, 0xb4800e1b),
1872 TOBN(0xa9129ad8, 0x165e68e8), TOBN(0x0fe29735, 0xbe7f785b),
1873 TOBN(0x5303f40c, 0x5b9e02b7), TOBN(0xa37c9692, 0x35ee04e8),
1874 TOBN(0x5f46cc20, 0x34d6632b), TOBN(0x55ef72b2, 0x96ac545b),
1875 TOBN(0xabec5c1f, 0x7b91b062), TOBN(0x0a79e1c7, 0xbb33e821),
1876 TOBN(0xbb04b428, 0x3a9f4117), TOBN(0x0de1f28f, 0xfd2a475a),
1877 TOBN(0x31019ccf, 0x3a4434b4), TOBN(0xa3458111, 0x1a7954dc),
1878 TOBN(0xa9dac80d, 0xe34972a7), TOBN(0xb043d054, 0x74f6b8dd),
1879 TOBN(0x021c319e, 0x11137b1a), TOBN(0x00a754ce, 0xed5cc03f),
1880 TOBN(0x0aa2c794, 0xcbea5ad4), TOBN(0x093e67f4, 0x70c015b6),
1881 TOBN(0x72cdfee9, 0xc97e3f6b), TOBN(0xc10bcab4, 0xb6da7461),
1882 TOBN(0x3b02d2fc, 0xb59806b9), TOBN(0x85185e89, 0xa1de6f47),
1883 TOBN(0x39e6931f, 0x0eb6c4d4), TOBN(0x4d4440bd, 0xd4fa5b04),
1884 TOBN(0x5418786e, 0x34be7eb8), TOBN(0x6380e521, 0x9d7259bc),
1885 TOBN(0x20ac0351, 0xd598d710), TOBN(0x272c4166, 0xcb3a4da4),
1886 TOBN(0xdb82fe1a, 0xca71de1f), TOBN(0x746e79f2, 0xd8f54b0f),
1887 TOBN(0x6e7fc736, 0x4b573e9b), TOBN(0x75d03f46, 0xfd4b5040),
1888 TOBN(0x5c1cc36d, 0x0b98d87b), TOBN(0x513ba3f1, 0x1f472da1),
1889 TOBN(0x79d0af26, 0xabb177dd), TOBN(0xf82ab568, 0x7891d564),
1890 TOBN(0x2b6768a9, 0x72232173), TOBN(0xefbb3bb0, 0x8c1f6619),
1891 TOBN(0xb29c11db, 0xa6d18358), TOBN(0x519e2797, 0xb0916d3a),
1892 TOBN(0xd4dc18f0, 0x9188e290), TOBN(0x648e86e3, 0x98b0ca7f),
1893 TOBN(0x859d3145, 0x983c38b5), TOBN(0xb14f176c, 0x637abc8b),
1894 TOBN(0x2793fb9d, 0xcaff7be6), TOBN(0xebe5a55f, 0x35a66a5a),
1895 TOBN(0x7cec1dcd, 0x9f87dc59), TOBN(0x7c595cd3, 0xfbdbf560),
1896 TOBN(0x5b543b22, 0x26eb3257), TOBN(0x69080646, 0xc4c935fd),
1897 TOBN(0x7f2e4403, 0x81e9ede3), TOBN(0x243c3894, 0xcaf6df0a),
1898 TOBN(0x7c605bb1, 0x1c073b11), TOBN(0xcd06a541, 0xba6a4a62),
1899 TOBN(0x29168949, 0x49d4e2e5), TOBN(0x33649d07, 0x4af66880),
1900 TOBN(0xbfc0c885, 0xe9a85035), TOBN(0xb4e52113, 0xfc410f4b),
1901 TOBN(0xdca3b706, 0x78a6513b), TOBN(0x92ea4a2a, 0x9edb1943),
1902 TOBN(0x02642216, 0xdb6e2dd8), TOBN(0x9b45d0b4, 0x9fd57894),
1903 TOBN(0x114e70db, 0xc69d11ae), TOBN(0x1477dd19, 0x4c57595f),
1904 TOBN(0xbc2208b4, 0xec77c272), TOBN(0x95c5b4d7, 0xdb68f59c),
1905 TOBN(0xb8c4fc63, 0x42e532b7), TOBN(0x386ba422, 0x9ae35290),
1906 TOBN(0xfb5dda42, 0xd201ecbc), TOBN(0x2353dc8b, 0xa0e38fd6),
1907 TOBN(0x9a0b85ea, 0x68f7e978), TOBN(0x96ec5682, 0x2ad6d11f),
1908 TOBN(0x5e279d6c, 0xe5f6886d), TOBN(0xd3fe03cd, 0x3cb1914d),
1909 TOBN(0xfe541fa4, 0x7ea67c77), TOBN(0x952bd2af, 0xe3ea810c),
1910 TOBN(0x791fef56, 0x8d01d374), TOBN(0xa3a1c621, 0x0f11336e),
1911 TOBN(0x5ad0d5a9, 0xc7ec6d79), TOBN(0xff7038af, 0x3225c342),
1912 TOBN(0x003c6689, 0xbc69601b), TOBN(0x25059bc7, 0x45e8747d),
1913 TOBN(0xfa4965b2, 0xf2086fbf), TOBN(0xf6840ea6, 0x86916078),
1914 TOBN(0xd7ac7620, 0x70081d6c), TOBN(0xe600da31, 0xb5328645),
1915 TOBN(0x01916f63, 0x529b8a80), TOBN(0xe80e4858, 0x2d7d6f3e),
1916 TOBN(0x29eb0fe8, 0xd664ca7c), TOBN(0xf017637b, 0xe7b43b0c),
1917 TOBN(0x9a75c806, 0x76cb2566), TOBN(0x8f76acb1, 0xb24892d9),
1918 TOBN(0x7ae7b9cc, 0x1f08fe45), TOBN(0x19ef7329, 0x6a4907d8),
1919 TOBN(0x2db4ab71, 0x5f228bf0), TOBN(0xf3cdea39, 0x817032d7),
1920 TOBN(0x0b1f482e, 0xdcabe3c0), TOBN(0x3baf76b4, 0xbb86325c),
1921 TOBN(0xd49065e0, 0x10089465), TOBN(0x3bab5d29, 0x8e77c596),
1922 TOBN(0x7636c3a6, 0x193dbd95), TOBN(0xdef5d294, 0xb246e499),
1923 TOBN(0xb22c58b9, 0x286b2475), TOBN(0xa0b93939, 0xcd80862b),
1924 TOBN(0x3002c83a, 0xf0992388), TOBN(0x6de01f9b, 0xeacbe14c),
1925 TOBN(0x6aac688e, 0xadd70482), TOBN(0x708de92a, 0x7b4a4e8a),
1926 TOBN(0x75b6dd73, 0x758a6eef), TOBN(0xea4bf352, 0x725b3c43),
1927 TOBN(0x10041f2c, 0x87912868), TOBN(0xb1b1be95, 0xef09297a),
1928 TOBN(0x19ae23c5, 0xa9f3860a), TOBN(0xc4f0f839, 0x515dcf4b),
1929 TOBN(0x3c7ecca3, 0x97f6306a), TOBN(0x744c44ae, 0x68a3a4b0),
1930 TOBN(0x69cd13a0, 0xb3a1d8a2), TOBN(0x7cad0a1e, 0x5256b578),
1931 TOBN(0xea653fcd, 0x33791d9e), TOBN(0x9cc2a05d, 0x74b2e05f),
1932 TOBN(0x73b391dc, 0xfd7affa2), TOBN(0xddb7091e, 0xb6b05442),
1933 TOBN(0xc71e27bf, 0x8538a5c6), TOBN(0x195c63dd, 0x89abff17),
1934 TOBN(0xfd315285, 0x1b71e3da), TOBN(0x9cbdfda7, 0xfa680fa0),
1935 TOBN(0x9db876ca, 0x849d7eab), TOBN(0xebe2764b, 0x3c273271),
1936 TOBN(0x663357e3, 0xf208dcea), TOBN(0x8c5bd833, 0x565b1b70),
1937 TOBN(0xccc3b4f5, 0x9837fc0d), TOBN(0x9b641ba8, 0xa79cf00f),
1938 TOBN(0x7428243d, 0xdfdf3990), TOBN(0x83a594c4, 0x020786b1),
1939 TOBN(0xb712451a, 0x526c4502), TOBN(0x9d39438e, 0x6adb3f93),
1940 TOBN(0xfdb261e3, 0xe9ff0ccd), TOBN(0x80344e3c, 0xe07af4c3),
1941 TOBN(0x75900d7c, 0x2fa4f126), TOBN(0x08a3b865, 0x5c99a232),
1942 TOBN(0x2478b6bf, 0xdb25e0c3), TOBN(0x482cc2c2, 0x71db2edf),
1943 TOBN(0x37df7e64, 0x5f321bb8), TOBN(0x8a93821b, 0x9a8005b4),
1944 TOBN(0x3fa2f10c, 0xcc8c1958), TOBN(0x0d332218, 0x2c269d0a),
1945 TOBN(0x20ab8119, 0xe246b0e6), TOBN(0xb39781e4, 0xd349fd17),
1946 TOBN(0xd293231e, 0xb31aa100), TOBN(0x4b779c97, 0xbb032168),
1947 TOBN(0x4b3f19e1, 0xc8470500), TOBN(0x45b7efe9, 0x0c4c869d),
1948 TOBN(0xdb84f38a, 0xa1a6bbcc), TOBN(0x3b59cb15, 0xb2fddbc1),
1949 TOBN(0xba5514df, 0x3fd165e8), TOBN(0x499fd6a9, 0x061f8811),
1950 TOBN(0x72cd1fe0, 0xbfef9f00), TOBN(0x120a4bb9, 0x79ad7e8a),
1951 TOBN(0xf2ffd095, 0x5f4a5ac5), TOBN(0xcfd174f1, 0x95a7a2f0),
1952 TOBN(0xd42301ba, 0x9d17baf1), TOBN(0xd2fa487a, 0x77f22089),
1953 TOBN(0x9cb09efe, 0xb1dc77e1), TOBN(0xe9566939, 0x21c99682),
1954 TOBN(0x8c546901, 0x6c6067bb), TOBN(0xfd378574, 0x61c24456),
1955 TOBN(0x2b6a6cbe, 0x81796b33), TOBN(0x62d550f6, 0x58e87f8b),
1956 TOBN(0x1b763e1c, 0x7f1b01b4), TOBN(0x4b93cfea, 0x1b1b5e12),
1957 TOBN(0xb9345238, 0x1d531696), TOBN(0x57201c00, 0x88cdde69),
1958 TOBN(0xdde92251, 0x9a86afc7), TOBN(0xe3043895, 0xbd35cea8),
1959 TOBN(0x7608c1e1, 0x8555970d), TOBN(0x8267dfa9, 0x2535935e),
1960 TOBN(0xd4c60a57, 0x322ea38b), TOBN(0xe0bf7977, 0x804ef8b5),
1961 TOBN(0x1a0dab28, 0xc06fece4), TOBN(0xd405991e, 0x94e7b49d),
1962 TOBN(0xc542b6d2, 0x706dab28), TOBN(0xcb228da3, 0xa91618fb),
1963 TOBN(0x224e4164, 0x107d1cea), TOBN(0xeb9fdab3, 0xd0f5d8f1),
1964 TOBN(0xc02ba386, 0x0d6e41cd), TOBN(0x676a72c5, 0x9b1f7146),
1965 TOBN(0xffd6dd98, 0x4d6cb00b), TOBN(0xcef9c5ca, 0xde2e8d7c),
1966 TOBN(0xa1bbf5d7, 0x641c7936), TOBN(0x1b95b230, 0xee8f772e),
1967 TOBN(0xf765a92e, 0xe8ac25b1), TOBN(0xceb04cfc, 0x3a18b7c6),
1968 TOBN(0x27944cef, 0x0acc8966), TOBN(0xcbb3c957, 0x434c1004),
1969 TOBN(0x9c9971a1, 0xa43ff93c), TOBN(0x5bc2db17, 0xa1e358a9),
1970 TOBN(0x45b4862e, 0xa8d9bc82), TOBN(0x70ebfbfb, 0x2201e052),
1971 TOBN(0xafdf64c7, 0x92871591), TOBN(0xea5bcae6, 0xb42d0219),
1972 TOBN(0xde536c55, 0x2ad8f03c), TOBN(0xcd6c3f4d, 0xa76aa33c),
1973 TOBN(0xbeb5f623, 0x0bca6de3), TOBN(0xdd20dd99, 0xb1e706fd),
1974 TOBN(0x90b3ff9d, 0xac9059d4), TOBN(0x2d7b2902, 0x7ccccc4e),
1975 TOBN(0x8a090a59, 0xce98840f), TOBN(0xa5d947e0, 0x8410680a),
1976 TOBN(0x49ae346a, 0x923379a5), TOBN(0x7dbc84f9, 0xb28a3156),
1977 TOBN(0xfd40d916, 0x54a1aff2), TOBN(0xabf318ba, 0x3a78fb9b),
1978 TOBN(0x50152ed8, 0x3029f95e), TOBN(0x9fc1dd77, 0xc58ad7fa),
1979 TOBN(0x5fa57915, 0x13595c17), TOBN(0xb9504668, 0x8f62b3a9),
1980 TOBN(0x907b5b24, 0xff3055b0), TOBN(0x2e995e35, 0x9a84f125),
1981 TOBN(0x87dacf69, 0x7e9bbcfb), TOBN(0x95d0c1d6, 0xe86d96e3),
1982 TOBN(0x65726e3c, 0x2d95a75c), TOBN(0x2c3c9001, 0xacd27f21),
1983 TOBN(0x1deab561, 0x6c973f57), TOBN(0x108b7e2c, 0xa5221643),
1984 TOBN(0x5fee9859, 0xc4ef79d4), TOBN(0xbd62b88a, 0x40d4b8c6),
1985 TOBN(0xb4dd29c4, 0x197c75d6), TOBN(0x266a6df2, 0xb7076feb),
1986 TOBN(0x9512d0ea, 0x4bf2df11), TOBN(0x1320c24f, 0x6b0cc9ec),
1987 TOBN(0x6bb1e0e1, 0x01a59596), TOBN(0x8317c5bb, 0xeff9aaac),
1988 TOBN(0x65bb405e, 0x385aa6c9), TOBN(0x613439c1, 0x8f07988f),
1989 TOBN(0xd730049f, 0x16a66e91), TOBN(0xe97f2820, 0xfa1b0e0d),
1990 TOBN(0x4131e003, 0x304c28ea), TOBN(0x820ab732, 0x526bac62),
1991 TOBN(0xb2ac9ef9, 0x28714423), TOBN(0x54ecfffa, 0xadb10cb2),
1992 TOBN(0x8781476e, 0xf886a4cc), TOBN(0x4b2c87b5, 0xdb2f8d49),
1993 TOBN(0xe857cd20, 0x0a44295d), TOBN(0x707d7d21, 0x58c6b044),
1994 TOBN(0xae8521f9, 0xf596757c), TOBN(0x87448f03, 0x67b2b714),
1995 TOBN(0x13a9bc45, 0x5ebcd58d), TOBN(0x79bcced9, 0x9122d3c1),
1996 TOBN(0x3c644247, 0x9e076642), TOBN(0x0cf22778, 0x2df4767d),
1997 TOBN(0x5e61aee4, 0x71d444b6), TOBN(0x211236bf, 0xc5084a1d),
1998 TOBN(0x7e15bc9a, 0x4fd3eaf6), TOBN(0x68df2c34, 0xab622bf5),
1999 TOBN(0x9e674f0f, 0x59bf4f36), TOBN(0xf883669b, 0xd7f34d73),
2000 TOBN(0xc48ac1b8, 0x31497b1d), TOBN(0x323b925d, 0x5106703b),
2001 TOBN(0x22156f42, 0x74082008), TOBN(0xeffc521a, 0xc8482bcb),
2002 TOBN(0x5c6831bf, 0x12173479), TOBN(0xcaa2528f, 0xc4739490),
2003 TOBN(0x84d2102a, 0x8f1b3c4d), TOBN(0xcf64dfc1, 0x2d9bec0d),
2004 TOBN(0x433febad, 0x78a546ef), TOBN(0x1f621ec3, 0x7b73cef1),
2005 TOBN(0x6aecd627, 0x37338615), TOBN(0x162082ab, 0x01d8edf6),
2006 TOBN(0x833a8119, 0x19e86b66), TOBN(0x6023a251, 0xd299b5db),
2007 TOBN(0xf5bb0c3a, 0xbbf04b89), TOBN(0x6735eb69, 0xae749a44),
2008 TOBN(0xd0e058c5, 0x4713de3b), TOBN(0xfdf2593e, 0x2c3d4ccd),
2009 TOBN(0x1b8f414e, 0xfdd23667), TOBN(0xdd52aaca, 0xfa2015ee),
2010 TOBN(0x3e31b517, 0xbd9625ff), TOBN(0x5ec9322d, 0x8db5918c),
2011 TOBN(0xbc73ac85, 0xa96f5294), TOBN(0x82aa5bf3, 0x61a0666a),
2012 TOBN(0x49755810, 0xbf08ac42), TOBN(0xd21cdfd5, 0x891cedfc),
2013 TOBN(0x918cb57b, 0x67f8be10), TOBN(0x365d1a7c, 0x56ffa726),
2014 TOBN(0x2435c504, 0x6532de93), TOBN(0xc0fc5e10, 0x2674cd02),
2015 TOBN(0x6e51fcf8, 0x9cbbb142), TOBN(0x1d436e5a, 0xafc50692),
2016 TOBN(0x766bffff, 0x3fbcae22), TOBN(0x3148c2fd, 0xfd55d3b8),
2017 TOBN(0x52c7fdc9, 0x233222fa), TOBN(0x89ff1092, 0xe419fb6b),
2018 TOBN(0x3cd6db99, 0x25254977), TOBN(0x2e85a161, 0x1cf12ca7),
2019 TOBN(0xadd2547c, 0xdc810bc9), TOBN(0xea3f458f, 0x9d257c22),
2020 TOBN(0x642c1fbe, 0x27d6b19b), TOBN(0xed07e6b5, 0x140481a6),
2021 TOBN(0x6ada1d42, 0x86d2e0f8), TOBN(0xe5920122, 0x0e8a9fd5),
2022 TOBN(0x02c936af, 0x708c1b49), TOBN(0x60f30fee, 0x2b4bfaff),
2023 TOBN(0x6637ad06, 0x858e6a61), TOBN(0xce4c7767, 0x3fd374d0),
2024 TOBN(0x39d54b2d, 0x7188defb), TOBN(0xa8c9d250, 0xf56a6b66),
2025 TOBN(0x58fc0f5e, 0xb24fe1dc), TOBN(0x9eaf9dee, 0x6b73f24c),
2026 TOBN(0xa90d588b, 0x33650705), TOBN(0xde5b62c5, 0xaf2ec729),
2027 TOBN(0x5c72cfae, 0xd3c2b36e), TOBN(0x868c19d5, 0x034435da),
2028 TOBN(0x88605f93, 0xe17ee145), TOBN(0xaa60c4ee, 0x77a5d5b1),
2029 TOBN(0xbcf5bfd2, 0x3b60c472), TOBN(0xaf4ef13c, 0xeb1d3049),
2030 TOBN(0x373f44fc, 0xe13895c9), TOBN(0xf29b382f, 0x0cbc9822),
2031 TOBN(0x1bfcb853, 0x73efaef6), TOBN(0xcf56ac9c, 0xa8c96f40),
2032 TOBN(0xd7adf109, 0x7a191e24), TOBN(0x98035f44, 0xbf8a8dc2),
2033 TOBN(0xf40a71b9, 0x1e750c84), TOBN(0xc57f7b0c, 0x5dc6c469),
2034 TOBN(0x49a0e79c, 0x6fbc19c1), TOBN(0x6b0f5889, 0xa48ebdb8),
2035 TOBN(0x5d3fd084, 0xa07c4e9f), TOBN(0xc3830111, 0xab27de14),
2036 TOBN(0x0e4929fe, 0x33e08dcc), TOBN(0xf4a5ad24, 0x40bb73a3),
2037 TOBN(0xde86c2bf, 0x490f97ca), TOBN(0x288f09c6, 0x67a1ce18),
2038 TOBN(0x364bb886, 0x1844478d), TOBN(0x7840fa42, 0xceedb040),
2039 TOBN(0x1269fdd2, 0x5a631b37), TOBN(0x94761f1e, 0xa47c8b7d),
2040 TOBN(0xfc0c2e17, 0x481c6266), TOBN(0x85e16ea2, 0x3daa5fa7),
2041 TOBN(0xccd86033, 0x92491048), TOBN(0x0c2f6963, 0xf4d402d7),
2042 TOBN(0x6336f7df, 0xdf6a865c), TOBN(0x0a2a463c, 0xb5c02a87),
2043 TOBN(0xb0e29be7, 0xbf2f12ee), TOBN(0xf0a22002, 0x66bad988),
2044 TOBN(0x27f87e03, 0x9123c1d7), TOBN(0x21669c55, 0x328a8c98),
2045 TOBN(0x186b9803, 0x92f14529), TOBN(0xd3d056cc, 0x63954df3),
2046 TOBN(0x2f03fd58, 0x175a46f6), TOBN(0x63e34ebe, 0x11558558),
2047 TOBN(0xe13fedee, 0x5b80cfa5), TOBN(0xe872a120, 0xd401dbd1),
2048 TOBN(0x52657616, 0xe8a9d667), TOBN(0xbc8da4b6, 0xe08d6693),
2049 TOBN(0x370fb9bb, 0x1b703e75), TOBN(0x6773b186, 0xd4338363),
2050 TOBN(0x18dad378, 0xecef7bff), TOBN(0xaac787ed, 0x995677da),
2051 TOBN(0x4801ea8b, 0x0437164b), TOBN(0xf430ad20, 0x73fe795e),
2052 TOBN(0xb164154d, 0x8ee5eb73), TOBN(0x0884ecd8, 0x108f7c0e),
2053 TOBN(0x0e6ec096, 0x5f520698), TOBN(0x640631fe, 0x44f7b8d9),
2054 TOBN(0x92fd34fc, 0xa35a68b9), TOBN(0x9c5a4b66, 0x4d40cf4e),
2055 TOBN(0x949454bf, 0x80b6783d), TOBN(0x80e701fe, 0x3a320a10),
2056 TOBN(0x8d1a564a, 0x1a0a39b2), TOBN(0x1436d53d, 0x320587db),
2057 TOBN(0xf5096e6d, 0x6556c362), TOBN(0xbc23a3c0, 0xe2455d7e),
2058 TOBN(0x3a7aee54, 0x807230f9), TOBN(0x9ba1cfa6, 0x22ae82fd),
2059 TOBN(0x833a057a, 0x99c5d706), TOBN(0x8be85f4b, 0x842315c9),
2060 TOBN(0xd083179a, 0x66a72f12), TOBN(0x2fc77d5d, 0xcdcc73cd),
2061 TOBN(0x22b88a80, 0x5616ee30), TOBN(0xfb09548f, 0xe7ab1083),
2062 TOBN(0x8ad6ab0d, 0x511270cd), TOBN(0x61f6c57a, 0x6924d9ab),
2063 TOBN(0xa0f7bf72, 0x90aecb08), TOBN(0x849f87c9, 0x0df784a4),
2064 TOBN(0x27c79c15, 0xcfaf1d03), TOBN(0xbbf9f675, 0xc463face),
2065 TOBN(0x91502c65, 0x765ba543), TOBN(0x18ce3cac, 0x42ea60dd),
2066 TOBN(0xe5cee6ac, 0x6e43ecb3), TOBN(0x63e4e910, 0x68f2aeeb),
2067 TOBN(0x26234fa3, 0xc85932ee), TOBN(0x96883e8b, 0x4c90c44d),
2068 TOBN(0x29b9e738, 0xa18a50f6), TOBN(0xbfc62b2a, 0x3f0420df),
2069 TOBN(0xd22a7d90, 0x6d3e1fa9), TOBN(0x17115618, 0xfe05b8a3),
2070 TOBN(0x2a0c9926, 0xbb2b9c01), TOBN(0xc739fcc6, 0xe07e76a2),
2071 TOBN(0x540e9157, 0x165e439a), TOBN(0x06353a62, 0x6a9063d8),
2072 TOBN(0x84d95594, 0x61e927a3), TOBN(0x013b9b26, 0xe2e0be7f),
2073 TOBN(0x4feaec3b, 0x973497f1), TOBN(0x15c0f94e, 0x093ebc2d),
2074 TOBN(0x6af5f227, 0x33af0583), TOBN(0x0c2af206, 0xc61f3340),
2075 TOBN(0xd25dbdf1, 0x4457397c), TOBN(0x2e8ed017, 0xcabcbae0),
2076 TOBN(0xe3010938, 0xc2815306), TOBN(0xbaa99337, 0xe8c6cd68),
2077 TOBN(0x08513182, 0x3b0ec7de), TOBN(0x1e1b822b, 0x58df05df),
2078 TOBN(0x5c14842f, 0xa5c3b683), TOBN(0x98fe977e, 0x3eba34ce),
2079 TOBN(0xfd2316c2, 0x0d5e8873), TOBN(0xe48d839a, 0xbd0d427d),
2080 TOBN(0x495b2218, 0x623fc961), TOBN(0x24ee56e7, 0xb46fba5e),
2081 TOBN(0x9184a55b, 0x91e4de58), TOBN(0xa7488ca5, 0xdfdea288),
2082 TOBN(0xa723862e, 0xa8dcc943), TOBN(0x92d762b2, 0x849dc0fc),
2083 TOBN(0x3c444a12, 0x091ff4a9), TOBN(0x581113fa, 0x0cada274),
2084 TOBN(0xb9de0a45, 0x30d8eae2), TOBN(0x5e0fcd85, 0xdf6b41ea),
2085 TOBN(0x6233ea68, 0xc094dbb5), TOBN(0xb77d062e, 0xd968d410),
2086 TOBN(0x3e719bbc, 0x58b3002d), TOBN(0x68e7dd3d, 0x3dc49d58),
2087 TOBN(0x8d825740, 0x013a5e58), TOBN(0x21311747, 0x3c9e3c1b),
2088 TOBN(0x0cb0a2a7, 0x7c99b6ab), TOBN(0x5c48a3b3, 0xc2f888f2)},
2089 {TOBN(0xc7913e91, 0x991724f3), TOBN(0x5eda799c, 0x39cbd686),
2090 TOBN(0xddb595c7, 0x63d4fc1e), TOBN(0x6b63b80b, 0xac4fed54),
2091 TOBN(0x6ea0fc69, 0x7e5fb516), TOBN(0x737708ba, 0xd0f1c964),
2092 TOBN(0x9628745f, 0x11a92ca5), TOBN(0x61f37958, 0x9a86967a),
2093 TOBN(0x9af39b2c, 0xaa665072), TOBN(0x78322fa4, 0xefd324ef),
2094 TOBN(0x3d153394, 0xc327bd31), TOBN(0x81d5f271, 0x3129dab0),
2095 TOBN(0xc72e0c42, 0xf48027f5), TOBN(0xaa40cdbc, 0x8536e717),
2096 TOBN(0xf45a657a, 0x2d369d0f), TOBN(0xb03bbfc4, 0xea7f74e6),
2097 TOBN(0x46a8c418, 0x0d738ded), TOBN(0x6f1a5bb0, 0xe0de5729),
2098 TOBN(0xf10230b9, 0x8ba81675), TOBN(0x32c6f30c, 0x112b33d4),
2099 TOBN(0x7559129d, 0xd8fffb62), TOBN(0x6a281b47, 0xb459bf05),
2100 TOBN(0x77c1bd3a, 0xfa3b6776), TOBN(0x0709b380, 0x7829973a),
2101 TOBN(0x8c26b232, 0xa3326505), TOBN(0x38d69272, 0xee1d41bf),
2102 TOBN(0x0459453e, 0xffe32afa), TOBN(0xce8143ad, 0x7cb3ea87),
2103 TOBN(0x932ec1fa, 0x7e6ab666), TOBN(0x6cd2d230, 0x22286264),
2104 TOBN(0x459a46fe, 0x6736f8ed), TOBN(0x50bf0d00, 0x9eca85bb),
2105 TOBN(0x0b825852, 0x877a21ec), TOBN(0x300414a7, 0x0f537a94),
2106 TOBN(0x3f1cba40, 0x21a9a6a2), TOBN(0x50824eee, 0x76943c00),
2107 TOBN(0xa0dbfcec, 0xf83cba5d), TOBN(0xf9538148, 0x93b4f3c0),
2108 TOBN(0x61744162, 0x48f24dd7), TOBN(0x5322d64d, 0xe4fb09dd),
2109 TOBN(0x57447384, 0x3d9325f3), TOBN(0xa9bef2d0, 0xf371cb84),
2110 TOBN(0x77d2188b, 0xa61e36c5), TOBN(0xbbd6a7d7, 0xc602df72),
2111 TOBN(0xba3aa902, 0x8f61bc0b), TOBN(0xf49085ed, 0x6ed0b6a1),
2112 TOBN(0x8bc625d6, 0xae6e8298), TOBN(0x832b0b1d, 0xa2e9c01d),
2113 TOBN(0xa337c447, 0xf1f0ced1), TOBN(0x800cc793, 0x9492dd2b),
2114 TOBN(0x4b93151d, 0xbea08efa), TOBN(0x820cf3f8, 0xde0a741e),
2115 TOBN(0xff1982dc, 0x1c0f7d13), TOBN(0xef921960, 0x84dde6ca),
2116 TOBN(0x1ad7d972, 0x45f96ee3), TOBN(0x319c8dbe, 0x29dea0c7),
2117 TOBN(0xd3ea3871, 0x7b82b99b), TOBN(0x75922d4d, 0x470eb624),
2118 TOBN(0x8f66ec54, 0x3b95d466), TOBN(0x66e673cc, 0xbee1e346),
2119 TOBN(0x6afe67c4, 0xb5f2b89a), TOBN(0x3de9c1e6, 0x290e5cd3),
2120 TOBN(0x8c278bb6, 0x310a2ada), TOBN(0x420fa384, 0x0bdb323b),
2121 TOBN(0x0ae1d63b, 0x0eb919b0), TOBN(0xd74ee51d, 0xa74b9620),
2122 TOBN(0x395458d0, 0xa674290c), TOBN(0x324c930f, 0x4620a510),
2123 TOBN(0x2d1f4d19, 0xfbac27d4), TOBN(0x4086e8ca, 0x9bedeeac),
2124 TOBN(0x0cdd211b, 0x9b679ab8), TOBN(0x5970167d, 0x7090fec4),
2125 TOBN(0x3420f2c9, 0xfaf1fc63), TOBN(0x616d333a, 0x328c8bb4),
2126 TOBN(0x7d65364c, 0x57f1fe4a), TOBN(0x9343e877, 0x55e5c73a),
2127 TOBN(0x5795176b, 0xe970e78c), TOBN(0xa36ccebf, 0x60533627),
2128 TOBN(0xfc7c7380, 0x09cdfc1b), TOBN(0xb39a2afe, 0xb3fec326),
2129 TOBN(0xb7ff1ba1, 0x6224408a), TOBN(0xcc856e92, 0x247cfc5e),
2130 TOBN(0x01f102e7, 0xc18bc493), TOBN(0x4613ab74, 0x2091c727),
2131 TOBN(0xaa25e89c, 0xc420bf2b), TOBN(0x00a53176, 0x90337ec2),
2132 TOBN(0xd2be9f43, 0x7d025fc7), TOBN(0x3316fb85, 0x6e6fe3dc),
2133 TOBN(0x27520af5, 0x9ac50814), TOBN(0xfdf95e78, 0x9a8e4223),
2134 TOBN(0xb7e7df2a, 0x56bec5a0), TOBN(0xf7022f7d, 0xdf159e5d),
2135 TOBN(0x93eeeab1, 0xcac1fe8f), TOBN(0x8040188c, 0x37451168),
2136 TOBN(0x7ee8aa8a, 0xd967dce6), TOBN(0xfa0e79e7, 0x3abc9299),
2137 TOBN(0x67332cfc, 0x2064cfd1), TOBN(0x339c31de, 0xb0651934),
2138 TOBN(0x719b28d5, 0x2a3bcbea), TOBN(0xee74c82b, 0x9d6ae5c6),
2139 TOBN(0x0927d05e, 0xbaf28ee6), TOBN(0x82cecf2c, 0x9d719028),
2140 TOBN(0x0b0d353e, 0xddb30289), TOBN(0xfe4bb977, 0xfddb2e29),
2141 TOBN(0xbb5bb990, 0x640bfd9e), TOBN(0xd226e277, 0x82f62108),
2142 TOBN(0x4bf00985, 0x02ffdd56), TOBN(0x7756758a, 0x2ca1b1b5),
2143 TOBN(0xc32b62a3, 0x5285fe91), TOBN(0xedbc546a, 0x8c9cd140),
2144 TOBN(0x1e47a013, 0xaf5cb008), TOBN(0xbca7e720, 0x073ce8f2),
2145 TOBN(0xe10b2ab8, 0x17a91cae), TOBN(0xb89aab65, 0x08e27f63),
2146 TOBN(0x7b3074a7, 0xdba3ddf9), TOBN(0x1c20ce09, 0x330c2972),
2147 TOBN(0x6b9917b4, 0x5fcf7e33), TOBN(0xe6793743, 0x945ceb42),
2148 TOBN(0x18fc2215, 0x5c633d19), TOBN(0xad1adb3c, 0xc7485474),
2149 TOBN(0x646f9679, 0x6424c49b), TOBN(0xf888dfe8, 0x67c241c9),
2150 TOBN(0xe12d4b93, 0x24f68b49), TOBN(0x9a6b62d8, 0xa571df20),
2151 TOBN(0x81b4b26d, 0x179483cb), TOBN(0x666f9632, 0x9511fae2),
2152 TOBN(0xd281b3e4, 0xd53aa51f), TOBN(0x7f96a765, 0x7f3dbd16),
2153 TOBN(0xa7f8b5bf, 0x074a30ce), TOBN(0xd7f52107, 0x005a32e6),
2154 TOBN(0x6f9e0907, 0x50237ed4), TOBN(0x2f21da47, 0x8096fa2b),
2155 TOBN(0xf3e19cb4, 0xeec863a0), TOBN(0xd18f77fd, 0x9527620a),
2156 TOBN(0x9505c81c, 0x407c1cf8), TOBN(0x9998db4e, 0x1b6ec284),
2157 TOBN(0x7e3389e5, 0xc247d44d), TOBN(0x12507141, 0x3f4f3d80),
2158 TOBN(0xd4ba0110, 0x4a78a6c7), TOBN(0x312874a0, 0x767720be),
2159 TOBN(0xded059a6, 0x75944370), TOBN(0xd6123d90, 0x3b2c0bdd),
2160 TOBN(0xa56b717b, 0x51c108e3), TOBN(0x9bb7940e, 0x070623e9),
2161 TOBN(0x794e2d59, 0x84ac066c), TOBN(0xf5954a92, 0xe68c69a0),
2162 TOBN(0x28c52458, 0x4fd99dcc), TOBN(0x60e639fc, 0xb1012517),
2163 TOBN(0xc2e60125, 0x7de79248), TOBN(0xe9ef6404, 0xf12fc6d7),
2164 TOBN(0x4c4f2808, 0x2a3b5d32), TOBN(0x865ad32e, 0xc768eb8a),
2165 TOBN(0xac02331b, 0x13fb70b6), TOBN(0x037b44c1, 0x95599b27),
2166 TOBN(0x1a860fc4, 0x60bd082c), TOBN(0xa2e25745, 0xc980cd01),
2167 TOBN(0xee3387a8, 0x1da0263e), TOBN(0x931bfb95, 0x2d10f3d6),
2168 TOBN(0x5b687270, 0xa1f24a32), TOBN(0xf140e65d, 0xca494b86),
2169 TOBN(0x4f4ddf91, 0xb2f1ac7a), TOBN(0xf99eaabb, 0x760fee27),
2170 TOBN(0x57f4008a, 0x49c228e5), TOBN(0x090be440, 0x1cf713bb),
2171 TOBN(0xac91fbe4, 0x5004f022), TOBN(0xd838c2c2, 0x569e1af6),
2172 TOBN(0xd6c7d20b, 0x0f1daaa5), TOBN(0xaa063ac1, 0x1bbb02c0),
2173 TOBN(0x0938a422, 0x59558a78), TOBN(0x5343c669, 0x8435da2f),
2174 TOBN(0x96f67b18, 0x034410dc), TOBN(0x7cc1e424, 0x84510804),
2175 TOBN(0x86a1543f, 0x16dfbb7d), TOBN(0x921fa942, 0x5b5bd592),
2176 TOBN(0x9dcccb6e, 0xb33dd03c), TOBN(0x8581ddd9, 0xb843f51e),
2177 TOBN(0x54935fcb, 0x81d73c9e), TOBN(0x6d07e979, 0x0a5e97ab),
2178 TOBN(0x4dc7b30a, 0xcf3a6bab), TOBN(0x147ab1f3, 0x170bee11),
2179 TOBN(0x0aaf8e3d, 0x9fafdee4), TOBN(0xfab3dbcb, 0x538a8b95),
2180 TOBN(0x405df4b3, 0x6ef13871), TOBN(0xf1f4e9cb, 0x088d5a49),
2181 TOBN(0x9bcd24d3, 0x66b33f1d), TOBN(0x3b97b820, 0x5ce445c0),
2182 TOBN(0xe2926549, 0xba93ff61), TOBN(0xd9c341ce, 0x4dafe616),
2183 TOBN(0xfb30a76e, 0x16efb6f3), TOBN(0xdf24b8ca, 0x605b953c),
2184 TOBN(0x8bd52afe, 0xc2fffb9f), TOBN(0xbbac5ff7, 0xe19d0b96),
2185 TOBN(0x43c01b87, 0x459afccd), TOBN(0x6bd45143, 0xb7432652),
2186 TOBN(0x84734530, 0x55b5d78e), TOBN(0x81088fdb, 0x1554ba7d),
2187 TOBN(0xada0a52c, 0x1e269375), TOBN(0xf9f037c4, 0x2dc5ec10),
2188 TOBN(0xc0660607, 0x94bfbc11), TOBN(0xc0a630bb, 0xc9c40d2f),
2189 TOBN(0x5efc797e, 0xab64c31e), TOBN(0xffdb1dab, 0x74507144),
2190 TOBN(0xf6124287, 0x1ca6790c), TOBN(0xe9609d81, 0xe69bf1bf),
2191 TOBN(0xdb898595, 0x00d24fc9), TOBN(0x9c750333, 0xe51fb417),
2192 TOBN(0x51830a91, 0xfef7bbde), TOBN(0x0ce67dc8, 0x945f585c),
2193 TOBN(0x9a730ed4, 0x4763eb50), TOBN(0x24a0e221, 0xc1ab0d66),
2194 TOBN(0x643b6393, 0x648748f3), TOBN(0x1982daa1, 0x6d3c6291),
2195 TOBN(0x6f00a9f7, 0x8bbc5549), TOBN(0x7a1783e1, 0x7f36384e),
2196 TOBN(0xe8346323, 0xde977f50), TOBN(0x91ab688d, 0xb245502a),
2197 TOBN(0x331ab6b5, 0x6d0bdd66), TOBN(0x0a6ef32e, 0x64b71229),
2198 TOBN(0x1028150e, 0xfe7c352f), TOBN(0x27e04350, 0xce7b39d3),
2199 TOBN(0x2a3c8acd, 0xc1070c82), TOBN(0xfb2034d3, 0x80c9feef),
2200 TOBN(0x2d729621, 0x709f3729), TOBN(0x8df290bf, 0x62cb4549),
2201 TOBN(0x02f99f33, 0xfc2e4326), TOBN(0x3b30076d, 0x5eddf032),
2202 TOBN(0xbb21f8cf, 0x0c652fb5), TOBN(0x314fb49e, 0xed91cf7b),
2203 TOBN(0xa013eca5, 0x2f700750), TOBN(0x2b9e3c23, 0x712a4575),
2204 TOBN(0xe5355557, 0xaf30fbb0), TOBN(0x1ada3516, 0x7c77e771),
2205 TOBN(0x45f6ecb2, 0x7b135670), TOBN(0xe85d19df, 0x7cfc202e),
2206 TOBN(0x0f1b50c7, 0x58d1be9f), TOBN(0x5ebf2c0a, 0xead2e344),
2207 TOBN(0x1531fe4e, 0xabc199c9), TOBN(0xc7032592, 0x56bab0ae),
2208 TOBN(0x16ab2e48, 0x6c1fec54), TOBN(0x0f87fda8, 0x04280188),
2209 TOBN(0xdc9f46fc, 0x609e4a74), TOBN(0x2a44a143, 0xba667f91),
2210 TOBN(0xbc3d8b95, 0xb4d83436), TOBN(0xa01e4bd0, 0xc7bd2958),
2211 TOBN(0x7b182932, 0x73483c90), TOBN(0xa79c6aa1, 0xa7c7b598),
2212 TOBN(0xbf3983c6, 0xeaaac07e), TOBN(0x8f18181e, 0x96e0d4e6),
2213 TOBN(0x8553d37c, 0x051af62b), TOBN(0xe9a998eb, 0x0bf94496),
2214 TOBN(0xe0844f9f, 0xb0d59aa1), TOBN(0x983fd558, 0xe6afb813),
2215 TOBN(0x9670c0ca, 0x65d69804), TOBN(0x732b22de, 0x6ea5ff2d),
2216 TOBN(0xd7640ba9, 0x5fd8623b), TOBN(0x9f619163, 0xa6351782),
2217 TOBN(0x0bfc27ee, 0xacee5043), TOBN(0xae419e73, 0x2eb10f02),
2218 TOBN(0x19c028d1, 0x8943fb05), TOBN(0x71f01cf7, 0xff13aa2a),
2219 TOBN(0x7790737e, 0x8887a132), TOBN(0x67513309, 0x66318410),
2220 TOBN(0x9819e8a3, 0x7ddb795e), TOBN(0xfecb8ef5, 0xdad100b2),
2221 TOBN(0x59f74a22, 0x3021926a), TOBN(0xb7c28a49, 0x6f9b4c1c),
2222 TOBN(0xed1a733f, 0x912ad0ab), TOBN(0x42a910af, 0x01a5659c),
2223 TOBN(0x3842c6e0, 0x7bd68cab), TOBN(0x2b57fa38, 0x76d70ac8),
2224 TOBN(0x8a6707a8, 0x3c53aaeb), TOBN(0x62c1c510, 0x65b4db18),
2225 TOBN(0x8de2c1fb, 0xb2d09dc7), TOBN(0xc3dfed12, 0x266bd23b),
2226 TOBN(0x927d039b, 0xd5b27db6), TOBN(0x2fb2f0f1, 0x103243da),
2227 TOBN(0xf855a07b, 0x80be7399), TOBN(0xed9327ce, 0x1f9f27a8),
2228 TOBN(0xa0bd99c7, 0x729bdef7), TOBN(0x2b67125e, 0x28250d88),
2229 TOBN(0x784b26e8, 0x8670ced7), TOBN(0xe3dfe41f, 0xc31bd3b4),
2230 TOBN(0x9e353a06, 0xbcc85cbc), TOBN(0x302e2909, 0x60178a9d),
2231 TOBN(0x860abf11, 0xa6eac16e), TOBN(0x76447000, 0xaa2b3aac),
2232 TOBN(0x46ff9d19, 0x850afdab), TOBN(0x35bdd6a5, 0xfdb2d4c1),
2233 TOBN(0xe82594b0, 0x7e5c9ce9), TOBN(0x0f379e53, 0x20af346e),
2234 TOBN(0x608b31e3, 0xbc65ad4a), TOBN(0x710c6b12, 0x267c4826),
2235 TOBN(0x51c966f9, 0x71954cf1), TOBN(0xb1cec793, 0x0d0aa215),
2236 TOBN(0x1f155989, 0x86bd23a8), TOBN(0xae2ff99c, 0xf9452e86),
2237 TOBN(0xd8dd953c, 0x340ceaa2), TOBN(0x26355275, 0x2e2e9333),
2238 TOBN(0x15d4e5f9, 0x8586f06d), TOBN(0xd6bf94a8, 0xf7cab546),
2239 TOBN(0x33c59a0a, 0xb76a9af0), TOBN(0x52740ab3, 0xba095af7),
2240 TOBN(0xc444de8a, 0x24389ca0), TOBN(0xcc6f9863, 0x706da0cb),
2241 TOBN(0xb5a741a7, 0x6b2515cf), TOBN(0x71c41601, 0x9585c749),
2242 TOBN(0x78350d4f, 0xe683de97), TOBN(0x31d61524, 0x63d0b5f5),
2243 TOBN(0x7a0cc5e1, 0xfbce090b), TOBN(0xaac927ed, 0xfbcb2a5b),
2244 TOBN(0xe920de49, 0x20d84c35), TOBN(0x8c06a0b6, 0x22b4de26),
2245 TOBN(0xd34dd58b, 0xafe7ddf3), TOBN(0x55851fed, 0xc1e6e55b),
2246 TOBN(0xd1395616, 0x960696e7), TOBN(0x940304b2, 0x5f22705f),
2247 TOBN(0x6f43f861, 0xb0a2a860), TOBN(0xcf121282, 0x0e7cc981),
2248 TOBN(0x12186212, 0x0ab64a96), TOBN(0x09215b9a, 0xb789383c),
2249 TOBN(0x311eb305, 0x37387c09), TOBN(0xc5832fce, 0xf03ee760),
2250 TOBN(0x30358f58, 0x32f7ea19), TOBN(0xe01d3c34, 0x91d53551),
2251 TOBN(0x1ca5ee41, 0xda48ea80), TOBN(0x34e71e8e, 0xcf4fa4c1),
2252 TOBN(0x312abd25, 0x7af1e1c7), TOBN(0xe3afcdeb, 0x2153f4a5),
2253 TOBN(0x9d5c84d7, 0x00235e9a), TOBN(0x0308d3f4, 0x8c4c836f),
2254 TOBN(0xc0a66b04, 0x89332de5), TOBN(0x610dd399, 0x89e566ef),
2255 TOBN(0xf8eea460, 0xd1ac1635), TOBN(0x84cbb3fb, 0x20a2c0df),
2256 TOBN(0x40afb488, 0xe74a48c5), TOBN(0x29738198, 0xd326b150),
2257 TOBN(0x2a17747f, 0xa6d74081), TOBN(0x60ea4c05, 0x55a26214),
2258 TOBN(0x53514bb4, 0x1f88c5fe), TOBN(0xedd64567, 0x7e83426c),
2259 TOBN(0xd5d6cbec, 0x96460b25), TOBN(0xa12fd0ce, 0x68dc115e),
2260 TOBN(0xc5bc3ed2, 0x697840ea), TOBN(0x969876a8, 0xa6331e31),
2261 TOBN(0x60c36217, 0x472ff580), TOBN(0xf4229705, 0x4ad41393),
2262 TOBN(0x4bd99ef0, 0xa03b8b92), TOBN(0x501c7317, 0xc144f4f6),
2263 TOBN(0x159009b3, 0x18464945), TOBN(0x6d5e594c, 0x74c5c6be),
2264 TOBN(0x2d587011, 0x321a3660), TOBN(0xd1e184b1, 0x3898d022),
2265 TOBN(0x5ba04752, 0x4c6a7e04), TOBN(0x47fa1e2b, 0x45550b65),
2266 TOBN(0x9419daf0, 0x48c0a9a5), TOBN(0x66362953, 0x7c243236),
2267 TOBN(0xcd0744b1, 0x5cb12a88), TOBN(0x561b6f9a, 0x2b646188),
2268 TOBN(0x599415a5, 0x66c2c0c0), TOBN(0xbe3f0859, 0x0f83f09a),
2269 TOBN(0x9141c5be, 0xb92041b8), TOBN(0x01ae38c7, 0x26477d0d),
2270 TOBN(0xca8b71f3, 0xd12c7a94), TOBN(0xfab5b31f, 0x765c70db),
2271 TOBN(0x76ae7492, 0x487443e9), TOBN(0x8595a310, 0x990d1349),
2272 TOBN(0xf8dbeda8, 0x7d460a37), TOBN(0x7f7ad082, 0x1e45a38f),
2273 TOBN(0xed1d4db6, 0x1059705a), TOBN(0xa3dd492a, 0xe6b9c697),
2274 TOBN(0x4b92ee3a, 0x6eb38bd5), TOBN(0xbab2609d, 0x67cc0bb7),
2275 TOBN(0x7fc4fe89, 0x6e70ee82), TOBN(0xeff2c56e, 0x13e6b7e3),
2276 TOBN(0x9b18959e, 0x34d26fca), TOBN(0x2517ab66, 0x889d6b45),
2277 TOBN(0xf167b4e0, 0xbdefdd4f), TOBN(0x69958465, 0xf366e401),
2278 TOBN(0x5aa368ab, 0xa73bbec0), TOBN(0x12148709, 0x7b240c21),
2279 TOBN(0x378c3233, 0x18969006), TOBN(0xcb4d73ce, 0xe1fe53d1),
2280 TOBN(0x5f50a80e, 0x130c4361), TOBN(0xd67f5951, 0x7ef5212b),
2281 TOBN(0xf145e21e, 0x9e70c72e), TOBN(0xb2e52e29, 0x5566d2fb),
2282 TOBN(0x44eaba4a, 0x032397f5), TOBN(0x5e56937b, 0x7e31a7de),
2283 TOBN(0x68dcf517, 0x456c61e1), TOBN(0xbc2e954a, 0xa8b0a388),
2284 TOBN(0xe3552fa7, 0x60a8b755), TOBN(0x03442dae, 0x73ad0cde),
2285 TOBN(0x37ffe747, 0xceb26210), TOBN(0x983545e8, 0x787baef9),
2286 TOBN(0x8b8c8535, 0x86a3de31), TOBN(0xc621dbcb, 0xfacd46db),
2287 TOBN(0x82e442e9, 0x59266fbb), TOBN(0xa3514c37, 0x339d471c),
2288 TOBN(0x3a11b771, 0x62cdad96), TOBN(0xf0cb3b3c, 0xecf9bdf0),
2289 TOBN(0x3fcbdbce, 0x478e2135), TOBN(0x7547b5cf, 0xbda35342),
2290 TOBN(0xa97e81f1, 0x8a677af6), TOBN(0xc8c2bf83, 0x28817987),
2291 TOBN(0xdf07eaaf, 0x45580985), TOBN(0xc68d1f05, 0xc93b45cb),
2292 TOBN(0x106aa2fe, 0xc77b4cac), TOBN(0x4c1d8afc, 0x04a7ae86),
2293 TOBN(0xdb41c3fd, 0x9eb45ab2), TOBN(0x5b234b5b, 0xd4b22e74),
2294 TOBN(0xda253dec, 0xf215958a), TOBN(0x67e0606e, 0xa04edfa0),
2295 TOBN(0xabbbf070, 0xef751b11), TOBN(0xf352f175, 0xf6f06dce),
2296 TOBN(0xdfc4b6af, 0x6839f6b4), TOBN(0x53ddf9a8, 0x9959848e),
2297 TOBN(0xda49c379, 0xc21520b0), TOBN(0x90864ff0, 0xdbd5d1b6),
2298 TOBN(0x2f055d23, 0x5f49c7f7), TOBN(0xe51e4e6a, 0xa796b2d8),
2299 TOBN(0xc361a67f, 0x5c9dc340), TOBN(0x5ad53c37, 0xbca7c620),
2300 TOBN(0xda1d6588, 0x32c756d0), TOBN(0xad60d911, 0x8bb67e13),
2301 TOBN(0xd6c47bdf, 0x0eeec8c6), TOBN(0x4a27fec1, 0x078a1821),
2302 TOBN(0x081f7415, 0xc3099524), TOBN(0x8effdf0b, 0x82cd8060),
2303 TOBN(0xdb70ec1c, 0x65842df8), TOBN(0x8821b358, 0xd319a901),
2304 TOBN(0x72ee56ee, 0xde42b529), TOBN(0x5bb39592, 0x236e4286),
2305 TOBN(0xd1183316, 0xfd6f7140), TOBN(0xf9fadb5b, 0xbd8e81f7),
2306 TOBN(0x701d5e0c, 0x5a02d962), TOBN(0xfdee4dbf, 0x1b601324),
2307 TOBN(0xbed17407, 0x35d7620e), TOBN(0x04e3c2c3, 0xf48c0012),
2308 TOBN(0x9ee29da7, 0x3455449a), TOBN(0x562cdef4, 0x91a836c4),
2309 TOBN(0x8f682a5f, 0x47701097), TOBN(0x617125d8, 0xff88d0c2),
2310 TOBN(0x948fda24, 0x57bb86dd), TOBN(0x348abb8f, 0x289f7286),
2311 TOBN(0xeb10eab5, 0x99d94bbd), TOBN(0xd51ba28e, 0x4684d160),
2312 TOBN(0xabe0e51c, 0x30c8f41a), TOBN(0x66588b45, 0x13254f4a),
2313 TOBN(0x147ebf01, 0xfad097a5), TOBN(0x49883ea8, 0x610e815d),
2314 TOBN(0xe44d60ba, 0x8a11de56), TOBN(0xa970de6e, 0x827a7a6d),
2315 TOBN(0x2be41424, 0x5e17fc19), TOBN(0xd833c657, 0x01214057),
2316 TOBN(0x1375813b, 0x363e723f), TOBN(0x6820bb88, 0xe6a52e9b),
2317 TOBN(0x7e7f6970, 0xd875d56a), TOBN(0xd6a0a9ac, 0x51fbf6bf),
2318 TOBN(0x54ba8790, 0xa3083c12), TOBN(0xebaeb23d, 0x6ae7eb64),
2319 TOBN(0xa8685c3a, 0xb99a907a), TOBN(0xf1e74550, 0x026bf40b),
2320 TOBN(0x7b73a027, 0xc802cd9e), TOBN(0x9a8a927c, 0x4fef4635),
2321 TOBN(0xe1b6f60c, 0x08191224), TOBN(0xc4126ebb, 0xde4ec091),
2322 TOBN(0xe1dff4dc, 0x4ae38d84), TOBN(0xde3f57db, 0x4f2ef985),
2323 TOBN(0x34964337, 0xd446a1dd), TOBN(0x7bf217a0, 0x859e77f6),
2324 TOBN(0x8ff10527, 0x8e1d13f5), TOBN(0xa304ef03, 0x74eeae27),
2325 TOBN(0xfc6f5e47, 0xd19dfa5a), TOBN(0xdb007de3, 0x7fad982b),
2326 TOBN(0x28205ad1, 0x613715f5), TOBN(0x251e6729, 0x7889529e),
2327 TOBN(0x72705184, 0x1ae98e78), TOBN(0xf818537d, 0x271cac32),
2328 TOBN(0xc8a15b7e, 0xb7f410f5), TOBN(0xc474356f, 0x81f62393),
2329 TOBN(0x92dbdc5a, 0xc242316b), TOBN(0xabe060ac, 0xdbf4aff5),
2330 TOBN(0x6e8c38fe, 0x909a8ec6), TOBN(0x43e514e5, 0x6116cb94),
2331 TOBN(0x2078fa38, 0x07d784f9), TOBN(0x1161a880, 0xf4b5b357),
2332 TOBN(0x5283ce79, 0x13adea3d), TOBN(0x0756c3e6, 0xcc6a910b),
2333 TOBN(0x60bcfe01, 0xaaa79697), TOBN(0x04a73b29, 0x56391db1),
2334 TOBN(0xdd8dad47, 0x189b45a0), TOBN(0xbfac0dd0, 0x48d5b8d9),
2335 TOBN(0x34ab3af5, 0x7d3d2ec2), TOBN(0x6fa2fc2d, 0x207bd3af),
2336 TOBN(0x9ff40092, 0x66550ded), TOBN(0x719b3e87, 0x1fd5b913),
2337 TOBN(0xa573a496, 0x6d17fbc7), TOBN(0x0cd1a70a, 0x73d2b24e),
2338 TOBN(0x34e2c5ca, 0xb2676937), TOBN(0xe7050b06, 0xbf669f21),
2339 TOBN(0xfbe948b6, 0x1ede9046), TOBN(0xa0530051, 0x97662659),
2340 TOBN(0x58cbd4ed, 0xf10124c5), TOBN(0xde2646e4, 0xdd6c06c8),
2341 TOBN(0x332f8108, 0x8cad38c0), TOBN(0x471b7e90, 0x6bd68ae2),
2342 TOBN(0x56ac3fb2, 0x0d8e27a3), TOBN(0xb54660db, 0x136b4b0d),
2343 TOBN(0x123a1e11, 0xa6fd8de4), TOBN(0x44dbffea, 0xa37799ef),
2344 TOBN(0x4540b977, 0xce6ac17c), TOBN(0x495173a8, 0xaf60acef)},
2345 {TOBN(0x9ebb284d, 0x391c2a82), TOBN(0xbcdd4863, 0x158308e8),
2346 TOBN(0x006f16ec, 0x83f1edca), TOBN(0xa13e2c37, 0x695dc6c8),
2347 TOBN(0x2ab756f0, 0x4a057a87), TOBN(0xa8765500, 0xa6b48f98),
2348 TOBN(0x4252face, 0x68651c44), TOBN(0xa52b540b, 0xe1765e02),
2349 TOBN(0x4f922fc5, 0x16a0d2bb), TOBN(0x0d5cc16c, 0x1a623499),
2350 TOBN(0x9241cf3a, 0x57c62c8b), TOBN(0x2f5e6961, 0xfd1b667f),
2351 TOBN(0x5c15c70b, 0xf5a01797), TOBN(0x3d20b44d, 0x60956192),
2352 TOBN(0x04911b37, 0x071fdb52), TOBN(0xf648f916, 0x8d6f0f7b),
2353 TOBN(0x6dc1acaf, 0xe60b7cf7), TOBN(0x25860a50, 0x84a9d869),
2354 TOBN(0x56fc6f09, 0xe7ba8ac4), TOBN(0x828c5bd0, 0x6148d29e),
2355 TOBN(0xac6b435e, 0xdc55ae5f), TOBN(0xa527f56c, 0xc0117411),
2356 TOBN(0x94d5045e, 0xfd24342c), TOBN(0x2c4c0a35, 0x70b67c0d),
2357 TOBN(0x027cc8b8, 0xfac61d9a), TOBN(0x7d25e062, 0xe3c6fe8a),
2358 TOBN(0xe08805bf, 0xe5bff503), TOBN(0x13271e6c, 0x6ff632f7),
2359 TOBN(0x55dca6c0, 0x232f76a5), TOBN(0x8957c32d, 0x701ef426),
2360 TOBN(0xee728bcb, 0xa10a5178), TOBN(0x5ea60411, 0xb62c5173),
2361 TOBN(0xfc4e964e, 0xd0b8892b), TOBN(0x9ea17683, 0x9301bb74),
2362 TOBN(0x6265c5ae, 0xfcc48626), TOBN(0xe60cf82e, 0xbb3e9102),
2363 TOBN(0x57adf797, 0xd4df5531), TOBN(0x235b59a1, 0x8deeefe2),
2364 TOBN(0x60adcf58, 0x3f306eb1), TOBN(0x105c2753, 0x3d09492d),
2365 TOBN(0x4090914b, 0xb5def996), TOBN(0x1cb69c83, 0x233dd1e7),
2366 TOBN(0xc1e9c1d3, 0x9b3d5e76), TOBN(0x1f3338ed, 0xfccf6012),
2367 TOBN(0xb1e95d0d, 0x2f5378a8), TOBN(0xacf4c2c7, 0x2f00cd21),
2368 TOBN(0x6e984240, 0xeb5fe290), TOBN(0xd66c038d, 0x248088ae),
2369 TOBN(0x804d264a, 0xf94d70cf), TOBN(0xbdb802ef, 0x7314bf7e),
2370 TOBN(0x8fb54de2, 0x4333ed02), TOBN(0x740461e0, 0x285635d9),
2371 TOBN(0x4113b2c8, 0x365e9383), TOBN(0xea762c83, 0x3fdef652),
2372 TOBN(0x4eec6e2e, 0x47b956c1), TOBN(0xa3d814be, 0x65620fa4),
2373 TOBN(0x9ad5462b, 0xb4d8bc50), TOBN(0x181c0b16, 0xa9195770),
2374 TOBN(0xebd4fe1c, 0x78412a68), TOBN(0xae0341bc, 0xc0dff48c),
2375 TOBN(0xb6bc45cf, 0x7003e866), TOBN(0xf11a6dea, 0x8a24a41b),
2376 TOBN(0x5407151a, 0xd04c24c2), TOBN(0x62c9d27d, 0xda5b7b68),
2377 TOBN(0x2e964235, 0x88cceff6), TOBN(0x8594c54f, 0x8b07ed69),
2378 TOBN(0x1578e73c, 0xc84d0d0d), TOBN(0x7b4e1055, 0xff532868),
2379 TOBN(0xa348c0d5, 0xb5ec995a), TOBN(0xbf4b9d55, 0x14289a54),
2380 TOBN(0x9ba155a6, 0x58fbd777), TOBN(0x186ed7a8, 0x1a84491d),
2381 TOBN(0xd4992b30, 0x614c0900), TOBN(0xda98d121, 0xbd00c24b),
2382 TOBN(0x7f534dc8, 0x7ec4bfa1), TOBN(0x4a5ff674, 0x37dc34bc),
2383 TOBN(0x68c196b8, 0x1d7ea1d7), TOBN(0x38cf2893, 0x80a6d208),
2384 TOBN(0xfd56cd09, 0xe3cbbd6e), TOBN(0xec72e27e, 0x4205a5b6),
2385 TOBN(0x15ea68f5, 0xa44f77f7), TOBN(0x7aa5f9fd, 0xb43c52bc),
2386 TOBN(0x86ff676f, 0x94f0e609), TOBN(0xa4cde963, 0x2e2d432b),
2387 TOBN(0x8cafa0c0, 0xeee470af), TOBN(0x84137d0e, 0x8a3f5ec8),
2388 TOBN(0xebb40411, 0xfaa31231), TOBN(0xa239c13f, 0x6f7f7ccf),
2389 TOBN(0x32865719, 0xa8afd30b), TOBN(0x86798328, 0x8a826dce),
2390 TOBN(0xdf04e891, 0xc4a8fbe0), TOBN(0xbb6b6e1b, 0xebf56ad3),
2391 TOBN(0x0a695b11, 0x471f1ff0), TOBN(0xd76c3389, 0xbe15baf0),
2392 TOBN(0x018edb95, 0xbe96c43e), TOBN(0xf2beaaf4, 0x90794158),
2393 TOBN(0x152db09e, 0xc3076a27), TOBN(0x5e82908e, 0xe416545d),
2394 TOBN(0xa2c41272, 0x356d6f2e), TOBN(0xdc9c9642, 0x31fd74e1),
2395 TOBN(0x66ceb88d, 0x519bf615), TOBN(0xe29ecd76, 0x05a2274e),
2396 TOBN(0x3a0473c4, 0xbf5e2fa0), TOBN(0x6b6eb671, 0x64284e67),
2397 TOBN(0xe8b97932, 0xb88756dd), TOBN(0xed4e8652, 0xf17e3e61),
2398 TOBN(0xc2dd1499, 0x3ee1c4a4), TOBN(0xc0aaee17, 0x597f8c0e),
2399 TOBN(0x15c4edb9, 0x6c168af3), TOBN(0x6563c7bf, 0xb39ae875),
2400 TOBN(0xadfadb6f, 0x20adb436), TOBN(0xad55e8c9, 0x9a042ac0),
2401 TOBN(0x975a1ed8, 0xb76da1f5), TOBN(0x10dfa466, 0xa58acb94),
2402 TOBN(0x8dd7f7e3, 0xac060282), TOBN(0x6813e66a, 0x572a051e),
2403 TOBN(0xb4ccae1e, 0x350cb901), TOBN(0xb653d656, 0x50cb7822),
2404 TOBN(0x42484710, 0xdfab3b87), TOBN(0xcd7ee537, 0x9b670fd0),
2405 TOBN(0x0a50b12e, 0x523b8bf6), TOBN(0x8009eb5b, 0x8f910c1b),
2406 TOBN(0xf535af82, 0x4a167588), TOBN(0x0f835f9c, 0xfb2a2abd),
2407 TOBN(0xf59b2931, 0x2afceb62), TOBN(0xc797df2a, 0x169d383f),
2408 TOBN(0xeb3f5fb0, 0x66ac02b0), TOBN(0x029d4c6f, 0xdaa2d0ca),
2409 TOBN(0xd4059bc1, 0xafab4bc5), TOBN(0x833f5c6f, 0x56783247),
2410 TOBN(0xb5346630, 0x8d2d3605), TOBN(0x83387891, 0xd34d8433),
2411 TOBN(0xd973b30f, 0xadd9419a), TOBN(0xbcca1099, 0xafe3fce8),
2412 TOBN(0x08178315, 0x0809aac6), TOBN(0x01b7f21a, 0x540f0f11),
2413 TOBN(0x65c29219, 0x909523c8), TOBN(0xa62f648f, 0xa3a1c741),
2414 TOBN(0x88598d4f, 0x60c9e55a), TOBN(0xbce9141b, 0x0e4f347a),
2415 TOBN(0x9af97d84, 0x35f9b988), TOBN(0x0210da62, 0x320475b6),
2416 TOBN(0x3c076e22, 0x9191476c), TOBN(0x7520dbd9, 0x44fc7834),
2417 TOBN(0x6a6b2cfe, 0xc1ab1bbd), TOBN(0xef8a65be, 0xdc650938),
2418 TOBN(0x72855540, 0x805d7bc4), TOBN(0xda389396, 0xed11fdfd),
2419 TOBN(0xa9d5bd36, 0x74660876), TOBN(0x11d67c54, 0xb45dff35),
2420 TOBN(0x6af7d148, 0xa4f5da94), TOBN(0xbb8d4c3f, 0xc0bbeb31),
2421 TOBN(0x87a7ebd1, 0xe0a1b12a), TOBN(0x1e4ef88d, 0x770ba95f),
2422 TOBN(0x8c33345c, 0xdc2ae9cb), TOBN(0xcecf1276, 0x01cc8403),
2423 TOBN(0x687c012e, 0x1b39b80f), TOBN(0xfd90d0ad, 0x35c33ba4),
2424 TOBN(0xa3ef5a67, 0x5c9661c2), TOBN(0x368fc88e, 0xe017429e),
2425 TOBN(0xd30c6761, 0x196a2fa2), TOBN(0x931b9817, 0xbd5b312e),
2426 TOBN(0xba01000c, 0x72f54a31), TOBN(0xa203d2c8, 0x66eaa541),
2427 TOBN(0xf2abdee0, 0x98939db3), TOBN(0xe37d6c2c, 0x3e606c02),
2428 TOBN(0xf2921574, 0x521ff643), TOBN(0x2781b3c4, 0xd7e2fca3),
2429 TOBN(0x664300b0, 0x7850ec06), TOBN(0xac5a38b9, 0x7d3a10cf),
2430 TOBN(0x9233188d, 0xe34ab39d), TOBN(0xe77057e4, 0x5072cbb9),
2431 TOBN(0xbcf0c042, 0xb59e78df), TOBN(0x4cfc91e8, 0x1d97de52),
2432 TOBN(0x4661a26c, 0x3ee0ca4a), TOBN(0x5620a4c1, 0xfb8507bc),
2433 TOBN(0x4b44d4aa, 0x049f842c), TOBN(0xceabc5d5, 0x1540e82b),
2434 TOBN(0x306710fd, 0x15c6f156), TOBN(0xbe5ae52b, 0x63db1d72),
2435 TOBN(0x06f1e7e6, 0x334957f1), TOBN(0x57e388f0, 0x31144a70),
2436 TOBN(0xfb69bb2f, 0xdf96447b), TOBN(0x0f78ebd3, 0x73e38a12),
2437 TOBN(0xb8222605, 0x2b7ce542), TOBN(0xe6d4ce99, 0x7472bde1),
2438 TOBN(0x53e16ebe, 0x09d2f4da), TOBN(0x180ff42e, 0x53b92b2e),
2439 TOBN(0xc59bcc02, 0x2c34a1c6), TOBN(0x3803d6f9, 0x422c46c2),
2440 TOBN(0x18aff74f, 0x5c14a8a2), TOBN(0x55aebf80, 0x10a08b28),
2441 TOBN(0x66097d58, 0x7135593f), TOBN(0x32e6eff7, 0x2be570cd),
2442 TOBN(0x584e6a10, 0x2a8c860d), TOBN(0xcd185890, 0xa2eb4163),
2443 TOBN(0x7ceae99d, 0x6d97e134), TOBN(0xd42c6b70, 0xdd8447ce),
2444 TOBN(0x59ddbb4a, 0xb8c50273), TOBN(0x03c612df, 0x3cf34e1e),
2445 TOBN(0x84b9ca15, 0x04b6c5a0), TOBN(0x35216f39, 0x18f0e3a3),
2446 TOBN(0x3ec2d2bc, 0xbd986c00), TOBN(0x8bf546d9, 0xd19228fe),
2447 TOBN(0xd1c655a4, 0x4cd623c3), TOBN(0x366ce718, 0x502b8e5a),
2448 TOBN(0x2cfc84b4, 0xeea0bfe7), TOBN(0xe01d5cee, 0xcf443e8e),
2449 TOBN(0x8ec045d9, 0x036520f8), TOBN(0xdfb3c3d1, 0x92d40e98),
2450 TOBN(0x0bac4cce, 0xcc559a04), TOBN(0x35eccae5, 0x240ea6b1),
2451 TOBN(0x180b32db, 0xf8a5a0ac), TOBN(0x547972a5, 0xeb699700),
2452 TOBN(0xa3765801, 0xca26bca0), TOBN(0x57e09d0e, 0xa647f25a),
2453 TOBN(0xb956970e, 0x2fdd23cc), TOBN(0xb80288bc, 0x5682e971),
2454 TOBN(0xe6e6d91e, 0x9ae86ebc), TOBN(0x0564c83f, 0x8c9f1939),
2455 TOBN(0x551932a2, 0x39560368), TOBN(0xe893752b, 0x049c28e2),
2456 TOBN(0x0b03cee5, 0xa6a158c3), TOBN(0xe12d656b, 0x04964263),
2457 TOBN(0x4b47554e, 0x63e3bc1d), TOBN(0xc719b6a2, 0x45044ff7),
2458 TOBN(0x4f24d30a, 0xe48daa07), TOBN(0xa3f37556, 0xc8c1edc3),
2459 TOBN(0x9a47bf76, 0x0700d360), TOBN(0xbb1a1824, 0x822ae4e2),
2460 TOBN(0x22e275a3, 0x89f1fb4c), TOBN(0x72b1aa23, 0x9968c5f5),
2461 TOBN(0xa75feaca, 0xbe063f64), TOBN(0x9b392f43, 0xbce47a09),
2462 TOBN(0xd4241509, 0x1ad07aca), TOBN(0x4b0c591b, 0x8d26cd0f),
2463 TOBN(0x2d42ddfd, 0x92f1169a), TOBN(0x63aeb1ac, 0x4cbf2392),
2464 TOBN(0x1de9e877, 0x0691a2af), TOBN(0xebe79af7, 0xd98021da),
2465 TOBN(0xcfdf2a4e, 0x40e50acf), TOBN(0xf0a98ad7, 0xaf01d665),
2466 TOBN(0xefb640bf, 0x1831be1f), TOBN(0x6fe8bd2f, 0x80e9ada0),
2467 TOBN(0x94c103a1, 0x6cafbc91), TOBN(0x170f8759, 0x8308e08c),
2468 TOBN(0x5de2d2ab, 0x9780ff4f), TOBN(0x666466bc, 0x45b201f2),
2469 TOBN(0x58af2010, 0xf5b343bc), TOBN(0x0f2e400a, 0xf2f142fe),
2470 TOBN(0x3483bfde, 0xa85f4bdf), TOBN(0xf0b1d093, 0x03bfeaa9),
2471 TOBN(0x2ea01b95, 0xc7081603), TOBN(0xe943e4c9, 0x3dba1097),
2472 TOBN(0x47be92ad, 0xb438f3a6), TOBN(0x00bb7742, 0xe5bf6636),
2473 TOBN(0x136b7083, 0x824297b4), TOBN(0x9d0e5580, 0x5584455f),
2474 TOBN(0xab48cedc, 0xf1c7d69e), TOBN(0x53a9e481, 0x2a256e76),
2475 TOBN(0x0402b0e0, 0x65eb2413), TOBN(0xdadbbb84, 0x8fc407a7),
2476 TOBN(0xa65cd5a4, 0x8d7f5492), TOBN(0x21d44293, 0x74bae294),
2477 TOBN(0x66917ce6, 0x3b5f1cc4), TOBN(0x37ae52ea, 0xce872e62),
2478 TOBN(0xbb087b72, 0x2905f244), TOBN(0x12077086, 0x1e6af74f),
2479 TOBN(0x4b644e49, 0x1058edea), TOBN(0x827510e3, 0xb638ca1d),
2480 TOBN(0x8cf2b704, 0x6038591c), TOBN(0xffc8b47a, 0xfe635063),
2481 TOBN(0x3ae220e6, 0x1b4d5e63), TOBN(0xbd864742, 0x9d961b4b),
2482 TOBN(0x610c107e, 0x9bd16bed), TOBN(0x4270352a, 0x1127147b),
2483 TOBN(0x7d17ffe6, 0x64cfc50e), TOBN(0x50dee01a, 0x1e36cb42),
2484 TOBN(0x068a7622, 0x35dc5f9a), TOBN(0x9a08d536, 0xdf53f62c),
2485 TOBN(0x4ed71457, 0x6be5f7de), TOBN(0xd93006f8, 0xc2263c9e),
2486 TOBN(0xe073694c, 0xcacacb36), TOBN(0x2ff7a5b4, 0x3ae118ab),
2487 TOBN(0x3cce53f1, 0xcd871236), TOBN(0xf156a39d, 0xc2aa6d52),
2488 TOBN(0x9cc5f271, 0xb198d76d), TOBN(0xbc615b6f, 0x81383d39),
2489 TOBN(0xa54538e8, 0xde3eee6b), TOBN(0x58c77538, 0xab910d91),
2490 TOBN(0x31e5bdbc, 0x58d278bd), TOBN(0x3cde4adf, 0xb963acae),
2491 TOBN(0xb1881fd2, 0x5302169c), TOBN(0x8ca60fa0, 0xa989ed8b),
2492 TOBN(0xa1999458, 0xff96a0ee), TOBN(0xc1141f03, 0xac6c283d),
2493 TOBN(0x7677408d, 0x6dfafed3), TOBN(0x33a01653, 0x39661588),
2494 TOBN(0x3c9c15ec, 0x0b726fa0), TOBN(0x090cfd93, 0x6c9b56da),
2495 TOBN(0xe34f4bae, 0xa3c40af5), TOBN(0x3469eadb, 0xd21129f1),
2496 TOBN(0xcc51674a, 0x1e207ce8), TOBN(0x1e293b24, 0xc83b1ef9),
2497 TOBN(0x17173d13, 0x1e6c0bb4), TOBN(0x19004695, 0x90776d35),
2498 TOBN(0xe7980e34, 0x6de6f922), TOBN(0x873554cb, 0xf4dd9a22),
2499 TOBN(0x0316c627, 0xcbf18a51), TOBN(0x4d93651b, 0x3032c081),
2500 TOBN(0x207f2771, 0x3946834d), TOBN(0x2c08d7b4, 0x30cdbf80),
2501 TOBN(0x137a4fb4, 0x86df2a61), TOBN(0xa1ed9c07, 0xecf7b4a2),
2502 TOBN(0xb2e460e2, 0x7bd042ff), TOBN(0xb7f5e2fa, 0x5f62f5ec),
2503 TOBN(0x7aa6ec6b, 0xcc2423b7), TOBN(0x75ce0a7f, 0xba63eea7),
2504 TOBN(0x67a45fb1, 0xf250a6e1), TOBN(0x93bc919c, 0xe53cdc9f),
2505 TOBN(0x9271f56f, 0x871942df), TOBN(0x2372ff6f, 0x7859ad66),
2506 TOBN(0x5f4c2b96, 0x33cb1a78), TOBN(0xe3e29101, 0x5838aa83),
2507 TOBN(0xa7ed1611, 0xe4e8110c), TOBN(0x2a2d70d5, 0x330198ce),
2508 TOBN(0xbdf132e8, 0x6720efe0), TOBN(0xe61a8962, 0x66a471bf),
2509 TOBN(0x796d3a85, 0x825808bd), TOBN(0x51dc3cb7, 0x3fd6e902),
2510 TOBN(0x643c768a, 0x916219d1), TOBN(0x36cd7685, 0xa2ad7d32),
2511 TOBN(0xe3db9d05, 0xb22922a4), TOBN(0x6494c87e, 0xdba29660),
2512 TOBN(0xf0ac91df, 0xbcd2ebc7), TOBN(0x4deb57a0, 0x45107f8d),
2513 TOBN(0x42271f59, 0xc3d12a73), TOBN(0x5f71687c, 0xa5c2c51d),
2514 TOBN(0xcb1f50c6, 0x05797bcb), TOBN(0x29ed0ed9, 0xd6d34eb0),
2515 TOBN(0xe5fe5b47, 0x4683c2eb), TOBN(0x4956eeb5, 0x97447c46),
2516 TOBN(0x5b163a43, 0x71207167), TOBN(0x93fa2fed, 0x0248c5ef),
2517 TOBN(0x67930af2, 0x31f63950), TOBN(0xa77797c1, 0x14caa2c9),
2518 TOBN(0x526e80ee, 0x27ac7e62), TOBN(0xe1e6e626, 0x58b28aec),
2519 TOBN(0x636178b0, 0xb3c9fef0), TOBN(0xaf7752e0, 0x6d5f90be),
2520 TOBN(0x94ecaf18, 0xeece51cf), TOBN(0x2864d0ed, 0xca806e1f),
2521 TOBN(0x6de2e383, 0x97c69134), TOBN(0x5a42c316, 0xeb291293),
2522 TOBN(0xc7779219, 0x6a60bae0), TOBN(0xa24de346, 0x6b7599d1),
2523 TOBN(0x49d374aa, 0xb75d4941), TOBN(0x98900586, 0x2d501ff0),
2524 TOBN(0x9f16d40e, 0xeb7974cf), TOBN(0x1033860b, 0xcdd8c115),
2525 TOBN(0xb6c69ac8, 0x2094cec3), TOBN(0x9976fb88, 0x403b770c),
2526 TOBN(0x1dea026c, 0x4859590d), TOBN(0xb6acbb46, 0x8562d1fd),
2527 TOBN(0x7cd6c461, 0x44569d85), TOBN(0xc3190a36, 0x97f0891d),
2528 TOBN(0xc6f53195, 0x48d5a17d), TOBN(0x7d919966, 0xd749abc8),
2529 TOBN(0x65104837, 0xdd1c8a20), TOBN(0x7e5410c8, 0x2f683419),
2530 TOBN(0x958c3ca8, 0xbe94022e), TOBN(0x605c3197, 0x6145dac2),
2531 TOBN(0x3fc07501, 0x01683d54), TOBN(0x1d7127c5, 0x595b1234),
2532 TOBN(0x10b8f87c, 0x9481277f), TOBN(0x677db2a8, 0xe65a1adb),
2533 TOBN(0xec2fccaa, 0xddce3345), TOBN(0x2a6811b7, 0x012a4350),
2534 TOBN(0x96760ff1, 0xac598bdc), TOBN(0x054d652a, 0xd1bf4128),
2535 TOBN(0x0a1151d4, 0x92a21005), TOBN(0xad7f3971, 0x33110fdf),
2536 TOBN(0x8c95928c, 0x1960100f), TOBN(0x6c91c825, 0x7bf03362),
2537 TOBN(0xc8c8b2a2, 0xce309f06), TOBN(0xfdb27b59, 0xca27204b),
2538 TOBN(0xd223eaa5, 0x0848e32e), TOBN(0xb93e4b2e, 0xe7bfaf1e),
2539 TOBN(0xc5308ae6, 0x44aa3ded), TOBN(0x317a666a, 0xc015d573),
2540 TOBN(0xc888ce23, 0x1a979707), TOBN(0xf141c1e6, 0x0d5c4958),
2541 TOBN(0xb53b7de5, 0x61906373), TOBN(0x858dbade, 0xeb999595),
2542 TOBN(0x8cbb47b2, 0xa59e5c36), TOBN(0x660318b3, 0xdcf4e842),
2543 TOBN(0xbd161ccd, 0x12ba4b7a), TOBN(0xf399daab, 0xf8c8282a),
2544 TOBN(0x1587633a, 0xeeb2130d), TOBN(0xa465311a, 0xda38dd7d),
2545 TOBN(0x5f75eec8, 0x64d3779b), TOBN(0x3c5d0476, 0xad64c171),
2546 TOBN(0x87410371, 0x2a914428), TOBN(0x8096a891, 0x90e2fc29),
2547 TOBN(0xd3d2ae9d, 0x23b3ebc2), TOBN(0x90bdd6db, 0xa580cfd6),
2548 TOBN(0x52dbb7f3, 0xc5b01f6c), TOBN(0xe68eded4, 0xe102a2dc),
2549 TOBN(0x17785b77, 0x99eb6df0), TOBN(0x26c3cc51, 0x7386b779),
2550 TOBN(0x345ed988, 0x6417a48e), TOBN(0xe990b4e4, 0x07d6ef31),
2551 TOBN(0x0f456b7e, 0x2586abba), TOBN(0x239ca6a5, 0x59c96e9a),
2552 TOBN(0xe327459c, 0xe2eb4206), TOBN(0x3a4c3313, 0xa002b90a),
2553 TOBN(0x2a114806, 0xf6a3f6fb), TOBN(0xad5cad2f, 0x85c251dd),
2554 TOBN(0x92c1f613, 0xf5a784d3), TOBN(0xec7bfacf, 0x349766d5),
2555 TOBN(0x04b3cd33, 0x3e23cb3b), TOBN(0x3979fe84, 0xc5a64b2d),
2556 TOBN(0x192e2720, 0x7e589106), TOBN(0xa60c43d1, 0xa15b527f),
2557 TOBN(0x2dae9082, 0xbe7cf3a6), TOBN(0xcc86ba92, 0xbc967274),
2558 TOBN(0xf28a2ce8, 0xaea0a8a9), TOBN(0x404ca6d9, 0x6ee988b3),
2559 TOBN(0xfd7e9c5d, 0x005921b8), TOBN(0xf56297f1, 0x44e79bf9),
2560 TOBN(0xa163b460, 0x0d75ddc2), TOBN(0x30b23616, 0xa1f2be87),
2561 TOBN(0x4b070d21, 0xbfe50e2b), TOBN(0x7ef8cfd0, 0xe1bfede1),
2562 TOBN(0xadba0011, 0x2aac4ae0), TOBN(0x2a3e7d01, 0xb9ebd033),
2563 TOBN(0x995277ec, 0xe38d9d1c), TOBN(0xb500249e, 0x9c5d2de3),
2564 TOBN(0x8912b820, 0xf13ca8c9), TOBN(0xc8798114, 0x877793af),
2565 TOBN(0x19e6125d, 0xec3f1dec), TOBN(0x07b1f040, 0x911178da),
2566 TOBN(0xd93ededa, 0x904a6738), TOBN(0x55187a5a, 0x0bebedcd),
2567 TOBN(0xf7d04722, 0xeb329d41), TOBN(0xf449099e, 0xf170b391),
2568 TOBN(0xfd317a69, 0xca99f828), TOBN(0x50c3db2b, 0x34a4976d),
2569 TOBN(0xe9ba7784, 0x3757b392), TOBN(0x326caefd, 0xaa3ca05a),
2570 TOBN(0x78e5293b, 0xf1e593d4), TOBN(0x7842a937, 0x0d98fd13),
2571 TOBN(0xe694bf96, 0x5f96b10d), TOBN(0x373a9df6, 0x06a8cd05),
2572 TOBN(0x997d1e51, 0xe8f0c7fc), TOBN(0x1d019790, 0x63fd972e),
2573 TOBN(0x0064d858, 0x5499fb32), TOBN(0x7b67bad9, 0x77a8aeb7),
2574 TOBN(0x1d3eb977, 0x2d08eec5), TOBN(0x5fc047a6, 0xcbabae1d),
2575 TOBN(0x0577d159, 0xe54a64bb), TOBN(0x8862201b, 0xc43497e4),
2576 TOBN(0xad6b4e28, 0x2ce0608d), TOBN(0x8b687b7d, 0x0b167aac),
2577 TOBN(0x6ed4d367, 0x8b2ecfa9), TOBN(0x24dfe62d, 0xa90c3c38),
2578 TOBN(0xa1862e10, 0x3fe5c42b), TOBN(0x1ca73dca, 0xd5732a9f),
2579 TOBN(0x35f038b7, 0x76bb87ad), TOBN(0x674976ab, 0xf242b81f),
2580 TOBN(0x4f2bde7e, 0xb0fd90cd), TOBN(0x6efc172e, 0xa7fdf092),
2581 TOBN(0x3806b69b, 0x92222f1f), TOBN(0x5a2459ca, 0x6cf7ae70),
2582 TOBN(0x6789f69c, 0xa85217ee), TOBN(0x5f232b5e, 0xe3dc85ac),
2583 TOBN(0x660e3ec5, 0x48e9e516), TOBN(0x124b4e47, 0x3197eb31),
2584 TOBN(0x10a0cb13, 0xaafcca23), TOBN(0x7bd63ba4, 0x8213224f),
2585 TOBN(0xaffad7cc, 0x290a7f4f), TOBN(0x6b409c9e, 0x0286b461),
2586 TOBN(0x58ab809f, 0xffa407af), TOBN(0xc3122eed, 0xc68ac073),
2587 TOBN(0x17bf9e50, 0x4ef24d7e), TOBN(0x5d929794, 0x3e2a5811),
2588 TOBN(0x519bc867, 0x02902e01), TOBN(0x76bba5da, 0x39c8a851),
2589 TOBN(0xe9f9669c, 0xda94951e), TOBN(0x4b6af58d, 0x66b8d418),
2590 TOBN(0xfa321074, 0x17d426a4), TOBN(0xc78e66a9, 0x9dde6027),
2591 TOBN(0x0516c083, 0x4a53b964), TOBN(0xfc659d38, 0xff602330),
2592 TOBN(0x0ab55e5c, 0x58c5c897), TOBN(0x985099b2, 0x838bc5df),
2593 TOBN(0x061d9efc, 0xc52fc238), TOBN(0x712b2728, 0x6ac1da3f),
2594 TOBN(0xfb658149, 0x9283fe08), TOBN(0x4954ac94, 0xb8aaa2f7),
2595 TOBN(0x85c0ada4, 0x7fb2e74f), TOBN(0xee8ba98e, 0xb89926b0),
2596 TOBN(0xe4f9d37d, 0x23d1af5b), TOBN(0x14ccdbf9, 0xba9b015e),
2597 TOBN(0xb674481b, 0x7bfe7178), TOBN(0x4e1debae, 0x65405868),
2598 TOBN(0x061b2821, 0xc48c867d), TOBN(0x69c15b35, 0x513b30ea),
2599 TOBN(0x3b4a1666, 0x36871088), TOBN(0xe5e29f5d, 0x1220b1ff),
2600 TOBN(0x4b82bb35, 0x233d9f4d), TOBN(0x4e076333, 0x18cdc675)},
2601 {TOBN(0x0d53f5c7, 0xa3e6fced), TOBN(0xe8cbbdd5, 0xf45fbdeb),
2602 TOBN(0xf85c01df, 0x13339a70), TOBN(0x0ff71880, 0x142ceb81),
2603 TOBN(0x4c4e8774, 0xbd70437a), TOBN(0x5fb32891, 0xba0bda6a),
2604 TOBN(0x1cdbebd2, 0xf18bd26e), TOBN(0x2f9526f1, 0x03a9d522),
2605 TOBN(0x40ce3051, 0x92c4d684), TOBN(0x8b04d725, 0x7612efcd),
2606 TOBN(0xb9dcda36, 0x6f9cae20), TOBN(0x0edc4d24, 0xf058856c),
2607 TOBN(0x64f2e6bf, 0x85427900), TOBN(0x3de81295, 0xdc09dfea),
2608 TOBN(0xd41b4487, 0x379bf26c), TOBN(0x50b62c6d, 0x6df135a9),
2609 TOBN(0xd4f8e3b4, 0xc72dfe67), TOBN(0xc416b0f6, 0x90e19fdf),
2610 TOBN(0x18b9098d, 0x4c13bd35), TOBN(0xac11118a, 0x15b8cb9e),
2611 TOBN(0xf598a318, 0xf0062841), TOBN(0xbfe0602f, 0x89f356f4),
2612 TOBN(0x7ae3637e, 0x30177a0c), TOBN(0x34097747, 0x61136537),
2613 TOBN(0x0db2fb5e, 0xd005832a), TOBN(0x5f5efd3b, 0x91042e4f),
2614 TOBN(0x8c4ffdc6, 0xed70f8ca), TOBN(0xe4645d0b, 0xb52da9cc),
2615 TOBN(0x9596f58b, 0xc9001d1f), TOBN(0x52c8f0bc, 0x4e117205),
2616 TOBN(0xfd4aa0d2, 0xe398a084), TOBN(0x815bfe3a, 0x104f49de),
2617 TOBN(0x97e5443f, 0x23885e5f), TOBN(0xf72f8f99, 0xe8433aab),
2618 TOBN(0xbd00b154, 0xe4d4e604), TOBN(0xd0b35e6a, 0xe5e173ff),
2619 TOBN(0x57b2a048, 0x9164722d), TOBN(0x3e3c665b, 0x88761ec8),
2620 TOBN(0x6bdd1397, 0x3da83832), TOBN(0x3c8b1a1e, 0x73dafe3b),
2621 TOBN(0x4497ace6, 0x54317cac), TOBN(0xbe600ab9, 0x521771b3),
2622 TOBN(0xb42e409e, 0xb0dfe8b8), TOBN(0x386a67d7, 0x3942310f),
2623 TOBN(0x25548d8d, 0x4431cc28), TOBN(0xa7cff142, 0x985dc524),
2624 TOBN(0x4d60f5a1, 0x93c4be32), TOBN(0x83ebd5c8, 0xd071c6e1),
2625 TOBN(0xba3a80a7, 0xb1fd2b0b), TOBN(0x9b3ad396, 0x5bec33e8),
2626 TOBN(0xb3868d61, 0x79743fb3), TOBN(0xcfd169fc, 0xfdb462fa),
2627 TOBN(0xd3b499d7, 0x9ce0a6af), TOBN(0x55dc1cf1, 0xe42d3ff8),
2628 TOBN(0x04fb9e6c, 0xc6c3e1b2), TOBN(0x47e6961d, 0x6f69a474),
2629 TOBN(0x54eb3acc, 0xe548b37b), TOBN(0xb38e7542, 0x84d40549),
2630 TOBN(0x8c3daa51, 0x7b341b4f), TOBN(0x2f6928ec, 0x690bf7fa),
2631 TOBN(0x0496b323, 0x86ce6c41), TOBN(0x01be1c55, 0x10adadcd),
2632 TOBN(0xc04e67e7, 0x4bb5faf9), TOBN(0x3cbaf678, 0xe15c9985),
2633 TOBN(0x8cd12145, 0x50ca4247), TOBN(0xba1aa47a, 0xe7dd30aa),
2634 TOBN(0x2f81ddf1, 0xe58fee24), TOBN(0x03452936, 0xeec9b0e8),
2635 TOBN(0x8bdc3b81, 0x243aea96), TOBN(0x9a2919af, 0x15c3d0e5),
2636 TOBN(0x9ea640ec, 0x10948361), TOBN(0x5ac86d5b, 0x6e0bcccf),
2637 TOBN(0xf892d918, 0xc36cf440), TOBN(0xaed3e837, 0xc939719c),
2638 TOBN(0xb07b08d2, 0xc0218b64), TOBN(0x6f1bcbba, 0xce9790dd),
2639 TOBN(0x4a84d6ed, 0x60919b8e), TOBN(0xd8900791, 0x8ac1f9eb),
2640 TOBN(0xf84941aa, 0x0dd5daef), TOBN(0xb22fe40a, 0x67fd62c5),
2641 TOBN(0x97e15ba2, 0x157f2db3), TOBN(0xbda2fc8f, 0x8e28ca9c),
2642 TOBN(0x5d050da4, 0x37b9f454), TOBN(0x3d57eb57, 0x2379d72e),
2643 TOBN(0xe9b5eba2, 0xfb5ee997), TOBN(0x01648ca2, 0xe11538ca),
2644 TOBN(0x32bb76f6, 0xf6327974), TOBN(0x338f14b8, 0xff3f4bb7),
2645 TOBN(0x524d226a, 0xd7ab9a2d), TOBN(0x9c00090d, 0x7dfae958),
2646 TOBN(0x0ba5f539, 0x8751d8c2), TOBN(0x8afcbcdd, 0x3ab8262d),
2647 TOBN(0x57392729, 0xe99d043b), TOBN(0xef51263b, 0xaebc943a),
2648 TOBN(0x9feace93, 0x20862935), TOBN(0x639efc03, 0xb06c817b),
2649 TOBN(0x1fe054b3, 0x66b4be7a), TOBN(0x3f25a9de, 0x84a37a1e),
2650 TOBN(0xf39ef1ad, 0x78d75cd9), TOBN(0xd7b58f49, 0x5062c1b5),
2651 TOBN(0x6f74f9a9, 0xff563436), TOBN(0xf718ff29, 0xe8af51e7),
2652 TOBN(0x5234d313, 0x15e97fec), TOBN(0xb6a8e2b1, 0x292f1c0a),
2653 TOBN(0xa7f53aa8, 0x327720c1), TOBN(0x956ca322, 0xba092cc8),
2654 TOBN(0x8f03d64a, 0x28746c4d), TOBN(0x51fe1782, 0x66d0d392),
2655 TOBN(0xd19b34db, 0x3c832c80), TOBN(0x60dccc5c, 0x6da2e3b4),
2656 TOBN(0x245dd62e, 0x0a104ccc), TOBN(0xa7ab1de1, 0x620b21fd),
2657 TOBN(0xb293ae0b, 0x3893d123), TOBN(0xf7b75783, 0xb15ee71c),
2658 TOBN(0x5aa3c614, 0x42a9468b), TOBN(0xd686123c, 0xdb15d744),
2659 TOBN(0x8c616891, 0xa7ab4116), TOBN(0x6fcd72c8, 0xa4e6a459),
2660 TOBN(0xac219110, 0x77e5fad7), TOBN(0xfb6a20e7, 0x704fa46b),
2661 TOBN(0xe839be7d, 0x341d81dc), TOBN(0xcddb6889, 0x32148379),
2662 TOBN(0xda6211a1, 0xf7026ead), TOBN(0xf3b2575f, 0xf4d1cc5e),
2663 TOBN(0x40cfc8f6, 0xa7a73ae6), TOBN(0x83879a5e, 0x61d5b483),
2664 TOBN(0xc5acb1ed, 0x41a50ebc), TOBN(0x59a60cc8, 0x3c07d8fa),
2665 TOBN(0x1b73bdce, 0xb1876262), TOBN(0x2b0d79f0, 0x12af4ee9),
2666 TOBN(0x8bcf3b0b, 0xd46e1d07), TOBN(0x17d6af9d, 0xe45d152f),
2667 TOBN(0x73520461, 0x6d736451), TOBN(0x43cbbd97, 0x56b0bf5a),
2668 TOBN(0xb0833a5b, 0xd5999b9d), TOBN(0x702614f0, 0xeb72e398),
2669 TOBN(0x0aadf01a, 0x59c3e9f8), TOBN(0x40200e77, 0xce6b3d16),
2670 TOBN(0xda22bdd3, 0xdeddafad), TOBN(0x76dedaf4, 0x310d72e1),
2671 TOBN(0x49ef807c, 0x4bc2e88f), TOBN(0x6ba81291, 0x146dd5a5),
2672 TOBN(0xa1a4077a, 0x7d8d59e9), TOBN(0x87b6a2e7, 0x802db349),
2673 TOBN(0xd5679997, 0x1b4e598e), TOBN(0xf499ef1f, 0x06fe4b1d),
2674 TOBN(0x3978d3ae, 0xfcb267c5), TOBN(0xb582b557, 0x235786d0),
2675 TOBN(0x32b3b2ca, 0x1715cb07), TOBN(0x4c3de6a2, 0x8480241d),
2676 TOBN(0x63b5ffed, 0xcb571ecd), TOBN(0xeaf53900, 0xed2fe9a9),
2677 TOBN(0xdec98d4a, 0xc3b81990), TOBN(0x1cb83722, 0x9e0cc8fe),
2678 TOBN(0xfe0b0491, 0xd2b427b9), TOBN(0x0f2386ac, 0xe983a66c),
2679 TOBN(0x930c4d1e, 0xb3291213), TOBN(0xa2f82b2e, 0x59a62ae4),
2680 TOBN(0x77233853, 0xf93e89e3), TOBN(0x7f8063ac, 0x11777c7f),
2681 TOBN(0xff0eb567, 0x59ad2877), TOBN(0x6f454642, 0x9865c754),
2682 TOBN(0xe6fe701a, 0x236e9a84), TOBN(0xc586ef16, 0x06e40fc3),
2683 TOBN(0x3f62b6e0, 0x24bafad9), TOBN(0xc8b42bd2, 0x64da906a),
2684 TOBN(0xc98e1eb4, 0xda3276a0), TOBN(0x30d0e5fc, 0x06cbf852),
2685 TOBN(0x1b6b2ae1, 0xe8b4dfd4), TOBN(0xd754d5c7, 0x8301cbac),
2686 TOBN(0x66097629, 0x112a39ac), TOBN(0xf86b5999, 0x93ba4ab9),
2687 TOBN(0x26c9dea7, 0x99f9d581), TOBN(0x0473b1a8, 0xc2fafeaa),
2688 TOBN(0x1469af55, 0x3b2505a5), TOBN(0x227d16d7, 0xd6a43323),
2689 TOBN(0x3316f73c, 0xad3d97f9), TOBN(0x52bf3bb5, 0x1f137455),
2690 TOBN(0x953eafeb, 0x09954e7c), TOBN(0xa721dfed, 0xdd732411),
2691 TOBN(0xb4929821, 0x141d4579), TOBN(0x3411321c, 0xaa3bd435),
2692 TOBN(0xafb355aa, 0x17fa6015), TOBN(0xb4e7ef4a, 0x18e42f0e),
2693 TOBN(0x604ac97c, 0x59371000), TOBN(0xe1c48c70, 0x7f759c18),
2694 TOBN(0x3f62ecc5, 0xa5db6b65), TOBN(0x0a78b173, 0x38a21495),
2695 TOBN(0x6be1819d, 0xbcc8ad94), TOBN(0x70dc04f6, 0xd89c3400),
2696 TOBN(0x462557b4, 0xa6b4840a), TOBN(0x544c6ade, 0x60bd21c0),
2697 TOBN(0x6a00f24e, 0x907a544b), TOBN(0xa7520dcb, 0x313da210),
2698 TOBN(0xfe939b75, 0x11e4994b), TOBN(0x918b6ba6, 0xbc275d70),
2699 TOBN(0xd3e5e0fc, 0x644be892), TOBN(0x707a9816, 0xfdaf6c42),
2700 TOBN(0x60145567, 0xf15c13fe), TOBN(0x4818ebaa, 0xe130a54a),
2701 TOBN(0x28aad3ad, 0x58d2f767), TOBN(0xdc5267fd, 0xd7e7c773),
2702 TOBN(0x4919cc88, 0xc3afcc98), TOBN(0xaa2e6ab0, 0x2db8cd4b),
2703 TOBN(0xd46fec04, 0xd0c63eaa), TOBN(0xa1cb92c5, 0x19ffa832),
2704 TOBN(0x678dd178, 0xe43a631f), TOBN(0xfb5ae1cd, 0x3dc788b3),
2705 TOBN(0x68b4fb90, 0x6e77de04), TOBN(0x7992bcf0, 0xf06dbb97),
2706 TOBN(0x896e6a13, 0xc417c01d), TOBN(0x8d96332c, 0xb956be01),
2707 TOBN(0x902fc93a, 0x413aa2b9), TOBN(0x99a4d915, 0xfc98c8a5),
2708 TOBN(0x52c29407, 0x565f1137), TOBN(0x4072690f, 0x21e4f281),
2709 TOBN(0x36e607cf, 0x02ff6072), TOBN(0xa47d2ca9, 0x8ad98cdc),
2710 TOBN(0xbf471d1e, 0xf5f56609), TOBN(0xbcf86623, 0xf264ada0),
2711 TOBN(0xb70c0687, 0xaa9e5cb6), TOBN(0xc98124f2, 0x17401c6c),
2712 TOBN(0x8189635f, 0xd4a61435), TOBN(0xd28fb8af, 0xa9d98ea6),
2713 TOBN(0xb9a67c2a, 0x40c251f8), TOBN(0x88cd5d87, 0xa2da44be),
2714 TOBN(0x437deb96, 0xe09b5423), TOBN(0x150467db, 0x64287dc1),
2715 TOBN(0xe161debb, 0xcdabb839), TOBN(0xa79e9742, 0xf1839a3e),
2716 TOBN(0xbb8dd3c2, 0x652d202b), TOBN(0x7b3e67f7, 0xe9f97d96),
2717 TOBN(0x5aa5d78f, 0xb1cb6ac9), TOBN(0xffa13e8e, 0xca1d0d45),
2718 TOBN(0x369295dd, 0x2ba5bf95), TOBN(0xd68bd1f8, 0x39aff05e),
2719 TOBN(0xaf0d86f9, 0x26d783f2), TOBN(0x543a59b3, 0xfc3aafc1),
2720 TOBN(0x3fcf81d2, 0x7b7da97c), TOBN(0xc990a056, 0xd25dee46),
2721 TOBN(0x3e6775b8, 0x519cce2c), TOBN(0xfc9af71f, 0xae13d863),
2722 TOBN(0x774a4a6f, 0x47c1605c), TOBN(0x46ba4245, 0x2fd205e8),
2723 TOBN(0xa06feea4, 0xd3fd524d), TOBN(0x1e724641, 0x6de1acc2),
2724 TOBN(0xf53816f1, 0x334e2b42), TOBN(0x49e5918e, 0x922f0024),
2725 TOBN(0x439530b6, 0x65c7322d), TOBN(0xcf12cc01, 0xb3c1b3fb),
2726 TOBN(0xc70b0186, 0x0172f685), TOBN(0xb915ee22, 0x1b58391d),
2727 TOBN(0x9afdf03b, 0xa317db24), TOBN(0x87dec659, 0x17b8ffc4),
2728 TOBN(0x7f46597b, 0xe4d3d050), TOBN(0x80a1c1ed, 0x006500e7),
2729 TOBN(0x84902a96, 0x78bf030e), TOBN(0xfb5e9c9a, 0x50560148),
2730 TOBN(0x6dae0a92, 0x63362426), TOBN(0xdcaeecf4, 0xa9e30c40),
2731 TOBN(0xc0d887bb, 0x518d0c6b), TOBN(0x99181152, 0xcb985b9d),
2732 TOBN(0xad186898, 0xef7bc381), TOBN(0x18168ffb, 0x9ee46201),
2733 TOBN(0x9a04cdaa, 0x2502753c), TOBN(0xbb279e26, 0x51407c41),
2734 TOBN(0xeacb03aa, 0xf23564e5), TOBN(0x18336582, 0x71e61016),
2735 TOBN(0x8684b8c4, 0xeb809877), TOBN(0xb336e18d, 0xea0e672e),
2736 TOBN(0xefb601f0, 0x34ee5867), TOBN(0x2733edbe, 0x1341cfd1),
2737 TOBN(0xb15e809a, 0x26025c3c), TOBN(0xe6e981a6, 0x9350df88),
2738 TOBN(0x92376237, 0x8502fd8e), TOBN(0x4791f216, 0x0c12be9b),
2739 TOBN(0xb7256789, 0x25f02425), TOBN(0xec863194, 0x7a974443),
2740 TOBN(0x7c0ce882, 0xfb41cc52), TOBN(0xc266ff7e, 0xf25c07f2),
2741 TOBN(0x3d4da8c3, 0x017025f3), TOBN(0xefcf628c, 0xfb9579b4),
2742 TOBN(0x5c4d0016, 0x1f3716ec), TOBN(0x9c27ebc4, 0x6801116e),
2743 TOBN(0x5eba0ea1, 0x1da1767e), TOBN(0xfe151452, 0x47004c57),
2744 TOBN(0x3ace6df6, 0x8c2373b7), TOBN(0x75c3dffe, 0x5dbc37ac),
2745 TOBN(0x3dc32a73, 0xddc925fc), TOBN(0xb679c841, 0x2f65ee0b),
2746 TOBN(0x715a3295, 0x451cbfeb), TOBN(0xd9889768, 0xf76e9a29),
2747 TOBN(0xec20ce7f, 0xb28ad247), TOBN(0xe99146c4, 0x00894d79),
2748 TOBN(0x71457d7c, 0x9f5e3ea7), TOBN(0x097b2662, 0x38030031),
2749 TOBN(0xdb7f6ae6, 0xcf9f82a8), TOBN(0x319decb9, 0x438f473a),
2750 TOBN(0xa63ab386, 0x283856c3), TOBN(0x13e3172f, 0xb06a361b),
2751 TOBN(0x2959f8dc, 0x7d5a006c), TOBN(0x2dbc27c6, 0x75fba752),
2752 TOBN(0xc1227ab2, 0x87c22c9e), TOBN(0x06f61f75, 0x71a268b2),
2753 TOBN(0x1b6bb971, 0x04779ce2), TOBN(0xaca83812, 0x0aadcb1d),
2754 TOBN(0x297ae0bc, 0xaeaab2d5), TOBN(0xa5c14ee7, 0x5bfb9f13),
2755 TOBN(0xaa00c583, 0xf17a62c7), TOBN(0x39eb962c, 0x173759f6),
2756 TOBN(0x1eeba1d4, 0x86c9a88f), TOBN(0x0ab6c37a, 0xdf016c5e),
2757 TOBN(0xa2a147db, 0xa28a0749), TOBN(0x246c20d6, 0xee519165),
2758 TOBN(0x5068d1b1, 0xd3810715), TOBN(0xb1e7018c, 0x748160b9),
2759 TOBN(0x03f5b1fa, 0xf380ff62), TOBN(0xef7fb1dd, 0xf3cb2c1e),
2760 TOBN(0xeab539a8, 0xfc91a7da), TOBN(0x83ddb707, 0xf3f9b561),
2761 TOBN(0xc550e211, 0xfe7df7a4), TOBN(0xa7cd07f2, 0x063f6f40),
2762 TOBN(0xb0de3635, 0x2976879c), TOBN(0xb5f83f85, 0xe55741da),
2763 TOBN(0x4ea9d25e, 0xf3d8ac3d), TOBN(0x6fe2066f, 0x62819f02),
2764 TOBN(0x4ab2b9c2, 0xcef4a564), TOBN(0x1e155d96, 0x5ffa2de3),
2765 TOBN(0x0eb0a19b, 0xc3a72d00), TOBN(0x4037665b, 0x8513c31b),
2766 TOBN(0x2fb2b6bf, 0x04c64637), TOBN(0x45c34d6e, 0x08cdc639),
2767 TOBN(0x56f1e10f, 0xf01fd796), TOBN(0x4dfb8101, 0xfe3667b8),
2768 TOBN(0xe0eda253, 0x9021d0c0), TOBN(0x7a94e9ff, 0x8a06c6ab),
2769 TOBN(0x2d3bb0d9, 0xbb9aa882), TOBN(0xea20e4e5, 0xec05fd10),
2770 TOBN(0xed7eeb5f, 0x1a1ca64e), TOBN(0x2fa6b43c, 0xc6327cbd),
2771 TOBN(0xb577e3cf, 0x3aa91121), TOBN(0x8c6bd5ea, 0x3a34079b),
2772 TOBN(0xd7e5ba39, 0x60e02fc0), TOBN(0xf16dd2c3, 0x90141bf8),
2773 TOBN(0xb57276d9, 0x80101b98), TOBN(0x760883fd, 0xb82f0f66),
2774 TOBN(0x89d7de75, 0x4bc3eff3), TOBN(0x03b60643, 0x5dc2ab40),
2775 TOBN(0xcd6e53df, 0xe05beeac), TOBN(0xf2f1e862, 0xbc3325cd),
2776 TOBN(0xdd0f7921, 0x774f03c3), TOBN(0x97ca7221, 0x4552cc1b),
2777 TOBN(0x5a0d6afe, 0x1cd19f72), TOBN(0xa20915dc, 0xf183fbeb),
2778 TOBN(0x9fda4b40, 0x832c403c), TOBN(0x32738edd, 0xbe425442),
2779 TOBN(0x469a1df6, 0xb5eccf1a), TOBN(0x4b5aff42, 0x28bbe1f0),
2780 TOBN(0x31359d7f, 0x570dfc93), TOBN(0xa18be235, 0xf0088628),
2781 TOBN(0xa5b30fba, 0xb00ed3a9), TOBN(0x34c61374, 0x73cdf8be),
2782 TOBN(0x2c5c5f46, 0xabc56797), TOBN(0x5cecf93d, 0xb82a8ae2),
2783 TOBN(0x7d3dbe41, 0xa968fbf0), TOBN(0xd23d4583, 0x1a5c7f3d),
2784 TOBN(0xf28f69a0, 0xc087a9c7), TOBN(0xc2d75471, 0x474471ca),
2785 TOBN(0x36ec9f4a, 0x4eb732ec), TOBN(0x6c943bbd, 0xb1ca6bed),
2786 TOBN(0xd64535e1, 0xf2457892), TOBN(0x8b84a8ea, 0xf7e2ac06),
2787 TOBN(0xe0936cd3, 0x2499dd5f), TOBN(0x12053d7e, 0x0ed04e57),
2788 TOBN(0x4bdd0076, 0xe4305d9d), TOBN(0x34a527b9, 0x1f67f0a2),
2789 TOBN(0xe79a4af0, 0x9cec46ea), TOBN(0xb15347a1, 0x658b9bc7),
2790 TOBN(0x6bd2796f, 0x35af2f75), TOBN(0xac957990, 0x4051c435),
2791 TOBN(0x2669dda3, 0xc33a655d), TOBN(0x5d503c2e, 0x88514aa3),
2792 TOBN(0xdfa11337, 0x3753dd41), TOBN(0x3f054673, 0x0b754f78),
2793 TOBN(0xbf185677, 0x496125bd), TOBN(0xfb0023c8, 0x3775006c),
2794 TOBN(0xfa0f072f, 0x3a037899), TOBN(0x4222b6eb, 0x0e4aea57),
2795 TOBN(0x3dde5e76, 0x7866d25a), TOBN(0xb6eb04f8, 0x4837aa6f),
2796 TOBN(0x5315591a, 0x2cf1cdb8), TOBN(0x6dfb4f41, 0x2d4e683c),
2797 TOBN(0x7e923ea4, 0x48ee1f3a), TOBN(0x9604d9f7, 0x05a2afd5),
2798 TOBN(0xbe1d4a33, 0x40ea4948), TOBN(0x5b45f1f4, 0xb44cbd2f),
2799 TOBN(0x5faf8376, 0x4acc757e), TOBN(0xa7cf9ab8, 0x63d68ff7),
2800 TOBN(0x8ad62f69, 0xdf0e404b), TOBN(0xd65f33c2, 0x12bdafdf),
2801 TOBN(0xc365de15, 0xa377b14e), TOBN(0x6bf5463b, 0x8e39f60c),
2802 TOBN(0x62030d2d, 0x2ce68148), TOBN(0xd95867ef, 0xe6f843a8),
2803 TOBN(0xd39a0244, 0xef5ab017), TOBN(0x0bd2d8c1, 0x4ab55d12),
2804 TOBN(0xc9503db3, 0x41639169), TOBN(0x2d4e25b0, 0xf7660c8a),
2805 TOBN(0x760cb3b5, 0xe224c5d7), TOBN(0xfa3baf8c, 0x68616919),
2806 TOBN(0x9fbca113, 0x8d142552), TOBN(0x1ab18bf1, 0x7669ebf5),
2807 TOBN(0x55e6f53e, 0x9bdf25dd), TOBN(0x04cc0bf3, 0xcb6cd154),
2808 TOBN(0x595bef49, 0x95e89080), TOBN(0xfe9459a8, 0x104a9ac1),
2809 TOBN(0xad2d89ca, 0xcce9bb32), TOBN(0xddea65e1, 0xf7de8285),
2810 TOBN(0x62ed8c35, 0xb351bd4b), TOBN(0x4150ff36, 0x0c0e19a7),
2811 TOBN(0x86e3c801, 0x345f4e47), TOBN(0x3bf21f71, 0x203a266c),
2812 TOBN(0x7ae110d4, 0x855b1f13), TOBN(0x5d6aaf6a, 0x07262517),
2813 TOBN(0x1e0f12e1, 0x813d28f1), TOBN(0x6000e11d, 0x7ad7a523),
2814 TOBN(0xc7d8deef, 0xc744a17b), TOBN(0x1e990b48, 0x14c05a00),
2815 TOBN(0x68fddaee, 0x93e976d5), TOBN(0x696241d1, 0x46610d63),
2816 TOBN(0xb204e7c3, 0x893dda88), TOBN(0x8bccfa65, 0x6a3a6946),
2817 TOBN(0xb59425b4, 0xc5cd1411), TOBN(0x701b4042, 0xff3658b1),
2818 TOBN(0xe3e56bca, 0x4784cf93), TOBN(0x27de5f15, 0x8fe68d60),
2819 TOBN(0x4ab9cfce, 0xf8d53f19), TOBN(0xddb10311, 0xa40a730d),
2820 TOBN(0x6fa73cd1, 0x4eee0a8a), TOBN(0xfd548748, 0x5249719d),
2821 TOBN(0x49d66316, 0xa8123ef0), TOBN(0x73c32db4, 0xe7f95438),
2822 TOBN(0x2e2ed209, 0x0d9e7854), TOBN(0xf98a9329, 0x9d9f0507),
2823 TOBN(0xc5d33cf6, 0x0c6aa20a), TOBN(0x9a32ba14, 0x75279bb2),
2824 TOBN(0x7e3202cb, 0x774a7307), TOBN(0x64ed4bc4, 0xe8c42dbd),
2825 TOBN(0xc20f1a06, 0xd4caed0d), TOBN(0xb8021407, 0x171d22b3),
2826 TOBN(0xd426ca04, 0xd13268d7), TOBN(0x92377007, 0x25f4d126),
2827 TOBN(0x4204cbc3, 0x71f21a85), TOBN(0x18461b7a, 0xf82369ba),
2828 TOBN(0xc0c07d31, 0x3fc858f9), TOBN(0x5deb5a50, 0xe2bab569),
2829 TOBN(0xd5959d46, 0xd5eea89e), TOBN(0xfdff8424, 0x08437f4b),
2830 TOBN(0xf21071e4, 0x3cfe254f), TOBN(0x72417696, 0x95468321),
2831 TOBN(0x5d8288b9, 0x102cae3e), TOBN(0x2d143e3d, 0xf1965dff),
2832 TOBN(0x00c9a376, 0xa078d847), TOBN(0x6fc0da31, 0x26028731),
2833 TOBN(0xa2baeadf, 0xe45083a2), TOBN(0x66bc7218, 0x5e5b4bcd),
2834 TOBN(0x2c826442, 0xd04b8e7f), TOBN(0xc19f5451, 0x6c4b586b),
2835 TOBN(0x60182c49, 0x5b7eeed5), TOBN(0xd9954ecd, 0x7aa9dfa1),
2836 TOBN(0xa403a8ec, 0xc73884ad), TOBN(0x7fb17de2, 0x9bb39041),
2837 TOBN(0x694b64c5, 0xabb020e8), TOBN(0x3d18c184, 0x19c4eec7),
2838 TOBN(0x9c4673ef, 0x1c4793e5), TOBN(0xc7b8aeb5, 0x056092e6),
2839 TOBN(0x3aa1ca43, 0xf0f8c16b), TOBN(0x224ed5ec, 0xd679b2f6),
2840 TOBN(0x0d56eeaf, 0x55a205c9), TOBN(0xbfe115ba, 0x4b8e028b),
2841 TOBN(0x97e60849, 0x3927f4fe), TOBN(0xf91fbf94, 0x759aa7c5),
2842 TOBN(0x985af769, 0x6be90a51), TOBN(0xc1277b78, 0x78ccb823),
2843 TOBN(0x395b656e, 0xe7a75952), TOBN(0x00df7de0, 0x928da5f5),
2844 TOBN(0x09c23175, 0x4ca4454f), TOBN(0x4ec971f4, 0x7aa2d3c1),
2845 TOBN(0x45c3c507, 0xe75d9ccc), TOBN(0x63b7be8a, 0x3dc90306),
2846 TOBN(0x37e09c66, 0x5db44bdc), TOBN(0x50d60da1, 0x6841c6a2),
2847 TOBN(0x6f9b65ee, 0x08df1b12), TOBN(0x38734879, 0x7ff089df),
2848 TOBN(0x9c331a66, 0x3fe8013d), TOBN(0x017f5de9, 0x5f42fcc8),
2849 TOBN(0x43077866, 0xe8e57567), TOBN(0xc9f781ce, 0xf9fcdb18),
2850 TOBN(0x38131dda, 0x9b12e174), TOBN(0x25d84aa3, 0x8a03752a),
2851 TOBN(0x45e09e09, 0x4d0c0ce2), TOBN(0x1564008b, 0x92bebba5),
2852 TOBN(0xf7e8ad31, 0xa87284c7), TOBN(0xb7c4b46c, 0x97e7bbaa),
2853 TOBN(0x3e22a7b3, 0x97acf4ec), TOBN(0x0426c400, 0x5ea8b640),
2854 TOBN(0x5e3295a6, 0x4e969285), TOBN(0x22aabc59, 0xa6a45670),
2855 TOBN(0xb929714c, 0x5f5942bc), TOBN(0x9a6168bd, 0xfa3182ed),
2856 TOBN(0x2216a665, 0x104152ba), TOBN(0x46908d03, 0xb6926368)},
2857 {
2858 TOBN(0xa9f5d874, 0x5a1251fb), TOBN(0x967747a8, 0xc72725c7),
2859 TOBN(0x195c33e5, 0x31ffe89e), TOBN(0x609d210f, 0xe964935e),
2860 TOBN(0xcafd6ca8, 0x2fe12227), TOBN(0xaf9b5b96, 0x0426469d),
2861 TOBN(0x2e9ee04c, 0x5693183c), TOBN(0x1084a333, 0xc8146fef),
2862 TOBN(0x96649933, 0xaed1d1f7), TOBN(0x566eaff3, 0x50563090),
2863 TOBN(0x345057f0, 0xad2e39cf), TOBN(0x148ff65b, 0x1f832124),
2864 TOBN(0x042e89d4, 0xcf94cf0d), TOBN(0x319bec84, 0x520c58b3),
2865 TOBN(0x2a267626, 0x5361aa0d), TOBN(0xc86fa302, 0x8fbc87ad),
2866 TOBN(0xfc83d2ab, 0x5c8b06d5), TOBN(0xb1a785a2, 0xfe4eac46),
2867 TOBN(0xb99315bc, 0x846f7779), TOBN(0xcf31d816, 0xef9ea505),
2868 TOBN(0x2391fe6a, 0x15d7dc85), TOBN(0x2f132b04, 0xb4016b33),
2869 TOBN(0x29547fe3, 0x181cb4c7), TOBN(0xdb66d8a6, 0x650155a1),
2870 TOBN(0x6b66d7e1, 0xadc1696f), TOBN(0x98ebe593, 0x0acd72d0),
2871 TOBN(0x65f24550, 0xcc1b7435), TOBN(0xce231393, 0xb4b9a5ec),
2872 TOBN(0x234a22d4, 0xdb067df9), TOBN(0x98dda095, 0xcaff9b00),
2873 TOBN(0x1bbc75a0, 0x6100c9c1), TOBN(0x1560a9c8, 0x939cf695),
2874 TOBN(0xcf006d3e, 0x99e0925f), TOBN(0x2dd74a96, 0x6322375a),
2875 TOBN(0xc58b446a, 0xb56af5ba), TOBN(0x50292683, 0xe0b9b4f1),
2876 TOBN(0xe2c34cb4, 0x1aeaffa3), TOBN(0x8b17203f, 0x9b9587c1),
2877 TOBN(0x6d559207, 0xead1350c), TOBN(0x2b66a215, 0xfb7f9604),
2878 TOBN(0x0850325e, 0xfe51bf74), TOBN(0x9c4f579e, 0x5e460094),
2879 TOBN(0x5c87b92a, 0x76da2f25), TOBN(0x889de4e0, 0x6febef33),
2880 TOBN(0x6900ec06, 0x646083ce), TOBN(0xbe2a0335, 0xbfe12773),
2881 TOBN(0xadd1da35, 0xc5344110), TOBN(0x757568b7, 0xb802cd20),
2882 TOBN(0x75559779, 0x00f7e6c8), TOBN(0x38e8b94f, 0x0facd2f0),
2883 TOBN(0xfea1f3af, 0x03fde375), TOBN(0x5e11a1d8, 0x75881dfc),
2884 TOBN(0xb3a6b02e, 0xc1e2f2ef), TOBN(0x193d2bbb, 0xc605a6c5),
2885 TOBN(0x325ffeee, 0x339a0b2d), TOBN(0x27b6a724, 0x9e0c8846),
2886 TOBN(0xe4050f1c, 0xf1c367ca), TOBN(0x9bc85a9b, 0xc90fbc7d),
2887 TOBN(0xa373c4a2, 0xe1a11032), TOBN(0xb64232b7, 0xad0393a9),
2888 TOBN(0xf5577eb0, 0x167dad29), TOBN(0x1604f301, 0x94b78ab2),
2889 TOBN(0x0baa94af, 0xe829348b), TOBN(0x77fbd8dd, 0x41654342),
2890 TOBN(0xdab50ea5, 0xb964e39a), TOBN(0xd4c29e3c, 0xd0d3c76e),
2891 TOBN(0x80dae67c, 0x56d11964), TOBN(0x7307a8bf, 0xe5ffcc2f),
2892 TOBN(0x65bbc1aa, 0x91708c3b), TOBN(0xa151e62c, 0x28bf0eeb),
2893 TOBN(0x6cb53381, 0x6fa34db7), TOBN(0x5139e05c, 0xa29403a8),
2894 TOBN(0x6ff651b4, 0x94a7cd2e), TOBN(0x5671ffd1, 0x0699336c),
2895 TOBN(0x6f5fd2cc, 0x979a896a), TOBN(0x11e893a8, 0xd8148cef),
2896 TOBN(0x988906a1, 0x65cf7b10), TOBN(0x81b67178, 0xc50d8485),
2897 TOBN(0x7c0deb35, 0x8a35b3de), TOBN(0x423ac855, 0xc1d29799),
2898 TOBN(0xaf580d87, 0xdac50b74), TOBN(0x28b2b89f, 0x5869734c),
2899 TOBN(0x99a3b936, 0x874e28fb), TOBN(0xbb2c9190, 0x25f3f73a),
2900 TOBN(0x199f6918, 0x84a9d5b7), TOBN(0x7ebe2325, 0x7e770374),
2901 TOBN(0xf442e107, 0x0738efe2), TOBN(0xcf9f3f56, 0xcf9082d2),
2902 TOBN(0x719f69e1, 0x09618708), TOBN(0xcc9e8364, 0xc183f9b1),
2903 TOBN(0xec203a95, 0x366a21af), TOBN(0x6aec5d6d, 0x068b141f),
2904 TOBN(0xee2df78a, 0x994f04e9), TOBN(0xb39ccae8, 0x271245b0),
2905 TOBN(0xb875a4a9, 0x97e43f4f), TOBN(0x507dfe11, 0xdb2cea98),
2906 TOBN(0x4fbf81cb, 0x489b03e9), TOBN(0xdb86ec5b, 0x6ec414fa),
2907 TOBN(0xfad444f9, 0xf51b3ae5), TOBN(0xca7d33d6, 0x1914e3fe),
2908 TOBN(0xa9c32f5c, 0x0ae6c4d0), TOBN(0xa9ca1d1e, 0x73969568),
2909 TOBN(0x98043c31, 0x1aa7467e), TOBN(0xe832e75c, 0xe21b5ac6),
2910 TOBN(0x314b7aea, 0x5232123d), TOBN(0x08307c8c, 0x65ae86db),
2911 TOBN(0x06e7165c, 0xaa4668ed), TOBN(0xb170458b, 0xb4d3ec39),
2912 TOBN(0x4d2e3ec6, 0xc19bb986), TOBN(0xc5f34846, 0xae0304ed),
2913 TOBN(0x917695a0, 0x6c9f9722), TOBN(0x6c7f7317, 0x4cab1c0a),
2914 TOBN(0x6295940e, 0x9d6d2e8b), TOBN(0xd318b8c1, 0x549f7c97),
2915 TOBN(0x22453204, 0x97713885), TOBN(0x468d834b, 0xa8a440fe),
2916 TOBN(0xd81fe5b2, 0xbfba796e), TOBN(0x152364db, 0x6d71f116),
2917 TOBN(0xbb8c7c59, 0xb5b66e53), TOBN(0x0b12c61b, 0x2641a192),
2918 TOBN(0x31f14802, 0xfcf0a7fd), TOBN(0x42fd0789, 0x5488b01e),
2919 TOBN(0x71d78d6d, 0x9952b498), TOBN(0x8eb572d9, 0x07ac5201),
2920 TOBN(0xe0a2a44c, 0x4d194a88), TOBN(0xd2b63fd9, 0xba017e66),
2921 TOBN(0x78efc6c8, 0xf888aefc), TOBN(0xb76f6bda, 0x4a881a11),
2922 TOBN(0x187f314b, 0xb46c2397), TOBN(0x004cf566, 0x5ded2819),
2923 TOBN(0xa9ea5704, 0x38764d34), TOBN(0xbba45217, 0x78084709),
2924 TOBN(0x06474571, 0x1171121e), TOBN(0xad7b7eb1, 0xe7c9b671),
2925 TOBN(0xdacfbc40, 0x730f7507), TOBN(0x178cd8c6, 0xc7ad7bd1),
2926 TOBN(0xbf0be101, 0xb2a67238), TOBN(0x3556d367, 0xaf9c14f2),
2927 TOBN(0x104b7831, 0xa5662075), TOBN(0x58ca59bb, 0x79d9e60a),
2928 TOBN(0x4bc45392, 0xa569a73b), TOBN(0x517a52e8, 0x5698f6c9),
2929 TOBN(0x85643da5, 0xaeadd755), TOBN(0x1aed0cd5, 0x2a581b84),
2930 TOBN(0xb9b4ff84, 0x80af1372), TOBN(0x244c3113, 0xf1ba5d1f),
2931 TOBN(0x2a5dacbe, 0xf5f98d31), TOBN(0x2c3323e8, 0x4375bc2a),
2932 TOBN(0x17a3ab4a, 0x5594b1dd), TOBN(0xa1928bfb, 0xceb4797e),
2933 TOBN(0xe83af245, 0xe4886a19), TOBN(0x8979d546, 0x72b5a74a),
2934 TOBN(0xa0f726bc, 0x19f9e967), TOBN(0xd9d03152, 0xe8fbbf4e),
2935 TOBN(0xcfd6f51d, 0xb7707d40), TOBN(0x633084d9, 0x63f6e6e0),
2936 TOBN(0xedcd9cdc, 0x55667eaf), TOBN(0x73b7f92b, 0x2e44d56f),
2937 TOBN(0xfb2e39b6, 0x4e962b14), TOBN(0x7d408f6e, 0xf671fcbf),
2938 TOBN(0xcc634ddc, 0x164a89bb), TOBN(0x74a42bb2, 0x3ef3bd05),
2939 TOBN(0x1280dbb2, 0x428decbb), TOBN(0x6103f6bb, 0x402c8596),
2940 TOBN(0xfa2bf581, 0x355a5752), TOBN(0x562f96a8, 0x00946674),
2941 TOBN(0x4e4ca16d, 0x6da0223b), TOBN(0xfe47819f, 0x28d3aa25),
2942 TOBN(0x9eea3075, 0xf8dfcf8a), TOBN(0xa284f0aa, 0x95669825),
2943 TOBN(0xb3fca250, 0x867d3fd8), TOBN(0x20757b5f, 0x269d691e),
2944 TOBN(0xf2c24020, 0x93b8a5de), TOBN(0xd3f93359, 0xebc06da6),
2945 TOBN(0x1178293e, 0xb2739c33), TOBN(0xd2a3e770, 0xbcd686e5),
2946 TOBN(0xa76f49f4, 0xcd941534), TOBN(0x0d37406b, 0xe3c71c0e),
2947 TOBN(0x172d9397, 0x3b97f7e3), TOBN(0xec17e239, 0xbd7fd0de),
2948 TOBN(0xe3290551, 0x6f496ba2), TOBN(0x6a693172, 0x36ad50e7),
2949 TOBN(0xc4e539a2, 0x83e7eff5), TOBN(0x752737e7, 0x18e1b4cf),
2950 TOBN(0xa2f7932c, 0x68af43ee), TOBN(0x5502468e, 0x703d00bd),
2951 TOBN(0xe5dc978f, 0x2fb061f5), TOBN(0xc9a1904a, 0x28c815ad),
2952 TOBN(0xd3af538d, 0x470c56a4), TOBN(0x159abc5f, 0x193d8ced),
2953 TOBN(0x2a37245f, 0x20108ef3), TOBN(0xfa17081e, 0x223f7178),
2954 TOBN(0x27b0fb2b, 0x10c8c0f5), TOBN(0x2102c3ea, 0x40650547),
2955 TOBN(0x594564df, 0x8ac3bfa7), TOBN(0x98102033, 0x509dad96),
2956 TOBN(0x6989643f, 0xf1d18a13), TOBN(0x35eebd91, 0xd7fc5af0),
2957 TOBN(0x078d096a, 0xfaeaafd8), TOBN(0xb7a89341, 0xdef3de98),
2958 TOBN(0x2a206e8d, 0xecf2a73a), TOBN(0x066a6397, 0x8e551994),
2959 TOBN(0x3a6a088a, 0xb98d53a2), TOBN(0x0ce7c67c, 0x2d1124aa),
2960 TOBN(0x48cec671, 0x759a113c), TOBN(0xe3b373d3, 0x4f6f67fa),
2961 TOBN(0x5455d479, 0xfd36727b), TOBN(0xe5a428ee, 0xa13c0d81),
2962 TOBN(0xb853dbc8, 0x1c86682b), TOBN(0xb78d2727, 0xb8d02b2a),
2963 TOBN(0xaaf69bed, 0x8ebc329a), TOBN(0xdb6b40b3, 0x293b2148),
2964 TOBN(0xe42ea77d, 0xb8c4961f), TOBN(0xb1a12f7c, 0x20e5e0ab),
2965 TOBN(0xa0ec5274, 0x79e8b05e), TOBN(0x68027391, 0xfab60a80),
2966 TOBN(0x6bfeea5f, 0x16b1bd5e), TOBN(0xf957e420, 0x4de30ad3),
2967 TOBN(0xcbaf664e, 0x6a353b9e), TOBN(0x5c873312, 0x26d14feb),
2968 TOBN(0x4e87f98c, 0xb65f57cb), TOBN(0xdb60a621, 0x5e0cdd41),
2969 TOBN(0x67c16865, 0xa6881440), TOBN(0x1093ef1a, 0x46ab52aa),
2970 TOBN(0xc095afb5, 0x3f4ece64), TOBN(0x6a6bb02e, 0x7604551a),
2971 TOBN(0x55d44b4e, 0x0b26b8cd), TOBN(0xe5f9a999, 0xf971268a),
2972 TOBN(0xc08ec425, 0x11a7de84), TOBN(0x83568095, 0xfda469dd),
2973 TOBN(0x737bfba1, 0x6c6c90a2), TOBN(0x1cb9c4a0, 0xbe229831),
2974 TOBN(0x93bccbba, 0xbb2eec64), TOBN(0xa0c23b64, 0xda03adbe),
2975 TOBN(0x5f7aa00a, 0xe0e86ac4), TOBN(0x470b941e, 0xfc1401e6),
2976 TOBN(0x5ad8d679, 0x9df43574), TOBN(0x4ccfb8a9, 0x0f65d810),
2977 TOBN(0x1bce80e3, 0xaa7fbd81), TOBN(0x273291ad, 0x9508d20a),
2978 TOBN(0xf5c4b46b, 0x42a92806), TOBN(0x810684ec, 0xa86ab44a),
2979 TOBN(0x4591640b, 0xca0bc9f8), TOBN(0xb5efcdfc, 0x5c4b6054),
2980 TOBN(0x16fc8907, 0x6e9edd12), TOBN(0xe29d0b50, 0xd4d792f9),
2981 TOBN(0xa45fd01c, 0x9b03116d), TOBN(0x85035235, 0xc81765a4),
2982 TOBN(0x1fe2a9b2, 0xb4b4b67c), TOBN(0xc1d10df0, 0xe8020604),
2983 TOBN(0x9d64abfc, 0xbc8058d8), TOBN(0x8943b9b2, 0x712a0fbb),
2984 TOBN(0x90eed914, 0x3b3def04), TOBN(0x85ab3aa2, 0x4ce775ff),
2985 TOBN(0x605fd4ca, 0x7bbc9040), TOBN(0x8b34a564, 0xe2c75dfb),
2986 TOBN(0x41ffc94a, 0x10358560), TOBN(0x2d8a5072, 0x9e5c28aa),
2987 TOBN(0xe915a0fc, 0x4cc7eb15), TOBN(0xe9efab05, 0x8f6d0f5d),
2988 TOBN(0xdbab47a9, 0xd19e9b91), TOBN(0x8cfed745, 0x0276154c),
2989 TOBN(0x154357ae, 0x2cfede0d), TOBN(0x520630df, 0x19f5a4ef),
2990 TOBN(0x25759f7c, 0xe382360f), TOBN(0xb6db05c9, 0x88bf5857),
2991 TOBN(0x2917d61d, 0x6c58d46c), TOBN(0x14f8e491, 0xfd20cb7a),
2992 TOBN(0xb68a727a, 0x11c20340), TOBN(0x0386f86f, 0xaf7ccbb6),
2993 TOBN(0x5c8bc6cc, 0xfee09a20), TOBN(0x7d76ff4a, 0xbb7eea35),
2994 TOBN(0xa7bdebe7, 0xdb15be7a), TOBN(0x67a08054, 0xd89f0302),
2995 TOBN(0x56bf0ea9, 0xc1193364), TOBN(0xc8244467, 0x62837ebe),
2996 TOBN(0x32bd8e8b, 0x20d841b8), TOBN(0x127a0548, 0xdbb8a54f),
2997 TOBN(0x83dd4ca6, 0x63b20236), TOBN(0x87714718, 0x203491fa),
2998 TOBN(0x4dabcaaa, 0xaa8a5288), TOBN(0x91cc0c8a, 0xaf23a1c9),
2999 TOBN(0x34c72c6a, 0x3f220e0c), TOBN(0xbcc20bdf, 0x1232144a),
3000 TOBN(0x6e2f42da, 0xa20ede1b), TOBN(0xc441f00c, 0x74a00515),
3001 TOBN(0xbf46a5b6, 0x734b8c4b), TOBN(0x57409503, 0x7b56c9a4),
3002 TOBN(0x9f735261, 0xe4585d45), TOBN(0x9231faed, 0x6734e642),
3003 TOBN(0x1158a176, 0xbe70ee6c), TOBN(0x35f1068d, 0x7c3501bf),
3004 TOBN(0x6beef900, 0xa2d26115), TOBN(0x649406f2, 0xef0afee3),
3005 TOBN(0x3f43a60a, 0xbc2420a1), TOBN(0x509002a7, 0xd5aee4ac),
3006 TOBN(0xb46836a5, 0x3ff3571b), TOBN(0x24f98b78, 0x837927c1),
3007 TOBN(0x6254256a, 0x4533c716), TOBN(0xf27abb0b, 0xd07ee196),
3008 TOBN(0xd7cf64fc, 0x5c6d5bfd), TOBN(0x6915c751, 0xf0cd7a77),
3009 TOBN(0xd9f59012, 0x8798f534), TOBN(0x772b0da8, 0xf81d8b5f),
3010 TOBN(0x1244260c, 0x2e03fa69), TOBN(0x36cf0e3a, 0x3be1a374),
3011 TOBN(0x6e7c1633, 0xef06b960), TOBN(0xa71a4c55, 0x671f90f6),
3012 TOBN(0x7a941251, 0x33c673db), TOBN(0xc0bea510, 0x73e8c131),
3013 TOBN(0x61a8a699, 0xd4f6c734), TOBN(0x25e78c88, 0x341ed001),
3014 TOBN(0x5c18acf8, 0x8e2f7d90), TOBN(0xfdbf33d7, 0x77be32cd),
3015 TOBN(0x0a085cd7, 0xd2eb5ee9), TOBN(0x2d702cfb, 0xb3201115),
3016 TOBN(0xb6e0ebdb, 0x85c88ce8), TOBN(0x23a3ce3c, 0x1e01d617),
3017 TOBN(0x3041618e, 0x567333ac), TOBN(0x9dd0fd8f, 0x157edb6b),
3018 TOBN(0x27f74702, 0xb57872b8), TOBN(0x2ef26b4f, 0x657d5fe1),
3019 TOBN(0x95426f0a, 0x57cf3d40), TOBN(0x847e2ad1, 0x65a6067a),
3020 TOBN(0xd474d9a0, 0x09996a74), TOBN(0x16a56acd, 0x2a26115c),
3021 TOBN(0x02a615c3, 0xd16f4d43), TOBN(0xcc3fc965, 0xaadb85b7),
3022 TOBN(0x386bda73, 0xce07d1b0), TOBN(0xd82910c2, 0x58ad4178),
3023 TOBN(0x124f82cf, 0xcd2617f4), TOBN(0xcc2f5e8d, 0xef691770),
3024 TOBN(0x82702550, 0xb8c30ccc), TOBN(0x7b856aea, 0x1a8e575a),
3025 TOBN(0xbb822fef, 0xb1ab9459), TOBN(0x085928bc, 0xec24e38e),
3026 TOBN(0x5d0402ec, 0xba8f4b4d), TOBN(0xc07cd4ba, 0x00b4d58b),
3027 TOBN(0x5d8dffd5, 0x29227e7a), TOBN(0x61d44d0c, 0x31bf386f),
3028 TOBN(0xe486dc2b, 0x135e6f4d), TOBN(0x680962eb, 0xe79410ef),
3029 TOBN(0xa61bd343, 0xf10088b5), TOBN(0x6aa76076, 0xe2e28686),
3030 TOBN(0x80463d11, 0x8fb98871), TOBN(0xcb26f5c3, 0xbbc76aff),
3031 TOBN(0xd4ab8edd, 0xfbe03614), TOBN(0xc8eb579b, 0xc0cf2dee),
3032 TOBN(0xcc004c15, 0xc93bae41), TOBN(0x46fbae5d, 0x3aeca3b2),
3033 TOBN(0x671235cf, 0x0f1e9ab1), TOBN(0xadfba934, 0x9ec285c1),
3034 TOBN(0x88ded013, 0xf216c980), TOBN(0xc8ac4fb8, 0xf79e0bc1),
3035 TOBN(0xa29b89c6, 0xfb97a237), TOBN(0xb697b780, 0x9922d8e7),
3036 TOBN(0x3142c639, 0xddb945b5), TOBN(0x447b06c7, 0xe094c3a9),
3037 TOBN(0xcdcb3642, 0x72266c90), TOBN(0x633aad08, 0xa9385046),
3038 TOBN(0xa36c936b, 0xb57c6477), TOBN(0x871f8b64, 0xe94dbcc6),
3039 TOBN(0x28d0fb62, 0xa591a67b), TOBN(0x9d40e081, 0xc1d926f5),
3040 TOBN(0x3111eaf6, 0xf2d84b5a), TOBN(0x228993f9, 0xa565b644),
3041 TOBN(0x0ccbf592, 0x2c83188b), TOBN(0xf87b30ab, 0x3df3e197),
3042 TOBN(0xb8658b31, 0x7642bca8), TOBN(0x1a032d7f, 0x52800f17),
3043 TOBN(0x051dcae5, 0x79bf9445), TOBN(0xeba6b8ee, 0x54a2e253),
3044 TOBN(0x5c8b9cad, 0xd4485692), TOBN(0x84bda40e, 0x8986e9be),
3045 TOBN(0xd16d16a4, 0x2f0db448), TOBN(0x8ec80050, 0xa14d4188),
3046 TOBN(0xb2b26107, 0x98fa7aaa), TOBN(0x41209ee4, 0xf073aa4e),
3047 TOBN(0xf1570359, 0xf2d6b19b), TOBN(0xcbe6868c, 0xfc577caf),
3048 TOBN(0x186c4bdc, 0x32c04dd3), TOBN(0xa6c35fae, 0xcfeee397),
3049 TOBN(0xb4a1b312, 0xf086c0cf), TOBN(0xe0a5ccc6, 0xd9461fe2),
3050 TOBN(0xc32278aa, 0x1536189f), TOBN(0x1126c55f, 0xba6df571),
3051 TOBN(0x0f71a602, 0xb194560e), TOBN(0x8b2d7405, 0x324bd6e1),
3052 TOBN(0x8481939e, 0x3738be71), TOBN(0xb5090b1a, 0x1a4d97a9),
3053 TOBN(0x116c65a3, 0xf05ba915), TOBN(0x21863ad3, 0xaae448aa),
3054 TOBN(0xd24e2679, 0xa7aae5d3), TOBN(0x7076013d, 0x0de5c1c4),
3055 TOBN(0x2d50f8ba, 0xbb05b629), TOBN(0x73c1abe2, 0x6e66efbb),
3056 TOBN(0xefd4b422, 0xf2488af7), TOBN(0xe4105d02, 0x663ba575),
3057 TOBN(0x7eb60a8b, 0x53a69457), TOBN(0x62210008, 0xc945973b),
3058 TOBN(0xfb255478, 0x77a50ec6), TOBN(0xbf0392f7, 0x0a37a72c),
3059 TOBN(0xa0a7a19c, 0x4be18e7a), TOBN(0x90d8ea16, 0x25b1e0af),
3060 TOBN(0x7582a293, 0xef953f57), TOBN(0x90a64d05, 0xbdc5465a),
3061 TOBN(0xca79c497, 0xe2510717), TOBN(0x560dbb7c, 0x18cb641f),
3062 TOBN(0x1d8e3286, 0x4b66abfb), TOBN(0xd26f52e5, 0x59030900),
3063 TOBN(0x1ee3f643, 0x5584941a), TOBN(0x6d3b3730, 0x569f5958),
3064 TOBN(0x9ff2a62f, 0x4789dba5), TOBN(0x91fcb815, 0x72b5c9b7),
3065 TOBN(0xf446cb7d, 0x6c8f9a0e), TOBN(0x48f625c1, 0x39b7ecb5),
3066 TOBN(0xbabae801, 0x1c6219b8), TOBN(0xe7a562d9, 0x28ac2f23),
3067 TOBN(0xe1b48732, 0x26e20588), TOBN(0x06ee1cad, 0x775af051),
3068 TOBN(0xda29ae43, 0xfaff79f7), TOBN(0xc141a412, 0x652ee9e0),
3069 TOBN(0x1e127f6f, 0x195f4bd0), TOBN(0x29c6ab4f, 0x072f34f8),
3070 TOBN(0x7b7c1477, 0x30448112), TOBN(0x82b51af1, 0xe4a38656),
3071 TOBN(0x2bf2028a, 0x2f315010), TOBN(0xc9a4a01f, 0x6ea88cd4),
3072 TOBN(0xf63e95d8, 0x257e5818), TOBN(0xdd8efa10, 0xb4519b16),
3073 TOBN(0xed8973e0, 0x0da910bf), TOBN(0xed49d077, 0x5c0fe4a9),
3074 TOBN(0xac3aac5e, 0xb7caee1e), TOBN(0x1033898d, 0xa7f4da57),
3075 TOBN(0x42145c0e, 0x5c6669b9), TOBN(0x42daa688, 0xc1aa2aa0),
3076 TOBN(0x629cc15c, 0x1a1d885a), TOBN(0x25572ec0, 0xf4b76817),
3077 TOBN(0x8312e435, 0x9c8f8f28), TOBN(0x8107f8cd, 0x81965490),
3078 TOBN(0x516ff3a3, 0x6fa6110c), TOBN(0x74fb1eb1, 0xfb93561f),
3079 TOBN(0x6c0c9047, 0x8457522b), TOBN(0xcfd32104, 0x6bb8bdc6),
3080 TOBN(0x2d6884a2, 0xcc80ad57), TOBN(0x7c27fc35, 0x86a9b637),
3081 TOBN(0x3461baed, 0xadf4e8cd), TOBN(0x1d56251a, 0x617242f0),
3082 TOBN(0x0b80d209, 0xc955bef4), TOBN(0xdf02cad2, 0x06adb047),
3083 TOBN(0xf0d7cb91, 0x5ec74fee), TOBN(0xd2503375, 0x1111ba44),
3084 TOBN(0x9671755e, 0xdf53cb36), TOBN(0x54dcb612, 0x3368551b),
3085 TOBN(0x66d69aac, 0xc8a025a4), TOBN(0x6be946c6, 0xe77ef445),
3086 TOBN(0x719946d1, 0xa995e094), TOBN(0x65e848f6, 0xe51e04d8),
3087 TOBN(0xe62f3300, 0x6a1e3113), TOBN(0x1541c7c1, 0x501de503),
3088 TOBN(0x4daac9fa, 0xf4acfade), TOBN(0x0e585897, 0x44cd0b71),
3089 TOBN(0x544fd869, 0x0a51cd77), TOBN(0x60fc20ed, 0x0031016d),
3090 TOBN(0x58b404ec, 0xa4276867), TOBN(0x46f6c3cc, 0x34f34993),
3091 TOBN(0x477ca007, 0xc636e5bd), TOBN(0x8018f5e5, 0x7c458b47),
3092 TOBN(0xa1202270, 0xe47b668f), TOBN(0xcef48ccd, 0xee14f203),
3093 TOBN(0x23f98bae, 0x62ff9b4d), TOBN(0x55acc035, 0xc589eddd),
3094 TOBN(0x3fe712af, 0x64db4444), TOBN(0x19e9d634, 0xbecdd480),
3095 TOBN(0xe08bc047, 0xa930978a), TOBN(0x2dbf24ec, 0xa1280733),
3096 TOBN(0x3c0ae38c, 0x2cd706b2), TOBN(0x5b012a5b, 0x359017b9),
3097 TOBN(0x3943c38c, 0x72e0f5ae), TOBN(0x786167ea, 0x57176fa3),
3098 TOBN(0xe5f9897d, 0x594881dc), TOBN(0x6b5efad8, 0xcfb820c1),
3099 TOBN(0xb2179093, 0xd55018de), TOBN(0x39ad7d32, 0x0bac56ce),
3100 TOBN(0xb55122e0, 0x2cfc0e81), TOBN(0x117c4661, 0xf6d89daa),
3101 TOBN(0x362d01e1, 0xcb64fa09), TOBN(0x6a309b4e, 0x3e9c4ddd),
3102 TOBN(0xfa979fb7, 0xabea49b1), TOBN(0xb4b1d27d, 0x10e2c6c5),
3103 TOBN(0xbd61c2c4, 0x23afde7a), TOBN(0xeb6614f8, 0x9786d358),
3104 TOBN(0x4a5d816b, 0x7f6f7459), TOBN(0xe431a44f, 0x09360e7b),
3105 TOBN(0x8c27a032, 0xc309914c), TOBN(0xcea5d68a, 0xcaede3d8),
3106 TOBN(0x3668f665, 0x3a0a3f95), TOBN(0x89369416, 0x7ceba27b),
3107 TOBN(0x89981fad, 0xe4728fe9), TOBN(0x7102c8a0, 0x8a093562),
3108 TOBN(0xbb80310e, 0x235d21c8), TOBN(0x505e55d1, 0xbefb7f7b),
3109 TOBN(0xa0a90811, 0x12958a67), TOBN(0xd67e106a, 0x4d851fef),
3110 TOBN(0xb84011a9, 0x431dd80e), TOBN(0xeb7c7cca, 0x73306cd9),
3111 TOBN(0x20fadd29, 0xd1b3b730), TOBN(0x83858b5b, 0xfe37b3d3),
3112 TOBN(0xbf4cd193, 0xb6251d5c), TOBN(0x1cca1fd3, 0x1352d952),
3113 TOBN(0xc66157a4, 0x90fbc051), TOBN(0x7990a638, 0x89b98636),
3114 },
3115 {TOBN(0xe5aa692a, 0x87dec0e1), TOBN(0x010ded8d, 0xf7b39d00),
3116 TOBN(0x7b1b80c8, 0x54cfa0b5), TOBN(0x66beb876, 0xa0f8ea28),
3117 TOBN(0x50d7f531, 0x3476cd0e), TOBN(0xa63d0e65, 0xb08d3949),
3118 TOBN(0x1a09eea9, 0x53479fc6), TOBN(0x82ae9891, 0xf499e742),
3119 TOBN(0xab58b910, 0x5ca7d866), TOBN(0x582967e2, 0x3adb3b34),
3120 TOBN(0x89ae4447, 0xcceac0bc), TOBN(0x919c667c, 0x7bf56af5),
3121 TOBN(0x9aec17b1, 0x60f5dcd7), TOBN(0xec697b9f, 0xddcaadbc),
3122 TOBN(0x0b98f341, 0x463467f5), TOBN(0xb187f1f7, 0xa967132f),
3123 TOBN(0x90fe7a1d, 0x214aeb18), TOBN(0x1506af3c, 0x741432f7),
3124 TOBN(0xbb5565f9, 0xe591a0c4), TOBN(0x10d41a77, 0xb44f1bc3),
3125 TOBN(0xa09d65e4, 0xa84bde96), TOBN(0x42f060d8, 0xf20a6a1c),
3126 TOBN(0x652a3bfd, 0xf27f9ce7), TOBN(0xb6bdb65c, 0x3b3d739f),
3127 TOBN(0xeb5ddcb6, 0xec7fae9f), TOBN(0x995f2714, 0xefb66e5a),
3128 TOBN(0xdee95d8e, 0x69445d52), TOBN(0x1b6c2d46, 0x09e27620),
3129 TOBN(0x32621c31, 0x8129d716), TOBN(0xb03909f1, 0x0958c1aa),
3130 TOBN(0x8c468ef9, 0x1af4af63), TOBN(0x162c429f, 0xfba5cdf6),
3131 TOBN(0x2f682343, 0x753b9371), TOBN(0x29cab45a, 0x5f1f9cd7),
3132 TOBN(0x571623ab, 0xb245db96), TOBN(0xc507db09, 0x3fd79999),
3133 TOBN(0x4e2ef652, 0xaf036c32), TOBN(0x86f0cc78, 0x05018e5c),
3134 TOBN(0xc10a73d4, 0xab8be350), TOBN(0x6519b397, 0x7e826327),
3135 TOBN(0xe8cb5eef, 0x9c053df7), TOBN(0x8de25b37, 0xb300ea6f),
3136 TOBN(0xdb03fa92, 0xc849cffb), TOBN(0x242e43a7, 0xe84169bb),
3137 TOBN(0xe4fa51f4, 0xdd6f958e), TOBN(0x6925a77f, 0xf4445a8d),
3138 TOBN(0xe6e72a50, 0xe90d8949), TOBN(0xc66648e3, 0x2b1f6390),
3139 TOBN(0xb2ab1957, 0x173e460c), TOBN(0x1bbbce75, 0x30704590),
3140 TOBN(0xc0a90dbd, 0xdb1c7162), TOBN(0x505e399e, 0x15cdd65d),
3141 TOBN(0x68434dcb, 0x57797ab7), TOBN(0x60ad35ba, 0x6a2ca8e8),
3142 TOBN(0x4bfdb1e0, 0xde3336c1), TOBN(0xbbef99eb, 0xd8b39015),
3143 TOBN(0x6c3b96f3, 0x1711ebec), TOBN(0x2da40f1f, 0xce98fdc4),
3144 TOBN(0xb99774d3, 0x57b4411f), TOBN(0x87c8bdf4, 0x15b65bb6),
3145 TOBN(0xda3a89e3, 0xc2eef12d), TOBN(0xde95bb9b, 0x3c7471f3),
3146 TOBN(0x600f225b, 0xd812c594), TOBN(0x54907c5d, 0x2b75a56b),
3147 TOBN(0xa93cc5f0, 0x8db60e35), TOBN(0x743e3cd6, 0xfa833319),
3148 TOBN(0x7dad5c41, 0xf81683c9), TOBN(0x70c1e7d9, 0x9c34107e),
3149 TOBN(0x0edc4a39, 0xa6be0907), TOBN(0x36d47035, 0x86d0b7d3),
3150 TOBN(0x8c76da03, 0x272bfa60), TOBN(0x0b4a07ea, 0x0f08a414),
3151 TOBN(0x699e4d29, 0x45c1dd53), TOBN(0xcadc5898, 0x231debb5),
3152 TOBN(0xdf49fcc7, 0xa77f00e0), TOBN(0x93057bbf, 0xa73e5a0e),
3153 TOBN(0x2f8b7ecd, 0x027a4cd1), TOBN(0x114734b3, 0xc614011a),
3154 TOBN(0xe7a01db7, 0x67677c68), TOBN(0x89d9be5e, 0x7e273f4f),
3155 TOBN(0xd225cb2e, 0x089808ef), TOBN(0xf1f7a27d, 0xd59e4107),
3156 TOBN(0x53afc761, 0x8211b9c9), TOBN(0x0361bc67, 0xe6819159),
3157 TOBN(0x2a865d0b, 0x7f071426), TOBN(0x6a3c1810, 0xe7072567),
3158 TOBN(0x3e3bca1e, 0x0d6bcabd), TOBN(0xa1b02bc1, 0x408591bc),
3159 TOBN(0xe0deee59, 0x31fba239), TOBN(0xf47424d3, 0x98bd91d1),
3160 TOBN(0x0f8886f4, 0x071a3c1d), TOBN(0x3f7d41e8, 0xa819233b),
3161 TOBN(0x708623c2, 0xcf6eb998), TOBN(0x86bb49af, 0x609a287f),
3162 TOBN(0x942bb249, 0x63c90762), TOBN(0x0ef6eea5, 0x55a9654b),
3163 TOBN(0x5f6d2d72, 0x36f5defe), TOBN(0xfa9922dc, 0x56f99176),
3164 TOBN(0x6c8c5ece, 0xf78ce0c7), TOBN(0x7b44589d, 0xbe09b55e),
3165 TOBN(0xe11b3bca, 0x9ea83770), TOBN(0xd7fa2c7f, 0x2ab71547),
3166 TOBN(0x2a3dd6fa, 0x2a1ddcc0), TOBN(0x09acb430, 0x5a7b7707),
3167 TOBN(0x4add4a2e, 0x649d4e57), TOBN(0xcd53a2b0, 0x1917526e),
3168 TOBN(0xc5262330, 0x20b44ac4), TOBN(0x4028746a, 0xbaa2c31d),
3169 TOBN(0x51318390, 0x64291d4c), TOBN(0xbf48f151, 0xee5ad909),
3170 TOBN(0xcce57f59, 0x7b185681), TOBN(0x7c3ac1b0, 0x4854d442),
3171 TOBN(0x65587dc3, 0xc093c171), TOBN(0xae7acb24, 0x24f42b65),
3172 TOBN(0x5a338adb, 0x955996cb), TOBN(0xc8e65675, 0x6051f91b),
3173 TOBN(0x66711fba, 0x28b8d0b1), TOBN(0x15d74137, 0xb6c10a90),
3174 TOBN(0x70cdd7eb, 0x3a232a80), TOBN(0xc9e2f07f, 0x6191ed24),
3175 TOBN(0xa80d1db6, 0xf79588c0), TOBN(0xfa52fc69, 0xb55768cc),
3176 TOBN(0x0b4df1ae, 0x7f54438a), TOBN(0x0cadd1a7, 0xf9b46a4f),
3177 TOBN(0xb40ea6b3, 0x1803dd6f), TOBN(0x488e4fa5, 0x55eaae35),
3178 TOBN(0x9f047d55, 0x382e4e16), TOBN(0xc9b5b7e0, 0x2f6e0c98),
3179 TOBN(0x6b1bd2d3, 0x95762649), TOBN(0xa9604ee7, 0xc7aea3f6),
3180 TOBN(0x3646ff27, 0x6dc6f896), TOBN(0x9bf0e7f5, 0x2860bad1),
3181 TOBN(0x2d92c821, 0x7cb44b92), TOBN(0xa2f5ce63, 0xaea9c182),
3182 TOBN(0xd0a2afb1, 0x9154a5fd), TOBN(0x482e474c, 0x95801da6),
3183 TOBN(0xc19972d0, 0xb611c24b), TOBN(0x1d468e65, 0x60a8f351),
3184 TOBN(0xeb758069, 0x7bcf6421), TOBN(0xec9dd0ee, 0x88fbc491),
3185 TOBN(0x5b59d2bf, 0x956c2e32), TOBN(0x73dc6864, 0xdcddf94e),
3186 TOBN(0xfd5e2321, 0xbcee7665), TOBN(0xa7b4f8ef, 0x5e9a06c4),
3187 TOBN(0xfba918dd, 0x7280f855), TOBN(0xbbaac260, 0x8baec688),
3188 TOBN(0xa3b3f00f, 0x33400f42), TOBN(0x3d2dba29, 0x66f2e6e4),
3189 TOBN(0xb6f71a94, 0x98509375), TOBN(0x8f33031f, 0xcea423cc),
3190 TOBN(0x009b8dd0, 0x4807e6fb), TOBN(0x5163cfe5, 0x5cdb954c),
3191 TOBN(0x03cc8f17, 0xcf41c6e8), TOBN(0xf1f03c2a, 0x037b925c),
3192 TOBN(0xc39c19cc, 0x66d2427c), TOBN(0x823d24ba, 0x7b6c18e4),
3193 TOBN(0x32ef9013, 0x901f0b4f), TOBN(0x684360f1, 0xf8941c2e),
3194 TOBN(0x0ebaff52, 0x2c28092e), TOBN(0x7891e4e3, 0x256c932f),
3195 TOBN(0x51264319, 0xac445e3d), TOBN(0x553432e7, 0x8ea74381),
3196 TOBN(0xe6eeaa69, 0x67e9c50a), TOBN(0x27ced284, 0x62e628c7),
3197 TOBN(0x3f96d375, 0x7a4afa57), TOBN(0xde0a14c3, 0xe484c150),
3198 TOBN(0x364a24eb, 0x38bd9923), TOBN(0x1df18da0, 0xe5177422),
3199 TOBN(0x174e8f82, 0xd8d38a9b), TOBN(0x2e97c600, 0xe7de1391),
3200 TOBN(0xc5709850, 0xa1c175dd), TOBN(0x969041a0, 0x32ae5035),
3201 TOBN(0xcbfd533b, 0x76a2086b), TOBN(0xd6bba71b, 0xd7c2e8fe),
3202 TOBN(0xb2d58ee6, 0x099dfb67), TOBN(0x3a8b342d, 0x064a85d9),
3203 TOBN(0x3bc07649, 0x522f9be3), TOBN(0x690c075b, 0xdf1f49a8),
3204 TOBN(0x80e1aee8, 0x3854ec42), TOBN(0x2a7dbf44, 0x17689dc7),
3205 TOBN(0xc004fc0e, 0x3faf4078), TOBN(0xb2f02e9e, 0xdf11862c),
3206 TOBN(0xf10a5e0f, 0xa0a1b7b3), TOBN(0x30aca623, 0x8936ec80),
3207 TOBN(0xf83cbf05, 0x02f40d9a), TOBN(0x4681c468, 0x2c318a4d),
3208 TOBN(0x98575618, 0x0e9c2674), TOBN(0xbe79d046, 0x1847092e),
3209 TOBN(0xaf1e480a, 0x78bd01e0), TOBN(0x6dd359e4, 0x72a51db9),
3210 TOBN(0x62ce3821, 0xe3afbab6), TOBN(0xc5cee5b6, 0x17733199),
3211 TOBN(0xe08b30d4, 0x6ffd9fbb), TOBN(0x6e5bc699, 0x36c610b7),
3212 TOBN(0xf343cff2, 0x9ce262cf), TOBN(0xca2e4e35, 0x68b914c1),
3213 TOBN(0x011d64c0, 0x16de36c5), TOBN(0xe0b10fdd, 0x42e2b829),
3214 TOBN(0x78942981, 0x6685aaf8), TOBN(0xe7511708, 0x230ede97),
3215 TOBN(0x671ed8fc, 0x3b922bf8), TOBN(0xe4d8c0a0, 0x4c29b133),
3216 TOBN(0x87eb1239, 0x3b6e99c4), TOBN(0xaff3974c, 0x8793beba),
3217 TOBN(0x03749405, 0x2c18df9b), TOBN(0xc5c3a293, 0x91007139),
3218 TOBN(0x6a77234f, 0xe37a0b95), TOBN(0x02c29a21, 0xb661c96b),
3219 TOBN(0xc3aaf1d6, 0x141ecf61), TOBN(0x9195509e, 0x3bb22f53),
3220 TOBN(0x29597404, 0x22d51357), TOBN(0x1b083822, 0x537bed60),
3221 TOBN(0xcd7d6e35, 0xe07289f0), TOBN(0x1f94c48c, 0x6dd86eff),
3222 TOBN(0xc8bb1f82, 0xeb0f9cfa), TOBN(0x9ee0b7e6, 0x1b2eb97d),
3223 TOBN(0x5a52fe2e, 0x34d74e31), TOBN(0xa352c310, 0x3bf79ab6),
3224 TOBN(0x97ff6c5a, 0xabfeeb8f), TOBN(0xbfbe8fef, 0xf5c97305),
3225 TOBN(0xd6081ce6, 0xa7904608), TOBN(0x1f812f3a, 0xc4fca249),
3226 TOBN(0x9b24bc9a, 0xb9e5e200), TOBN(0x91022c67, 0x38012ee8),
3227 TOBN(0xe83d9c5d, 0x30a713a1), TOBN(0x4876e3f0, 0x84ef0f93),
3228 TOBN(0xc9777029, 0xc1fbf928), TOBN(0xef7a6bb3, 0xbce7d2a4),
3229 TOBN(0xb8067228, 0xdfa2a659), TOBN(0xd5cd3398, 0xd877a48f),
3230 TOBN(0xbea4fd8f, 0x025d0f3f), TOBN(0xd67d2e35, 0x2eae7c2b),
3231 TOBN(0x184de7d7, 0xcc5f4394), TOBN(0xb5551b5c, 0x4536e142),
3232 TOBN(0x2e89b212, 0xd34aa60a), TOBN(0x14a96fea, 0xf50051d5),
3233 TOBN(0x4e21ef74, 0x0d12bb0b), TOBN(0xc522f020, 0x60b9677e),
3234 TOBN(0x8b12e467, 0x2df7731d), TOBN(0x39f80382, 0x7b326d31),
3235 TOBN(0xdfb8630c, 0x39024a94), TOBN(0xaacb96a8, 0x97319452),
3236 TOBN(0xd68a3961, 0xeda3867c), TOBN(0x0c58e2b0, 0x77c4ffca),
3237 TOBN(0x3d545d63, 0x4da919fa), TOBN(0xef79b69a, 0xf15e2289),
3238 TOBN(0x54bc3d3d, 0x808bab10), TOBN(0xc8ab3007, 0x45f82c37),
3239 TOBN(0xc12738b6, 0x7c4a658a), TOBN(0xb3c47639, 0x40e72182),
3240 TOBN(0x3b77be46, 0x8798e44f), TOBN(0xdc047df2, 0x17a7f85f),
3241 TOBN(0x2439d4c5, 0x5e59d92d), TOBN(0xcedca475, 0xe8e64d8d),
3242 TOBN(0xa724cd0d, 0x87ca9b16), TOBN(0x35e4fd59, 0xa5540dfe),
3243 TOBN(0xf8c1ff18, 0xe4bcf6b1), TOBN(0x856d6285, 0x295018fa),
3244 TOBN(0x433f665c, 0x3263c949), TOBN(0xa6a76dd6, 0xa1f21409),
3245 TOBN(0x17d32334, 0xcc7b4f79), TOBN(0xa1d03122, 0x06720e4a),
3246 TOBN(0xadb6661d, 0x81d9bed5), TOBN(0xf0d6fb02, 0x11db15d1),
3247 TOBN(0x7fd11ad5, 0x1fb747d2), TOBN(0xab50f959, 0x3033762b),
3248 TOBN(0x2a7e711b, 0xfbefaf5a), TOBN(0xc7393278, 0x3fef2bbf),
3249 TOBN(0xe29fa244, 0x0df6f9be), TOBN(0x9092757b, 0x71efd215),
3250 TOBN(0xee60e311, 0x4f3d6fd9), TOBN(0x338542d4, 0x0acfb78b),
3251 TOBN(0x44a23f08, 0x38961a0f), TOBN(0x1426eade, 0x986987ca),
3252 TOBN(0x36e6ee2e, 0x4a863cc6), TOBN(0x48059420, 0x628b8b79),
3253 TOBN(0x30303ad8, 0x7396e1de), TOBN(0x5c8bdc48, 0x38c5aad1),
3254 TOBN(0x3e40e11f, 0x5c8f5066), TOBN(0xabd6e768, 0x8d246bbd),
3255 TOBN(0x68aa40bb, 0x23330a01), TOBN(0xd23f5ee4, 0xc34eafa0),
3256 TOBN(0x3bbee315, 0x5de02c21), TOBN(0x18dd4397, 0xd1d8dd06),
3257 TOBN(0x3ba1939a, 0x122d7b44), TOBN(0xe6d3b40a, 0xa33870d6),
3258 TOBN(0x8e620f70, 0x1c4fe3f8), TOBN(0xf6bba1a5, 0xd3a50cbf),
3259 TOBN(0x4a78bde5, 0xcfc0aee0), TOBN(0x847edc46, 0xc08c50bd),
3260 TOBN(0xbaa2439c, 0xad63c9b2), TOBN(0xceb4a728, 0x10fc2acb),
3261 TOBN(0xa419e40e, 0x26da033d), TOBN(0x6cc3889d, 0x03e02683),
3262 TOBN(0x1cd28559, 0xfdccf725), TOBN(0x0fd7e0f1, 0x8d13d208),
3263 TOBN(0x01b9733b, 0x1f0df9d4), TOBN(0x8cc2c5f3, 0xa2b5e4f3),
3264 TOBN(0x43053bfa, 0x3a304fd4), TOBN(0x8e87665c, 0x0a9f1aa7),
3265 TOBN(0x087f29ec, 0xd73dc965), TOBN(0x15ace455, 0x3e9023db),
3266 TOBN(0x2370e309, 0x2bce28b4), TOBN(0xf9723442, 0xb6b1e84a),
3267 TOBN(0xbeee662e, 0xb72d9f26), TOBN(0xb19396de, 0xf0e47109),
3268 TOBN(0x85b1fa73, 0xe13289d0), TOBN(0x436cf77e, 0x54e58e32),
3269 TOBN(0x0ec833b3, 0xe990ef77), TOBN(0x7373e3ed, 0x1b11fc25),
3270 TOBN(0xbe0eda87, 0x0fc332ce), TOBN(0xced04970, 0x8d7ea856),
3271 TOBN(0xf85ff785, 0x7e977ca0), TOBN(0xb66ee8da, 0xdfdd5d2b),
3272 TOBN(0xf5e37950, 0x905af461), TOBN(0x587b9090, 0x966d487c),
3273 TOBN(0x6a198a1b, 0x32ba0127), TOBN(0xa7720e07, 0x141615ac),
3274 TOBN(0xa23f3499, 0x996ef2f2), TOBN(0xef5f64b4, 0x470bcb3d),
3275 TOBN(0xa526a962, 0x92b8c559), TOBN(0x0c14aac0, 0x69740a0f),
3276 TOBN(0x0d41a9e3, 0xa6bdc0a5), TOBN(0x97d52106, 0x9c48aef4),
3277 TOBN(0xcf16bd30, 0x3e7c253b), TOBN(0xcc834b1a, 0x47fdedc1),
3278 TOBN(0x7362c6e5, 0x373aab2e), TOBN(0x264ed85e, 0xc5f590ff),
3279 TOBN(0x7a46d9c0, 0x66d41870), TOBN(0xa50c20b1, 0x4787ba09),
3280 TOBN(0x185e7e51, 0xe3d44635), TOBN(0xb3b3e080, 0x31e2d8dc),
3281 TOBN(0xbed1e558, 0xa179e9d9), TOBN(0x2daa3f79, 0x74a76781),
3282 TOBN(0x4372baf2, 0x3a40864f), TOBN(0x46900c54, 0x4fe75cb5),
3283 TOBN(0xb95f171e, 0xf76765d0), TOBN(0x4ad726d2, 0x95c87502),
3284 TOBN(0x2ec769da, 0x4d7c99bd), TOBN(0x5e2ddd19, 0xc36cdfa8),
3285 TOBN(0xc22117fc, 0xa93e6dea), TOBN(0xe8a2583b, 0x93771123),
3286 TOBN(0xbe2f6089, 0xfa08a3a2), TOBN(0x4809d5ed, 0x8f0e1112),
3287 TOBN(0x3b414aa3, 0xda7a095e), TOBN(0x9049acf1, 0x26f5aadd),
3288 TOBN(0x78d46a4d, 0x6be8b84a), TOBN(0xd66b1963, 0xb732b9b3),
3289 TOBN(0x5c2ac2a0, 0xde6e9555), TOBN(0xcf52d098, 0xb5bd8770),
3290 TOBN(0x15a15fa6, 0x0fd28921), TOBN(0x56ccb81e, 0x8b27536d),
3291 TOBN(0x0f0d8ab8, 0x9f4ccbb8), TOBN(0xed5f44d2, 0xdb221729),
3292 TOBN(0x43141988, 0x00bed10c), TOBN(0xc94348a4, 0x1d735b8b),
3293 TOBN(0x79f3e9c4, 0x29ef8479), TOBN(0x4c13a4e3, 0x614c693f),
3294 TOBN(0x32c9af56, 0x8e143a14), TOBN(0xbc517799, 0xe29ac5c4),
3295 TOBN(0x05e17992, 0x2774856f), TOBN(0x6e52fb05, 0x6c1bf55f),
3296 TOBN(0xaeda4225, 0xe4f19e16), TOBN(0x70f4728a, 0xaf5ccb26),
3297 TOBN(0x5d2118d1, 0xb2947f22), TOBN(0xc827ea16, 0x281d6fb9),
3298 TOBN(0x8412328d, 0x8cf0eabd), TOBN(0x45ee9fb2, 0x03ef9dcf),
3299 TOBN(0x8e700421, 0xbb937d63), TOBN(0xdf8ff2d5, 0xcc4b37a6),
3300 TOBN(0xa4c0d5b2, 0x5ced7b68), TOBN(0x6537c1ef, 0xc7308f59),
3301 TOBN(0x25ce6a26, 0x3b37f8e8), TOBN(0x170e9a9b, 0xdeebc6ce),
3302 TOBN(0xdd037952, 0x8728d72c), TOBN(0x445b0e55, 0x850154bc),
3303 TOBN(0x4b7d0e06, 0x83a7337b), TOBN(0x1e3416d4, 0xffecf249),
3304 TOBN(0x24840eff, 0x66a2b71f), TOBN(0xd0d9a50a, 0xb37cc26d),
3305 TOBN(0xe2198150, 0x6fe28ef7), TOBN(0x3cc5ef16, 0x23324c7f),
3306 TOBN(0x220f3455, 0x769b5263), TOBN(0xe2ade2f1, 0xa10bf475),
3307 TOBN(0x28cd20fa, 0x458d3671), TOBN(0x1549722c, 0x2dc4847b),
3308 TOBN(0x6dd01e55, 0x591941e3), TOBN(0x0e6fbcea, 0x27128ccb),
3309 TOBN(0xae1a1e6b, 0x3bef0262), TOBN(0xfa8c472c, 0x8f54e103),
3310 TOBN(0x7539c0a8, 0x72c052ec), TOBN(0xd7b27369, 0x5a3490e9),
3311 TOBN(0x143fe1f1, 0x71684349), TOBN(0x36b4722e, 0x32e19b97),
3312 TOBN(0xdc059227, 0x90980aff), TOBN(0x175c9c88, 0x9e13d674),
3313 TOBN(0xa7de5b22, 0x6e6bfdb1), TOBN(0x5ea5b7b2, 0xbedb4b46),
3314 TOBN(0xd5570191, 0xd34a6e44), TOBN(0xfcf60d2e, 0xa24ff7e6),
3315 TOBN(0x614a392d, 0x677819e1), TOBN(0x7be74c7e, 0xaa5a29e8),
3316 TOBN(0xab50fece, 0x63c85f3f), TOBN(0xaca2e2a9, 0x46cab337),
3317 TOBN(0x7f700388, 0x122a6fe3), TOBN(0xdb69f703, 0x882a04a8),
3318 TOBN(0x9a77935d, 0xcf7aed57), TOBN(0xdf16207c, 0x8d91c86f),
3319 TOBN(0x2fca49ab, 0x63ed9998), TOBN(0xa3125c44, 0xa77ddf96),
3320 TOBN(0x05dd8a86, 0x24344072), TOBN(0xa023dda2, 0xfec3fb56),
3321 TOBN(0x421b41fc, 0x0c743032), TOBN(0x4f2120c1, 0x5e438639),
3322 TOBN(0xfb7cae51, 0xc83c1b07), TOBN(0xb2370caa, 0xcac2171a),
3323 TOBN(0x2eb2d962, 0x6cc820fb), TOBN(0x59feee5c, 0xb85a44bf),
3324 TOBN(0x94620fca, 0x5b6598f0), TOBN(0x6b922cae, 0x7e314051),
3325 TOBN(0xff8745ad, 0x106bed4e), TOBN(0x546e71f5, 0xdfa1e9ab),
3326 TOBN(0x935c1e48, 0x1ec29487), TOBN(0x9509216c, 0x4d936530),
3327 TOBN(0xc7ca3067, 0x85c9a2db), TOBN(0xd6ae5152, 0x6be8606f),
3328 TOBN(0x09dbcae6, 0xe14c651d), TOBN(0xc9536e23, 0x9bc32f96),
3329 TOBN(0xa90535a9, 0x34521b03), TOBN(0xf39c526c, 0x878756ff),
3330 TOBN(0x383172ec, 0x8aedf03c), TOBN(0x20a8075e, 0xefe0c034),
3331 TOBN(0xf22f9c62, 0x64026422), TOBN(0x8dd10780, 0x24b9d076),
3332 TOBN(0x944c742a, 0x3bef2950), TOBN(0x55b9502e, 0x88a2b00b),
3333 TOBN(0xa59e14b4, 0x86a09817), TOBN(0xa39dd3ac, 0x47bb4071),
3334 TOBN(0x55137f66, 0x3be0592f), TOBN(0x07fcafd4, 0xc9e63f5b),
3335 TOBN(0x963652ee, 0x346eb226), TOBN(0x7dfab085, 0xec2facb7),
3336 TOBN(0x273bf2b8, 0x691add26), TOBN(0x30d74540, 0xf2b46c44),
3337 TOBN(0x05e8e73e, 0xf2c2d065), TOBN(0xff9b8a00, 0xd42eeac9),
3338 TOBN(0x2fcbd205, 0x97209d22), TOBN(0xeb740ffa, 0xde14ea2c),
3339 TOBN(0xc71ff913, 0xa8aef518), TOBN(0x7bfc74bb, 0xfff4cfa2),
3340 TOBN(0x1716680c, 0xb6b36048), TOBN(0x121b2cce, 0x9ef79af1),
3341 TOBN(0xbff3c836, 0xa01eb3d3), TOBN(0x50eb1c6a, 0x5f79077b),
3342 TOBN(0xa48c32d6, 0xa004bbcf), TOBN(0x47a59316, 0x7d64f61d),
3343 TOBN(0x6068147f, 0x93102016), TOBN(0x12c5f654, 0x94d12576),
3344 TOBN(0xefb071a7, 0xc9bc6b91), TOBN(0x7c2da0c5, 0x6e23ea95),
3345 TOBN(0xf4fd45b6, 0xd4a1dd5d), TOBN(0x3e7ad9b6, 0x9122b13c),
3346 TOBN(0x342ca118, 0xe6f57a48), TOBN(0x1c2e94a7, 0x06f8288f),
3347 TOBN(0x99e68f07, 0x5a97d231), TOBN(0x7c80de97, 0x4d838758),
3348 TOBN(0xbce0f5d0, 0x05872727), TOBN(0xbe5d95c2, 0x19c4d016),
3349 TOBN(0x921d5cb1, 0x9c2492ee), TOBN(0x42192dc1, 0x404d6fb3),
3350 TOBN(0x4c84dcd1, 0x32f988d3), TOBN(0xde26d61f, 0xa17b8e85),
3351 TOBN(0xc466dcb6, 0x137c7408), TOBN(0x9a38d7b6, 0x36a266da),
3352 TOBN(0x7ef5cb06, 0x83bebf1b), TOBN(0xe5cdcbbf, 0x0fd014e3),
3353 TOBN(0x30aa376d, 0xf65965a0), TOBN(0x60fe88c2, 0xebb3e95e),
3354 TOBN(0x33fd0b61, 0x66ee6f20), TOBN(0x8827dcdb, 0x3f41f0a0),
3355 TOBN(0xbf8a9d24, 0x0c56c690), TOBN(0x40265dad, 0xddb7641d),
3356 TOBN(0x522b05bf, 0x3a6b662b), TOBN(0x466d1dfe, 0xb1478c9b),
3357 TOBN(0xaa616962, 0x1484469b), TOBN(0x0db60549, 0x02df8f9f),
3358 TOBN(0xc37bca02, 0x3cb8bf51), TOBN(0x5effe346, 0x21371ce8),
3359 TOBN(0xe8f65264, 0xff112c32), TOBN(0x8a9c736d, 0x7b971fb2),
3360 TOBN(0xa4f19470, 0x7b75080d), TOBN(0xfc3f2c5a, 0x8839c59b),
3361 TOBN(0x1d6c777e, 0x5aeb49c2), TOBN(0xf3db034d, 0xda1addfe),
3362 TOBN(0xd76fee5a, 0x5535affc), TOBN(0x0853ac70, 0xb92251fd),
3363 TOBN(0x37e3d594, 0x8b2a29d5), TOBN(0x28f1f457, 0x4de00ddb),
3364 TOBN(0x8083c1b5, 0xf42c328b), TOBN(0xd8ef1d8f, 0xe493c73b),
3365 TOBN(0x96fb6260, 0x41dc61bd), TOBN(0xf74e8a9d, 0x27ee2f8a),
3366 TOBN(0x7c605a80, 0x2c946a5d), TOBN(0xeed48d65, 0x3839ccfd),
3367 TOBN(0x9894344f, 0x3a29467a), TOBN(0xde81e949, 0xc51eba6d),
3368 TOBN(0xdaea066b, 0xa5e5c2f2), TOBN(0x3fc8a614, 0x08c8c7b3),
3369 TOBN(0x7adff88f, 0x06d0de9f), TOBN(0xbbc11cf5, 0x3b75ce0a),
3370 TOBN(0x9fbb7acc, 0xfbbc87d5), TOBN(0xa1458e26, 0x7badfde2)},
3371 {
3372 TOBN(0x1cb43668, 0xe039c256), TOBN(0x5f26fb8b, 0x7c17fd5d),
3373 TOBN(0xeee426af, 0x79aa062b), TOBN(0x072002d0, 0xd78fbf04),
3374 TOBN(0x4c9ca237, 0xe84fb7e3), TOBN(0xb401d8a1, 0x0c82133d),
3375 TOBN(0xaaa52592, 0x6d7e4181), TOBN(0xe9430833, 0x73dbb152),
3376 TOBN(0xf92dda31, 0xbe24319a), TOBN(0x03f7d28b, 0xe095a8e7),
3377 TOBN(0xa52fe840, 0x98782185), TOBN(0x276ddafe, 0x29c24dbc),
3378 TOBN(0x80cd5496, 0x1d7a64eb), TOBN(0xe4360889, 0x7f1dbe42),
3379 TOBN(0x2f81a877, 0x8438d2d5), TOBN(0x7e4d52a8, 0x85169036),
3380 TOBN(0x19e3d5b1, 0x1d59715d), TOBN(0xc7eaa762, 0xd788983e),
3381 TOBN(0xe5a730b0, 0xabf1f248), TOBN(0xfbab8084, 0xfae3fd83),
3382 TOBN(0x65e50d21, 0x53765b2f), TOBN(0xbdd4e083, 0xfa127f3d),
3383 TOBN(0x9cf3c074, 0x397b1b10), TOBN(0x59f8090c, 0xb1b59fd3),
3384 TOBN(0x7b15fd9d, 0x615faa8f), TOBN(0x8fa1eb40, 0x968554ed),
3385 TOBN(0x7bb4447e, 0x7aa44882), TOBN(0x2bb2d0d1, 0x029fff32),
3386 TOBN(0x075e2a64, 0x6caa6d2f), TOBN(0x8eb879de, 0x22e7351b),
3387 TOBN(0xbcd5624e, 0x9a506c62), TOBN(0x218eaef0, 0xa87e24dc),
3388 TOBN(0x37e56847, 0x44ddfa35), TOBN(0x9ccfc5c5, 0xdab3f747),
3389 TOBN(0x9ac1df3f, 0x1ee96cf4), TOBN(0x0c0571a1, 0x3b480b8f),
3390 TOBN(0x2fbeb3d5, 0x4b3a7b3c), TOBN(0x35c03669, 0x5dcdbb99),
3391 TOBN(0x52a0f5dc, 0xb2415b3a), TOBN(0xd57759b4, 0x4413ed9a),
3392 TOBN(0x1fe647d8, 0x3d30a2c5), TOBN(0x0857f77e, 0xf78a81dc),
3393 TOBN(0x11d5a334, 0x131a4a9b), TOBN(0xc0a94af9, 0x29d393f5),
3394 TOBN(0xbc3a5c0b, 0xdaa6ec1a), TOBN(0xba9fe493, 0x88d2d7ed),
3395 TOBN(0xbb4335b4, 0xbb614797), TOBN(0x991c4d68, 0x72f83533),
3396 TOBN(0x53258c28, 0xd2f01cb3), TOBN(0x93d6eaa3, 0xd75db0b1),
3397 TOBN(0x419a2b0d, 0xe87d0db4), TOBN(0xa1e48f03, 0xd8fe8493),
3398 TOBN(0xf747faf6, 0xc508b23a), TOBN(0xf137571a, 0x35d53549),
3399 TOBN(0x9f5e58e2, 0xfcf9b838), TOBN(0xc7186cee, 0xa7fd3cf5),
3400 TOBN(0x77b868ce, 0xe978a1d3), TOBN(0xe3a68b33, 0x7ab92d04),
3401 TOBN(0x51029794, 0x87a5b862), TOBN(0x5f0606c3, 0x3a61d41d),
3402 TOBN(0x2814be27, 0x6f9326f1), TOBN(0x2f521c14, 0xc6fe3c2e),
3403 TOBN(0x17464d7d, 0xacdf7351), TOBN(0x10f5f9d3, 0x777f7e44),
3404 TOBN(0xce8e616b, 0x269fb37d), TOBN(0xaaf73804, 0x7de62de5),
3405 TOBN(0xaba11175, 0x4fdd4153), TOBN(0x515759ba, 0x3770b49b),
3406 TOBN(0x8b09ebf8, 0xaa423a61), TOBN(0x592245a1, 0xcd41fb92),
3407 TOBN(0x1cba8ec1, 0x9b4c8936), TOBN(0xa87e91e3, 0xaf36710e),
3408 TOBN(0x1fd84ce4, 0x3d34a2e3), TOBN(0xee3759ce, 0xb43b5d61),
3409 TOBN(0x895bc78c, 0x619186c7), TOBN(0xf19c3809, 0xcbb9725a),
3410 TOBN(0xc0be21aa, 0xde744b1f), TOBN(0xa7d222b0, 0x60f8056b),
3411 TOBN(0x74be6157, 0xb23efe11), TOBN(0x6fab2b4f, 0x0cd68253),
3412 TOBN(0xad33ea5f, 0x4bf1d725), TOBN(0x9c1d8ee2, 0x4f6c950f),
3413 TOBN(0x544ee78a, 0xa377af06), TOBN(0x54f489bb, 0x94a113e1),
3414 TOBN(0x8f11d634, 0x992fb7e8), TOBN(0x0169a7aa, 0xa2a44347),
3415 TOBN(0x1d49d4af, 0x95020e00), TOBN(0x95945722, 0xe08e120b),
3416 TOBN(0xb6e33878, 0xa4d32282), TOBN(0xe36e029d, 0x48020ae7),
3417 TOBN(0xe05847fb, 0x37a9b750), TOBN(0xf876812c, 0xb29e3819),
3418 TOBN(0x84ad138e, 0xd23a17f0), TOBN(0x6d7b4480, 0xf0b3950e),
3419 TOBN(0xdfa8aef4, 0x2fd67ae0), TOBN(0x8d3eea24, 0x52333af6),
3420 TOBN(0x0d052075, 0xb15d5acc), TOBN(0xc6d9c79f, 0xbd815bc4),
3421 TOBN(0x8dcafd88, 0xdfa36cf2), TOBN(0x908ccbe2, 0x38aa9070),
3422 TOBN(0x638722c4, 0xba35afce), TOBN(0x5a3da8b0, 0xfd6abf0b),
3423 TOBN(0x2dce252c, 0xc9c335c1), TOBN(0x84e7f0de, 0x65aa799b),
3424 TOBN(0x2101a522, 0xb99a72cb), TOBN(0x06de6e67, 0x87618016),
3425 TOBN(0x5ff8c7cd, 0xe6f3653e), TOBN(0x0a821ab5, 0xc7a6754a),
3426 TOBN(0x7e3fa52b, 0x7cb0b5a2), TOBN(0xa7fb121c, 0xc9048790),
3427 TOBN(0x1a725020, 0x06ce053a), TOBN(0xb490a31f, 0x04e929b0),
3428 TOBN(0xe17be47d, 0x62dd61ad), TOBN(0x781a961c, 0x6be01371),
3429 TOBN(0x1063bfd3, 0xdae3cbba), TOBN(0x35647406, 0x7f73c9ba),
3430 TOBN(0xf50e957b, 0x2736a129), TOBN(0xa6313702, 0xed13f256),
3431 TOBN(0x9436ee65, 0x3a19fcc5), TOBN(0xcf2bdb29, 0xe7a4c8b6),
3432 TOBN(0xb06b1244, 0xc5f95cd8), TOBN(0xda8c8af0, 0xf4ab95f4),
3433 TOBN(0x1bae59c2, 0xb9e5836d), TOBN(0x07d51e7e, 0x3acffffc),
3434 TOBN(0x01e15e6a, 0xc2ccbcda), TOBN(0x3bc1923f, 0x8528c3e0),
3435 TOBN(0x43324577, 0xa49fead4), TOBN(0x61a1b884, 0x2aa7a711),
3436 TOBN(0xf9a86e08, 0x700230ef), TOBN(0x0af585a1, 0xbd19adf8),
3437 TOBN(0x7645f361, 0xf55ad8f2), TOBN(0x6e676223, 0x46c3614c),
3438 TOBN(0x23cb257c, 0x4e774d3f), TOBN(0x82a38513, 0xac102d1b),
3439 TOBN(0x9bcddd88, 0x7b126aa5), TOBN(0xe716998b, 0xeefd3ee4),
3440 TOBN(0x4239d571, 0xfb167583), TOBN(0xdd011c78, 0xd16c8f8a),
3441 TOBN(0x271c2895, 0x69a27519), TOBN(0x9ce0a3b7, 0xd2d64b6a),
3442 TOBN(0x8c977289, 0xd5ec6738), TOBN(0xa3b49f9a, 0x8840ef6b),
3443 TOBN(0x808c14c9, 0x9a453419), TOBN(0x5c00295b, 0x0cf0a2d5),
3444 TOBN(0x524414fb, 0x1d4bcc76), TOBN(0xb07691d2, 0x459a88f1),
3445 TOBN(0x77f43263, 0xf70d110f), TOBN(0x64ada5e0, 0xb7abf9f3),
3446 TOBN(0xafd0f94e, 0x5b544cf5), TOBN(0xb4a13a15, 0xfd2713fe),
3447 TOBN(0xb99b7d6e, 0x250c74f4), TOBN(0x097f2f73, 0x20324e45),
3448 TOBN(0x994b37d8, 0xaffa8208), TOBN(0xc3c31b0b, 0xdc29aafc),
3449 TOBN(0x3da74651, 0x7a3a607f), TOBN(0xd8e1b8c1, 0xfe6955d6),
3450 TOBN(0x716e1815, 0xc8418682), TOBN(0x541d487f, 0x7dc91d97),
3451 TOBN(0x48a04669, 0xc6996982), TOBN(0xf39cab15, 0x83a6502e),
3452 TOBN(0x025801a0, 0xe68db055), TOBN(0xf3569758, 0xba3338d5),
3453 TOBN(0xb0c8c0aa, 0xee2afa84), TOBN(0x4f6985d3, 0xfb6562d1),
3454 TOBN(0x351f1f15, 0x132ed17a), TOBN(0x510ed0b4, 0xc04365fe),
3455 TOBN(0xa3f98138, 0xe5b1f066), TOBN(0xbc9d95d6, 0x32df03dc),
3456 TOBN(0xa83ccf6e, 0x19abd09e), TOBN(0x0b4097c1, 0x4ff17edb),
3457 TOBN(0x58a5c478, 0xd64a06ce), TOBN(0x2ddcc3fd, 0x544a58fd),
3458 TOBN(0xd449503d, 0x9e8153b8), TOBN(0x3324fd02, 0x7774179b),
3459 TOBN(0xaf5d47c8, 0xdbd9120c), TOBN(0xeb860162, 0x34fa94db),
3460 TOBN(0x5817bdd1, 0x972f07f4), TOBN(0xe5579e2e, 0xd27bbceb),
3461 TOBN(0x86847a1f, 0x5f11e5a6), TOBN(0xb39ed255, 0x7c3cf048),
3462 TOBN(0xe1076417, 0xa2f62e55), TOBN(0x6b9ab38f, 0x1bcf82a2),
3463 TOBN(0x4bb7c319, 0x7aeb29f9), TOBN(0xf6d17da3, 0x17227a46),
3464 TOBN(0xab53ddbd, 0x0f968c00), TOBN(0xa03da7ec, 0x000c880b),
3465 TOBN(0x7b239624, 0x6a9ad24d), TOBN(0x612c0401, 0x01ec60d0),
3466 TOBN(0x70d10493, 0x109f5df1), TOBN(0xfbda4030, 0x80af7550),
3467 TOBN(0x30b93f95, 0xc6b9a9b3), TOBN(0x0c74ec71, 0x007d9418),
3468 TOBN(0x94175564, 0x6edb951f), TOBN(0x5f4a9d78, 0x7f22c282),
3469 TOBN(0xb7870895, 0xb38d1196), TOBN(0xbc593df3, 0xa228ce7c),
3470 TOBN(0xc78c5bd4, 0x6af3641a), TOBN(0x7802200b, 0x3d9b3dcc),
3471 TOBN(0x0dc73f32, 0x8be33304), TOBN(0x847ed87d, 0x61ffb79a),
3472 TOBN(0xf85c974e, 0x6d671192), TOBN(0x1e14100a, 0xde16f60f),
3473 TOBN(0x45cb0d5a, 0x95c38797), TOBN(0x18923bba, 0x9b022da4),
3474 TOBN(0xef2be899, 0xbbe7e86e), TOBN(0x4a1510ee, 0x216067bf),
3475 TOBN(0xd98c8154, 0x84d5ce3e), TOBN(0x1af777f0, 0xf92a2b90),
3476 TOBN(0x9fbcb400, 0x4ef65724), TOBN(0x3e04a4c9, 0x3c0ca6fe),
3477 TOBN(0xfb3e2cb5, 0x55002994), TOBN(0x1f3a93c5, 0x5363ecab),
3478 TOBN(0x1fe00efe, 0x3923555b), TOBN(0x744bedd9, 0x1e1751ea),
3479 TOBN(0x3fb2db59, 0x6ab69357), TOBN(0x8dbd7365, 0xf5e6618b),
3480 TOBN(0x99d53099, 0xdf1ea40e), TOBN(0xb3f24a0b, 0x57d61e64),
3481 TOBN(0xd088a198, 0x596eb812), TOBN(0x22c8361b, 0x5762940b),
3482 TOBN(0x66f01f97, 0xf9c0d95c), TOBN(0x88461172, 0x8e43cdae),
3483 TOBN(0x11599a7f, 0xb72b15c3), TOBN(0x135a7536, 0x420d95cc),
3484 TOBN(0x2dcdf0f7, 0x5f7ae2f6), TOBN(0x15fc6e1d, 0xd7fa6da2),
3485 TOBN(0x81ca829a, 0xd1d441b6), TOBN(0x84c10cf8, 0x04a106b6),
3486 TOBN(0xa9b26c95, 0xa73fbbd0), TOBN(0x7f24e0cb, 0x4d8f6ee8),
3487 TOBN(0x48b45937, 0x1e25a043), TOBN(0xf8a74fca, 0x036f3dfe),
3488 TOBN(0x1ed46585, 0xc9f84296), TOBN(0x7fbaa8fb, 0x3bc278b0),
3489 TOBN(0xa8e96cd4, 0x6c4fcbd0), TOBN(0x940a1202, 0x73b60a5f),
3490 TOBN(0x34aae120, 0x55a4aec8), TOBN(0x550e9a74, 0xdbd742f0),
3491 TOBN(0x794456d7, 0x228c68ab), TOBN(0x492f8868, 0xa4e25ec6),
3492 TOBN(0x682915ad, 0xb2d8f398), TOBN(0xf13b51cc, 0x5b84c953),
3493 TOBN(0xcda90ab8, 0x5bb917d6), TOBN(0x4b615560, 0x4ea3dee1),
3494 TOBN(0x578b4e85, 0x0a52c1c8), TOBN(0xeab1a695, 0x20b75fc4),
3495 TOBN(0x60c14f3c, 0xaa0bb3c6), TOBN(0x220f448a, 0xb8216094),
3496 TOBN(0x4fe7ee31, 0xb0e63d34), TOBN(0xf4600572, 0xa9e54fab),
3497 TOBN(0xc0493334, 0xd5e7b5a4), TOBN(0x8589fb92, 0x06d54831),
3498 TOBN(0xaa70f5cc, 0x6583553a), TOBN(0x0879094a, 0xe25649e5),
3499 TOBN(0xcc904507, 0x10044652), TOBN(0xebb0696d, 0x02541c4f),
3500 TOBN(0x5a171fde, 0xb9718710), TOBN(0x38f1bed8, 0xf374a9f5),
3501 TOBN(0xc8c582e1, 0xba39bdc1), TOBN(0xfc457b0a, 0x908cc0ce),
3502 TOBN(0x9a187fd4, 0x883841e2), TOBN(0x8ec25b39, 0x38725381),
3503 TOBN(0x2553ed05, 0x96f84395), TOBN(0x095c7661, 0x6f6c6897),
3504 TOBN(0x917ac85c, 0x4bdc5610), TOBN(0xb2885fe4, 0x179eb301),
3505 TOBN(0x5fc65547, 0x8b78bdcc), TOBN(0x4a9fc893, 0xe59e4699),
3506 TOBN(0xbb7ff0cd, 0x3ce299af), TOBN(0x195be9b3, 0xadf38b20),
3507 TOBN(0x6a929c87, 0xd38ddb8f), TOBN(0x55fcc99c, 0xb21a51b9),
3508 TOBN(0x2b695b4c, 0x721a4593), TOBN(0xed1e9a15, 0x768eaac2),
3509 TOBN(0xfb63d71c, 0x7489f914), TOBN(0xf98ba31c, 0x78118910),
3510 TOBN(0x80291373, 0x9b128eb4), TOBN(0x7801214e, 0xd448af4a),
3511 TOBN(0xdbd2e22b, 0x55418dd3), TOBN(0xeffb3c0d, 0xd3998242),
3512 TOBN(0xdfa6077c, 0xc7bf3827), TOBN(0xf2165bcb, 0x47f8238f),
3513 TOBN(0xfe37cf68, 0x8564d554), TOBN(0xe5f825c4, 0x0a81fb98),
3514 TOBN(0x43cc4f67, 0xffed4d6f), TOBN(0xbc609578, 0xb50a34b0),
3515 TOBN(0x8aa8fcf9, 0x5041faf1), TOBN(0x5659f053, 0x651773b6),
3516 TOBN(0xe87582c3, 0x6044d63b), TOBN(0xa6089409, 0x0cdb0ca0),
3517 TOBN(0x8c993e0f, 0xbfb2bcf6), TOBN(0xfc64a719, 0x45985cfc),
3518 TOBN(0x15c4da80, 0x83dbedba), TOBN(0x804ae112, 0x2be67df7),
3519 TOBN(0xda4c9658, 0xa23defde), TOBN(0x12002ddd, 0x5156e0d3),
3520 TOBN(0xe68eae89, 0x5dd21b96), TOBN(0x8b99f28b, 0xcf44624d),
3521 TOBN(0x0ae00808, 0x1ec8897a), TOBN(0xdd0a9303, 0x6712f76e),
3522 TOBN(0x96237522, 0x4e233de4), TOBN(0x192445b1, 0x2b36a8a5),
3523 TOBN(0xabf9ff74, 0x023993d9), TOBN(0x21f37bf4, 0x2aad4a8f),
3524 TOBN(0x340a4349, 0xf8bd2bbd), TOBN(0x1d902cd9, 0x4868195d),
3525 TOBN(0x3d27bbf1, 0xe5fdb6f1), TOBN(0x7a5ab088, 0x124f9f1c),
3526 TOBN(0xc466ab06, 0xf7a09e03), TOBN(0x2f8a1977, 0x31f2c123),
3527 TOBN(0xda355dc7, 0x041b6657), TOBN(0xcb840d12, 0x8ece2a7c),
3528 TOBN(0xb600ad9f, 0x7db32675), TOBN(0x78fea133, 0x07a06f1b),
3529 TOBN(0x5d032269, 0xb31f6094), TOBN(0x07753ef5, 0x83ec37aa),
3530 TOBN(0x03485aed, 0x9c0bea78), TOBN(0x41bb3989, 0xbc3f4524),
3531 TOBN(0x09403761, 0x697f726d), TOBN(0x6109beb3, 0xdf394820),
3532 TOBN(0x804111ea, 0x3b6d1145), TOBN(0xb6271ea9, 0xa8582654),
3533 TOBN(0x619615e6, 0x24e66562), TOBN(0xa2554945, 0xd7b6ad9c),
3534 TOBN(0xd9c4985e, 0x99bfe35f), TOBN(0x9770ccc0, 0x7b51cdf6),
3535 TOBN(0x7c327013, 0x92881832), TOBN(0x8777d45f, 0x286b26d1),
3536 TOBN(0x9bbeda22, 0xd847999d), TOBN(0x03aa33b6, 0xc3525d32),
3537 TOBN(0x4b7b96d4, 0x28a959a1), TOBN(0xbb3786e5, 0x31e5d234),
3538 TOBN(0xaeb5d3ce, 0x6961f247), TOBN(0x20aa85af, 0x02f93d3f),
3539 TOBN(0x9cd1ad3d, 0xd7a7ae4f), TOBN(0xbf6688f0, 0x781adaa8),
3540 TOBN(0xb1b40e86, 0x7469cead), TOBN(0x1904c524, 0x309fca48),
3541 TOBN(0x9b7312af, 0x4b54bbc7), TOBN(0xbe24bf8f, 0x593affa2),
3542 TOBN(0xbe5e0790, 0xbd98764b), TOBN(0xa0f45f17, 0xa26e299e),
3543 TOBN(0x4af0d2c2, 0x6b8fe4c7), TOBN(0xef170db1, 0x8ae8a3e6),
3544 TOBN(0x0e8d61a0, 0x29e0ccc1), TOBN(0xcd53e87e, 0x60ad36ca),
3545 TOBN(0x328c6623, 0xc8173822), TOBN(0x7ee1767d, 0xa496be55),
3546 TOBN(0x89f13259, 0x648945af), TOBN(0x9e45a5fd, 0x25c8009c),
3547 TOBN(0xaf2febd9, 0x1f61ab8c), TOBN(0x43f6bc86, 0x8a275385),
3548 TOBN(0x87792348, 0xf2142e79), TOBN(0x17d89259, 0xc6e6238a),
3549 TOBN(0x7536d2f6, 0x4a839d9b), TOBN(0x1f428fce, 0x76a1fbdc),
3550 TOBN(0x1c109601, 0x0db06dfe), TOBN(0xbfc16bc1, 0x50a3a3cc),
3551 TOBN(0xf9cbd9ec, 0x9b30f41b), TOBN(0x5b5da0d6, 0x00138cce),
3552 TOBN(0xec1d0a48, 0x56ef96a7), TOBN(0xb47eb848, 0x982bf842),
3553 TOBN(0x66deae32, 0xec3f700d), TOBN(0x4e43c42c, 0xaa1181e0),
3554 TOBN(0xa1d72a31, 0xd1a4aa2a), TOBN(0x440d4668, 0xc004f3ce),
3555 TOBN(0x0d6a2d3b, 0x45fe8a7a), TOBN(0x820e52e2, 0xfb128365),
3556 TOBN(0x29ac5fcf, 0x25e51b09), TOBN(0x180cd2bf, 0x2023d159),
3557 TOBN(0xa9892171, 0xa1ebf90e), TOBN(0xf97c4c87, 0x7c132181),
3558 TOBN(0x9f1dc724, 0xc03dbb7e), TOBN(0xae043765, 0x018cbbe4),
3559 TOBN(0xfb0b2a36, 0x0767d153), TOBN(0xa8e2f4d6, 0x249cbaeb),
3560 TOBN(0x172a5247, 0xd95ea168), TOBN(0x1758fada, 0x2970764a),
3561 TOBN(0xac803a51, 0x1d978169), TOBN(0x299cfe2e, 0xde77e01b),
3562 TOBN(0x652a1e17, 0xb0a98927), TOBN(0x2e26e1d1, 0x20014495),
3563 TOBN(0x7ae0af9f, 0x7175b56a), TOBN(0xc2e22a80, 0xd64b9f95),
3564 TOBN(0x4d0ff9fb, 0xd90a060a), TOBN(0x496a27db, 0xbaf38085),
3565 TOBN(0x32305401, 0xda776bcf), TOBN(0xb8cdcef6, 0x725f209e),
3566 TOBN(0x61ba0f37, 0x436a0bba), TOBN(0x263fa108, 0x76860049),
3567 TOBN(0x92beb98e, 0xda3542cf), TOBN(0xa2d4d14a, 0xd5849538),
3568 TOBN(0x989b9d68, 0x12e9a1bc), TOBN(0x61d9075c, 0x5f6e3268),
3569 TOBN(0x352c6aa9, 0x99ace638), TOBN(0xde4e4a55, 0x920f43ff),
3570 TOBN(0xe5e4144a, 0xd673c017), TOBN(0x667417ae, 0x6f6e05ea),
3571 TOBN(0x613416ae, 0xdcd1bd56), TOBN(0x5eb36201, 0x86693711),
3572 TOBN(0x2d7bc504, 0x3a1aa914), TOBN(0x175a1299, 0x76dc5975),
3573 TOBN(0xe900e0f2, 0x3fc8125c), TOBN(0x569ef68c, 0x11198875),
3574 TOBN(0x9012db63, 0x63a113b4), TOBN(0xe3bd3f56, 0x98835766),
3575 TOBN(0xa5c94a52, 0x76412dea), TOBN(0xad9e2a09, 0xaa735e5c),
3576 TOBN(0x405a984c, 0x508b65e9), TOBN(0xbde4a1d1, 0x6df1a0d1),
3577 TOBN(0x1a9433a1, 0xdfba80da), TOBN(0xe9192ff9, 0x9440ad2e),
3578 TOBN(0x9f649696, 0x5099fe92), TOBN(0x25ddb65c, 0x0b27a54a),
3579 TOBN(0x178279dd, 0xc590da61), TOBN(0x5479a999, 0xfbde681a),
3580 TOBN(0xd0e84e05, 0x013fe162), TOBN(0xbe11dc92, 0x632d471b),
3581 TOBN(0xdf0b0c45, 0xfc0e089f), TOBN(0x04fb15b0, 0x4c144025),
3582 TOBN(0xa61d5fc2, 0x13c99927), TOBN(0xa033e9e0, 0x3de2eb35),
3583 TOBN(0xf8185d5c, 0xb8dacbb4), TOBN(0x9a88e265, 0x8644549d),
3584 TOBN(0xf717af62, 0x54671ff6), TOBN(0x4bd4241b, 0x5fa58603),
3585 TOBN(0x06fba40b, 0xe67773c0), TOBN(0xc1d933d2, 0x6a2847e9),
3586 TOBN(0xf4f5acf3, 0x689e2c70), TOBN(0x92aab0e7, 0x46bafd31),
3587 TOBN(0x798d76aa, 0x3473f6e5), TOBN(0xcc6641db, 0x93141934),
3588 TOBN(0xcae27757, 0xd31e535e), TOBN(0x04cc43b6, 0x87c2ee11),
3589 TOBN(0x8d1f9675, 0x2e029ffa), TOBN(0xc2150672, 0xe4cc7a2c),
3590 TOBN(0x3b03c1e0, 0x8d68b013), TOBN(0xa9d6816f, 0xedf298f3),
3591 TOBN(0x1bfbb529, 0xa2804464), TOBN(0x95a52fae, 0x5db22125),
3592 TOBN(0x55b32160, 0x0e1cb64e), TOBN(0x004828f6, 0x7e7fc9fe),
3593 TOBN(0x13394b82, 0x1bb0fb93), TOBN(0xb6293a2d, 0x35f1a920),
3594 TOBN(0xde35ef21, 0xd145d2d9), TOBN(0xbe6225b3, 0xbb8fa603),
3595 TOBN(0x00fc8f6b, 0x32cf252d), TOBN(0xa28e52e6, 0x117cf8c2),
3596 TOBN(0x9d1dc89b, 0x4c371e6d), TOBN(0xcebe0675, 0x36ef0f28),
3597 TOBN(0x5de05d09, 0xa4292f81), TOBN(0xa8303593, 0x353e3083),
3598 TOBN(0xa1715b0a, 0x7e37a9bb), TOBN(0x8c56f61e, 0x2b8faec3),
3599 TOBN(0x52507431, 0x33c9b102), TOBN(0x0130cefc, 0xa44431f0),
3600 TOBN(0x56039fa0, 0xbd865cfb), TOBN(0x4b03e578, 0xbc5f1dd7),
3601 TOBN(0x40edf2e4, 0xbabe7224), TOBN(0xc752496d, 0x3a1988f6),
3602 TOBN(0xd1572d3b, 0x564beb6b), TOBN(0x0db1d110, 0x39a1c608),
3603 TOBN(0x568d1934, 0x16f60126), TOBN(0x05ae9668, 0xf354af33),
3604 TOBN(0x19de6d37, 0xc92544f2), TOBN(0xcc084353, 0xa35837d5),
3605 TOBN(0xcbb6869c, 0x1a514ece), TOBN(0xb633e728, 0x2e1d1066),
3606 TOBN(0xf15dd69f, 0x936c581c), TOBN(0x96e7b8ce, 0x7439c4f9),
3607 TOBN(0x5e676f48, 0x2e448a5b), TOBN(0xb2ca7d5b, 0xfd916bbb),
3608 TOBN(0xd55a2541, 0xf5024025), TOBN(0x47bc5769, 0xe4c2d937),
3609 TOBN(0x7d31b92a, 0x0362189f), TOBN(0x83f3086e, 0xef7816f9),
3610 TOBN(0xf9f46d94, 0xb587579a), TOBN(0xec2d22d8, 0x30e76c5f),
3611 TOBN(0x27d57461, 0xb000ffcf), TOBN(0xbb7e65f9, 0x364ffc2c),
3612 TOBN(0x7c7c9477, 0x6652a220), TOBN(0x61618f89, 0xd696c981),
3613 TOBN(0x5021701d, 0x89effff3), TOBN(0xf2c8ff8e, 0x7c314163),
3614 TOBN(0x2da413ad, 0x8efb4d3e), TOBN(0x937b5adf, 0xce176d95),
3615 TOBN(0x22867d34, 0x2a67d51c), TOBN(0x262b9b10, 0x18eb3ac9),
3616 TOBN(0x4e314fe4, 0xc43ff28b), TOBN(0x76476627, 0x6a664e7a),
3617 TOBN(0x3e90e40b, 0xb7a565c2), TOBN(0x8588993a, 0xc1acf831),
3618 TOBN(0xd7b501d6, 0x8f938829), TOBN(0x996627ee, 0x3edd7d4c),
3619 TOBN(0x37d44a62, 0x90cd34c7), TOBN(0xa8327499, 0xf3833e8d),
3620 TOBN(0x2e18917d, 0x4bf50353), TOBN(0x85dd726b, 0x556765fb),
3621 TOBN(0x54fe65d6, 0x93d5ab66), TOBN(0x3ddbaced, 0x915c25fe),
3622 TOBN(0xa799d9a4, 0x12f22e85), TOBN(0xe2a24867, 0x6d06f6bc),
3623 TOBN(0xf4f1ee56, 0x43ca1637), TOBN(0xfda2828b, 0x61ece30a),
3624 TOBN(0x758c1a3e, 0xa2dee7a6), TOBN(0xdcde2f3c, 0x734b2284),
3625 TOBN(0xaba445d2, 0x4eaba6ad), TOBN(0x35aaf668, 0x76cee0a7),
3626 TOBN(0x7e0b04a9, 0xe5aa049a), TOBN(0xe74083ad, 0x91103e84),
3627 TOBN(0xbeb183ce, 0x40afecc3), TOBN(0x6b89de9f, 0xea043f7a),
3628 },
3629 {TOBN(0x0e299d23, 0xfe67ba66), TOBN(0x91450760, 0x93cf2f34),
3630 TOBN(0xf45b5ea9, 0x97fcf913), TOBN(0x5be00843, 0x8bd7ddda),
3631 TOBN(0x358c3e05, 0xd53ff04d), TOBN(0xbf7ccdc3, 0x5de91ef7),
3632 TOBN(0xad684dbf, 0xb69ec1a0), TOBN(0x367e7cf2, 0x801fd997),
3633 TOBN(0x0ca1f3b7, 0xb0dc8595), TOBN(0x27de4608, 0x9f1d9f2e),
3634 TOBN(0x1af3bf39, 0xbadd82a7), TOBN(0x79356a79, 0x65862448),
3635 TOBN(0xc0602345, 0xf5f9a052), TOBN(0x1a8b0f89, 0x139a42f9),
3636 TOBN(0xb53eee42, 0x844d40fc), TOBN(0x93b0bfe5, 0x4e5b6368),
3637 TOBN(0x5434dd02, 0xc024789c), TOBN(0x90dca9ea, 0x41b57bfc),
3638 TOBN(0x8aa898e2, 0x243398df), TOBN(0xf607c834, 0x894a94bb),
3639 TOBN(0xbb07be97, 0xc2c99b76), TOBN(0x6576ba67, 0x18c29302),
3640 TOBN(0x3d79efcc, 0xe703a88c), TOBN(0xf259ced7, 0xb6a0d106),
3641 TOBN(0x0f893a5d, 0xc8de610b), TOBN(0xe8c515fb, 0x67e223ce),
3642 TOBN(0x7774bfa6, 0x4ead6dc5), TOBN(0x89d20f95, 0x925c728f),
3643 TOBN(0x7a1e0966, 0x098583ce), TOBN(0xa2eedb94, 0x93f2a7d7),
3644 TOBN(0x1b282097, 0x4c304d4a), TOBN(0x0842e3da, 0xc077282d),
3645 TOBN(0xe4d972a3, 0x3b9e2d7b), TOBN(0x7cc60b27, 0xc48218ff),
3646 TOBN(0x8fc70838, 0x84149d91), TOBN(0x5c04346f, 0x2f461ecc),
3647 TOBN(0xebe9fdf2, 0x614650a9), TOBN(0x5e35b537, 0xc1f666ac),
3648 TOBN(0x645613d1, 0x88babc83), TOBN(0x88cace3a, 0xc5e1c93e),
3649 TOBN(0x209ca375, 0x3de92e23), TOBN(0xccb03cc8, 0x5fbbb6e3),
3650 TOBN(0xccb90f03, 0xd7b1487e), TOBN(0xfa9c2a38, 0xc710941f),
3651 TOBN(0x756c3823, 0x6724ceed), TOBN(0x3a902258, 0x192d0323),
3652 TOBN(0xb150e519, 0xea5e038e), TOBN(0xdcba2865, 0xc7427591),
3653 TOBN(0xe549237f, 0x78890732), TOBN(0xc443bef9, 0x53fcb4d9),
3654 TOBN(0x9884d8a6, 0xeb3480d6), TOBN(0x8a35b6a1, 0x3048b186),
3655 TOBN(0xb4e44716, 0x65e9a90a), TOBN(0x45bf380d, 0x653006c0),
3656 TOBN(0x8f3f820d, 0x4fe9ae3b), TOBN(0x244a35a0, 0x979a3b71),
3657 TOBN(0xa1010e9d, 0x74cd06ff), TOBN(0x9c17c7df, 0xaca3eeac),
3658 TOBN(0x74c86cd3, 0x8063aa2b), TOBN(0x8595c4b3, 0x734614ff),
3659 TOBN(0xa3de00ca, 0x990f62cc), TOBN(0xd9bed213, 0xca0c3be5),
3660 TOBN(0x7886078a, 0xdf8ce9f5), TOBN(0xddb27ce3, 0x5cd44444),
3661 TOBN(0xed374a66, 0x58926ddd), TOBN(0x138b2d49, 0x908015b8),
3662 TOBN(0x886c6579, 0xde1f7ab8), TOBN(0x888b9aa0, 0xc3020b7a),
3663 TOBN(0xd3ec034e, 0x3a96e355), TOBN(0xba65b0b8, 0xf30fbe9a),
3664 TOBN(0x064c8e50, 0xff21367a), TOBN(0x1f508ea4, 0x0b04b46e),
3665 TOBN(0x98561a49, 0x747c866c), TOBN(0xbbb1e5fe, 0x0518a062),
3666 TOBN(0x20ff4e8b, 0xecdc3608), TOBN(0x7f55cded, 0x20184027),
3667 TOBN(0x8d73ec95, 0xf38c85f0), TOBN(0x5b589fdf, 0x8bc3b8c3),
3668 TOBN(0xbe95dd98, 0x0f12b66f), TOBN(0xf5bd1a09, 0x0e338e01),
3669 TOBN(0x65163ae5, 0x5e915918), TOBN(0x6158d6d9, 0x86f8a46b),
3670 TOBN(0x8466b538, 0xeeebf99c), TOBN(0xca8761f6, 0xbca477ef),
3671 TOBN(0xaf3449c2, 0x9ebbc601), TOBN(0xef3b0f41, 0xe0c3ae2f),
3672 TOBN(0xaa6c577d, 0x5de63752), TOBN(0xe9166601, 0x64682a51),
3673 TOBN(0x5a3097be, 0xfc15aa1e), TOBN(0x40d12548, 0xb54b0745),
3674 TOBN(0x5bad4706, 0x519a5f12), TOBN(0xed03f717, 0xa439dee6),
3675 TOBN(0x0794bb6c, 0x4a02c499), TOBN(0xf725083d, 0xcffe71d2),
3676 TOBN(0x2cad7519, 0x0f3adcaf), TOBN(0x7f68ea1c, 0x43729310),
3677 TOBN(0xe747c8c7, 0xb7ffd977), TOBN(0xec104c35, 0x80761a22),
3678 TOBN(0x8395ebaf, 0x5a3ffb83), TOBN(0xfb3261f4, 0xe4b63db7),
3679 TOBN(0x53544960, 0xd883e544), TOBN(0x13520d70, 0x8cc2eeb8),
3680 TOBN(0x08f6337b, 0xd3d65f99), TOBN(0x83997db2, 0x781cf95b),
3681 TOBN(0xce6ff106, 0x0dbd2c01), TOBN(0x4f8eea6b, 0x1f9ce934),
3682 TOBN(0x546f7c4b, 0x0e993921), TOBN(0x6236a324, 0x5e753fc7),
3683 TOBN(0x65a41f84, 0xa16022e9), TOBN(0x0c18d878, 0x43d1dbb2),
3684 TOBN(0x73c55640, 0x2d4cef9c), TOBN(0xa0428108, 0x70444c74),
3685 TOBN(0x68e4f15e, 0x9afdfb3c), TOBN(0x49a56143, 0x5bdfb6df),
3686 TOBN(0xa9bc1bd4, 0x5f823d97), TOBN(0xbceb5970, 0xea111c2a),
3687 TOBN(0x366b455f, 0xb269bbc4), TOBN(0x7cd85e1e, 0xe9bc5d62),
3688 TOBN(0xc743c41c, 0x4f18b086), TOBN(0xa4b40990, 0x95294fb9),
3689 TOBN(0x9c7c581d, 0x26ee8382), TOBN(0xcf17dcc5, 0x359d638e),
3690 TOBN(0xee8273ab, 0xb728ae3d), TOBN(0x1d112926, 0xf821f047),
3691 TOBN(0x11498477, 0x50491a74), TOBN(0x687fa761, 0xfde0dfb9),
3692 TOBN(0x2c258022, 0x7ea435ab), TOBN(0x6b8bdb94, 0x91ce7e3f),
3693 TOBN(0x4c5b5dc9, 0x3bf834aa), TOBN(0x04371819, 0x4f6c7e4b),
3694 TOBN(0xc284e00a, 0x3736bcad), TOBN(0x0d881118, 0x21ae8f8d),
3695 TOBN(0xf9cf0f82, 0xf48c8e33), TOBN(0xa11fd075, 0xa1bf40db),
3696 TOBN(0xdceab0de, 0xdc2733e5), TOBN(0xc560a8b5, 0x8e986bd7),
3697 TOBN(0x48dd1fe2, 0x3929d097), TOBN(0x3885b290, 0x92f188f1),
3698 TOBN(0x0f2ae613, 0xda6fcdac), TOBN(0x9054303e, 0xb662a46c),
3699 TOBN(0xb6871e44, 0x0738042a), TOBN(0x98e6a977, 0xbdaf6449),
3700 TOBN(0xd8bc0650, 0xd1c9df1b), TOBN(0xef3d6451, 0x36e098f9),
3701 TOBN(0x03fbae82, 0xb6d72d28), TOBN(0x77ca9db1, 0xf5d84080),
3702 TOBN(0x8a112cff, 0xa58efc1c), TOBN(0x518d761c, 0xc564cb4a),
3703 TOBN(0x69b5740e, 0xf0d1b5ce), TOBN(0x717039cc, 0xe9eb1785),
3704 TOBN(0x3fe29f90, 0x22f53382), TOBN(0x8e54ba56, 0x6bc7c95c),
3705 TOBN(0x9c806d8a, 0xf7f91d0f), TOBN(0x3b61b0f1, 0xa82a5728),
3706 TOBN(0x4640032d, 0x94d76754), TOBN(0x273eb5de, 0x47d834c6),
3707 TOBN(0x2988abf7, 0x7b4e4d53), TOBN(0xb7ce66bf, 0xde401777),
3708 TOBN(0x9fba6b32, 0x715071b3), TOBN(0x82413c24, 0xad3a1a98),
3709 TOBN(0x5b7fc8c4, 0xe0e8ad93), TOBN(0xb5679aee, 0x5fab868d),
3710 TOBN(0xb1f9d2fa, 0x2b3946f3), TOBN(0x458897dc, 0x5685b50a),
3711 TOBN(0x1e98c930, 0x89d0caf3), TOBN(0x39564c5f, 0x78642e92),
3712 TOBN(0x1b77729a, 0x0dbdaf18), TOBN(0xf9170722, 0x579e82e6),
3713 TOBN(0x680c0317, 0xe4515fa5), TOBN(0xf85cff84, 0xfb0c790f),
3714 TOBN(0xc7a82aab, 0x6d2e0765), TOBN(0x7446bca9, 0x35c82b32),
3715 TOBN(0x5de607aa, 0x6d63184f), TOBN(0x7c1a46a8, 0x262803a6),
3716 TOBN(0xd218313d, 0xaebe8035), TOBN(0x92113ffd, 0xc73c51f8),
3717 TOBN(0x4b38e083, 0x12e7e46c), TOBN(0x69d0a37a, 0x56126bd5),
3718 TOBN(0xfb3f324b, 0x73c07e04), TOBN(0xa0c22f67, 0x8fda7267),
3719 TOBN(0x8f2c0051, 0x4d2c7d8f), TOBN(0xbc45ced3, 0xcbe2cae5),
3720 TOBN(0xe1c6cf07, 0xa8f0f277), TOBN(0xbc392312, 0x1eb99a98),
3721 TOBN(0x75537b7e, 0x3cc8ac85), TOBN(0x8d725f57, 0xdd02753b),
3722 TOBN(0xfd05ff64, 0xb737df2f), TOBN(0x55fe8712, 0xf6d2531d),
3723 TOBN(0x57ce04a9, 0x6ab6b01c), TOBN(0x69a02a89, 0x7cd93724),
3724 TOBN(0x4f82ac35, 0xcf86699b), TOBN(0x8242d3ad, 0x9cb4b232),
3725 TOBN(0x713d0f65, 0xd62105e5), TOBN(0xbb222bfa, 0x2d29be61),
3726 TOBN(0xf2f9a79e, 0x6cfbef09), TOBN(0xfc24d8d3, 0xd5d6782f),
3727 TOBN(0x5db77085, 0xd4129967), TOBN(0xdb81c3cc, 0xdc3c2a43),
3728 TOBN(0x9d655fc0, 0x05d8d9a3), TOBN(0x3f5d057a, 0x54298026),
3729 TOBN(0x1157f56d, 0x88c54694), TOBN(0xb26baba5, 0x9b09573e),
3730 TOBN(0x2cab03b0, 0x22adffd1), TOBN(0x60a412c8, 0xdd69f383),
3731 TOBN(0xed76e98b, 0x54b25039), TOBN(0xd4ee67d3, 0x687e714d),
3732 TOBN(0x87739648, 0x7b00b594), TOBN(0xce419775, 0xc9ef709b),
3733 TOBN(0x40f76f85, 0x1c203a40), TOBN(0x30d352d6, 0xeafd8f91),
3734 TOBN(0xaf196d3d, 0x95578dd2), TOBN(0xea4bb3d7, 0x77cc3f3d),
3735 TOBN(0x42a5bd03, 0xb98e782b), TOBN(0xac958c40, 0x0624920d),
3736 TOBN(0xb838134c, 0xfc56fcc8), TOBN(0x86ec4ccf, 0x89572e5e),
3737 TOBN(0x69c43526, 0x9be47be0), TOBN(0x323b7dd8, 0xcb28fea1),
3738 TOBN(0xfa5538ba, 0x3a6c67e5), TOBN(0xef921d70, 0x1d378e46),
3739 TOBN(0xf92961fc, 0x3c4b880e), TOBN(0x3f6f914e, 0x98940a67),
3740 TOBN(0xa990eb0a, 0xfef0ff39), TOBN(0xa6c2920f, 0xf0eeff9c),
3741 TOBN(0xca804166, 0x51b8d9a3), TOBN(0x42531bc9, 0x0ffb0db1),
3742 TOBN(0x72ce4718, 0xaa82e7ce), TOBN(0x6e199913, 0xdf574741),
3743 TOBN(0xd5f1b13d, 0xd5d36946), TOBN(0x8255dc65, 0xf68f0194),
3744 TOBN(0xdc9df4cd, 0x8710d230), TOBN(0x3453c20f, 0x138c1988),
3745 TOBN(0x9af98dc0, 0x89a6ef01), TOBN(0x4dbcc3f0, 0x9857df85),
3746 TOBN(0x34805601, 0x5c1ad924), TOBN(0x40448da5, 0xd0493046),
3747 TOBN(0xf629926d, 0x4ee343e2), TOBN(0x6343f1bd, 0x90e8a301),
3748 TOBN(0xefc93491, 0x40815b3f), TOBN(0xf882a423, 0xde8f66fb),
3749 TOBN(0x3a12d5f4, 0xe7db9f57), TOBN(0x7dfba38a, 0x3c384c27),
3750 TOBN(0x7a904bfd, 0x6fc660b1), TOBN(0xeb6c5db3, 0x2773b21c),
3751 TOBN(0xc350ee66, 0x1cdfe049), TOBN(0x9baac0ce, 0x44540f29),
3752 TOBN(0xbc57b6ab, 0xa5ec6aad), TOBN(0x167ce8c3, 0x0a7c1baa),
3753 TOBN(0xb23a03a5, 0x53fb2b56), TOBN(0x6ce141e7, 0x4e057f78),
3754 TOBN(0x796525c3, 0x89e490d9), TOBN(0x0bc95725, 0xa31a7e75),
3755 TOBN(0x1ec56791, 0x1220fd06), TOBN(0x716e3a3c, 0x408b0bd6),
3756 TOBN(0x31cd6bf7, 0xe8ebeba9), TOBN(0xa7326ca6, 0xbee6b670),
3757 TOBN(0x3d9f851c, 0xcd090c43), TOBN(0x561e8f13, 0xf12c3988),
3758 TOBN(0x50490b6a, 0x904b7be4), TOBN(0x61690ce1, 0x0410737b),
3759 TOBN(0x299e9a37, 0x0f009052), TOBN(0x258758f0, 0xf026092e),
3760 TOBN(0x9fa255f3, 0xfdfcdc0f), TOBN(0xdbc9fb1f, 0xc0e1bcd2),
3761 TOBN(0x35f9dd6e, 0x24651840), TOBN(0xdca45a84, 0xa5c59abc),
3762 TOBN(0x103d396f, 0xecca4938), TOBN(0x4532da0a, 0xb97b3f29),
3763 TOBN(0xc4135ea5, 0x1999a6bf), TOBN(0x3aa9505a, 0x5e6bf2ee),
3764 TOBN(0xf77cef06, 0x3f5be093), TOBN(0x97d1a0f8, 0xa943152e),
3765 TOBN(0x2cb0ebba, 0x2e1c21dd), TOBN(0xf41b29fc, 0x2c6797c4),
3766 TOBN(0xc6e17321, 0xb300101f), TOBN(0x4422b0e9, 0xd0d79a89),
3767 TOBN(0x49e4901c, 0x92f1bfc4), TOBN(0x06ab1f8f, 0xe1e10ed9),
3768 TOBN(0x84d35577, 0xdb2926b8), TOBN(0xca349d39, 0x356e8ec2),
3769 TOBN(0x70b63d32, 0x343bf1a9), TOBN(0x8fd3bd28, 0x37d1a6b1),
3770 TOBN(0x0454879c, 0x316865b4), TOBN(0xee959ff6, 0xc458efa2),
3771 TOBN(0x0461dcf8, 0x9706dc3f), TOBN(0x737db0e2, 0x164e4b2e),
3772 TOBN(0x09262680, 0x2f8843c8), TOBN(0x54498bbc, 0x7745e6f6),
3773 TOBN(0x359473fa, 0xa29e24af), TOBN(0xfcc3c454, 0x70aa87a1),
3774 TOBN(0xfd2c4bf5, 0x00573ace), TOBN(0xb65b514e, 0x28dd1965),
3775 TOBN(0xe46ae7cf, 0x2193e393), TOBN(0x60e9a4e1, 0xf5444d97),
3776 TOBN(0xe7594e96, 0x00ff38ed), TOBN(0x43d84d2f, 0x0a0e0f02),
3777 TOBN(0x8b6db141, 0xee398a21), TOBN(0xb88a56ae, 0xe3bcc5be),
3778 TOBN(0x0a1aa52f, 0x373460ea), TOBN(0x20da1a56, 0x160bb19b),
3779 TOBN(0xfb54999d, 0x65bf0384), TOBN(0x71a14d24, 0x5d5a180e),
3780 TOBN(0xbc44db7b, 0x21737b04), TOBN(0xd84fcb18, 0x01dd8e92),
3781 TOBN(0x80de937b, 0xfa44b479), TOBN(0x53505499, 0x5c98fd4f),
3782 TOBN(0x1edb12ab, 0x28f08727), TOBN(0x4c58b582, 0xa5f3ef53),
3783 TOBN(0xbfb236d8, 0x8327f246), TOBN(0xc3a3bfaa, 0x4d7df320),
3784 TOBN(0xecd96c59, 0xb96024f2), TOBN(0xfc293a53, 0x7f4e0433),
3785 TOBN(0x5341352b, 0x5acf6e10), TOBN(0xc50343fd, 0xafe652c3),
3786 TOBN(0x4af3792d, 0x18577a7f), TOBN(0xe1a4c617, 0xaf16823d),
3787 TOBN(0x9b26d0cd, 0x33425d0a), TOBN(0x306399ed, 0x9b7bc47f),
3788 TOBN(0x2a792f33, 0x706bb20b), TOBN(0x31219614, 0x98111055),
3789 TOBN(0x864ec064, 0x87f5d28b), TOBN(0x11392d91, 0x962277fd),
3790 TOBN(0xb5aa7942, 0xbb6aed5f), TOBN(0x080094dc, 0x47e799d9),
3791 TOBN(0x4afa588c, 0x208ba19b), TOBN(0xd3e7570f, 0x8512f284),
3792 TOBN(0xcbae64e6, 0x02f5799a), TOBN(0xdeebe7ef, 0x514b9492),
3793 TOBN(0x30300f98, 0xe5c298ff), TOBN(0x17f561be, 0x3678361f),
3794 TOBN(0xf52ff312, 0x98cb9a16), TOBN(0x6233c3bc, 0x5562d490),
3795 TOBN(0x7bfa15a1, 0x92e3a2cb), TOBN(0x961bcfd1, 0xe6365119),
3796 TOBN(0x3bdd29bf, 0x2c8c53b1), TOBN(0x739704df, 0x822844ba),
3797 TOBN(0x7dacfb58, 0x7e7b754b), TOBN(0x23360791, 0xa806c9b9),
3798 TOBN(0xe7eb88c9, 0x23504452), TOBN(0x2983e996, 0x852c1783),
3799 TOBN(0xdd4ae529, 0x958d881d), TOBN(0x026bae03, 0x262c7b3c),
3800 TOBN(0x3a6f9193, 0x960b52d1), TOBN(0xd0980f90, 0x92696cfb),
3801 TOBN(0x4c1f428c, 0xd5f30851), TOBN(0x94dfed27, 0x2a4f6630),
3802 TOBN(0x4df53772, 0xfc5d48a4), TOBN(0xdd2d5a2f, 0x933260ce),
3803 TOBN(0x574115bd, 0xd44cc7a5), TOBN(0x4ba6b20d, 0xbd12533a),
3804 TOBN(0x30e93cb8, 0x243057c9), TOBN(0x794c486a, 0x14de320e),
3805 TOBN(0xe925d4ce, 0xf21496e4), TOBN(0xf951d198, 0xec696331),
3806 TOBN(0x9810e2de, 0x3e8d812f), TOBN(0xd0a47259, 0x389294ab),
3807 TOBN(0x513ba2b5, 0x0e3bab66), TOBN(0x462caff5, 0xabad306f),
3808 TOBN(0xe2dc6d59, 0xaf04c49e), TOBN(0x1aeb8750, 0xe0b84b0b),
3809 TOBN(0xc034f12f, 0x2f7d0ca2), TOBN(0x6d2e8128, 0xe06acf2f),
3810 TOBN(0x801f4f83, 0x21facc2f), TOBN(0xa1170c03, 0xf40ef607),
3811 TOBN(0xfe0a1d4f, 0x7805a99c), TOBN(0xbde56a36, 0xcc26aba5),
3812 TOBN(0x5b1629d0, 0x35531f40), TOBN(0xac212c2b, 0x9afa6108),
3813 TOBN(0x30a06bf3, 0x15697be5), TOBN(0x6f0545dc, 0x2c63c7c1),
3814 TOBN(0x5d8cb842, 0x7ccdadaf), TOBN(0xd52e379b, 0xac7015bb),
3815 TOBN(0xc4f56147, 0xf462c23e), TOBN(0xd44a4298, 0x46bc24b0),
3816 TOBN(0xbc73d23a, 0xe2856d4f), TOBN(0x61cedd8c, 0x0832bcdf),
3817 TOBN(0x60953556, 0x99f241d7), TOBN(0xee4adbd7, 0x001a349d),
3818 TOBN(0x0b35bf6a, 0xaa89e491), TOBN(0x7f0076f4, 0x136f7546),
3819 TOBN(0xd19a18ba, 0x9264da3d), TOBN(0x6eb2d2cd, 0x62a7a28b),
3820 TOBN(0xcdba941f, 0x8761c971), TOBN(0x1550518b, 0xa3be4a5d),
3821 TOBN(0xd0e8e2f0, 0x57d0b70c), TOBN(0xeea8612e, 0xcd133ba3),
3822 TOBN(0x814670f0, 0x44416aec), TOBN(0x424db6c3, 0x30775061),
3823 TOBN(0xd96039d1, 0x16213fd1), TOBN(0xc61e7fa5, 0x18a3478f),
3824 TOBN(0xa805bdcc, 0xcb0c5021), TOBN(0xbdd6f3a8, 0x0cc616dd),
3825 TOBN(0x06009667, 0x5d97f7e2), TOBN(0x31db0fc1, 0xaf0bf4b6),
3826 TOBN(0x23680ed4, 0x5491627a), TOBN(0xb99a3c66, 0x7d741fb1),
3827 TOBN(0xe9bb5f55, 0x36b1ff92), TOBN(0x29738577, 0x512b388d),
3828 TOBN(0xdb8a2ce7, 0x50fcf263), TOBN(0x385346d4, 0x6c4f7b47),
3829 TOBN(0xbe86c5ef, 0x31631f9e), TOBN(0xbf91da21, 0x03a57a29),
3830 TOBN(0xc3b1f796, 0x7b23f821), TOBN(0x0f7d00d2, 0x770db354),
3831 TOBN(0x8ffc6c3b, 0xd8fe79da), TOBN(0xcc5e8c40, 0xd525c996),
3832 TOBN(0x4640991d, 0xcfff632a), TOBN(0x64d97e8c, 0x67112528),
3833 TOBN(0xc232d973, 0x02f1cd1e), TOBN(0xce87eacb, 0x1dd212a4),
3834 TOBN(0x6e4c8c73, 0xe69802f7), TOBN(0x12ef0290, 0x1fffddbd),
3835 TOBN(0x941ec74e, 0x1bcea6e2), TOBN(0xd0b54024, 0x3cb92cbb),
3836 TOBN(0x809fb9d4, 0x7e8f9d05), TOBN(0x3bf16159, 0xf2992aae),
3837 TOBN(0xad40f279, 0xf8a7a838), TOBN(0x11aea631, 0x05615660),
3838 TOBN(0xbf52e6f1, 0xa01f6fa1), TOBN(0xef046995, 0x3dc2aec9),
3839 TOBN(0x785dbec9, 0xd8080711), TOBN(0xe1aec60a, 0x9fdedf76),
3840 TOBN(0xece797b5, 0xfa21c126), TOBN(0xc66e898f, 0x05e52732),
3841 TOBN(0x39bb69c4, 0x08811fdb), TOBN(0x8bfe1ef8, 0x2fc7f082),
3842 TOBN(0xc8e7a393, 0x174f4138), TOBN(0xfba8ad1d, 0xd58d1f98),
3843 TOBN(0xbc21d0ce, 0xbfd2fd5b), TOBN(0x0b839a82, 0x6ee60d61),
3844 TOBN(0xaacf7658, 0xafd22253), TOBN(0xb526bed8, 0xaae396b3),
3845 TOBN(0xccc1bbc2, 0x38564464), TOBN(0x9e3ff947, 0x8c45bc73),
3846 TOBN(0xcde9bca3, 0x58188a78), TOBN(0x138b8ee0, 0xd73bf8f7),
3847 TOBN(0x5c7e234c, 0x4123c489), TOBN(0x66e69368, 0xfa643297),
3848 TOBN(0x0629eeee, 0x39a15fa3), TOBN(0x95fab881, 0xa9e2a927),
3849 TOBN(0xb2497007, 0xeafbb1e1), TOBN(0xd75c9ce6, 0xe75b7a93),
3850 TOBN(0x3558352d, 0xefb68d78), TOBN(0xa2f26699, 0x223f6396),
3851 TOBN(0xeb911ecf, 0xe469b17a), TOBN(0x62545779, 0xe72d3ec2),
3852 TOBN(0x8ea47de7, 0x82cb113f), TOBN(0xebe4b086, 0x4e1fa98d),
3853 TOBN(0xec2d5ed7, 0x8cdfedb1), TOBN(0xa535c077, 0xfe211a74),
3854 TOBN(0x9678109b, 0x11d244c5), TOBN(0xf17c8bfb, 0xbe299a76),
3855 TOBN(0xb651412e, 0xfb11fbc4), TOBN(0xea0b5482, 0x94ab3f65),
3856 TOBN(0xd8dffd95, 0x0cf78243), TOBN(0x2e719e57, 0xce0361d4),
3857 TOBN(0x9007f085, 0x304ddc5b), TOBN(0x095e8c6d, 0x4daba2ea),
3858 TOBN(0x5a33cdb4, 0x3f9d28a9), TOBN(0x85b95cd8, 0xe2283003),
3859 TOBN(0xbcd6c819, 0xb9744733), TOBN(0x29c5f538, 0xfc7f5783),
3860 TOBN(0x6c49b2fa, 0xd59038e4), TOBN(0x68349cc1, 0x3bbe1018),
3861 TOBN(0xcc490c1d, 0x21830ee5), TOBN(0x36f9c4ee, 0xe9bfa297),
3862 TOBN(0x58fd7294, 0x48de1a94), TOBN(0xaadb13a8, 0x4e8f2cdc),
3863 TOBN(0x515eaaa0, 0x81313dba), TOBN(0xc76bb468, 0xc2152dd8),
3864 TOBN(0x357f8d75, 0xa653dbf8), TOBN(0xe4d8c4d1, 0xb14ac143),
3865 TOBN(0xbdb8e675, 0xb055cb40), TOBN(0x898f8e7b, 0x977b5167),
3866 TOBN(0xecc65651, 0xb82fb863), TOBN(0x56544814, 0x6d88f01f),
3867 TOBN(0xb0928e95, 0x263a75a9), TOBN(0xcfb6836f, 0x1a22fcda),
3868 TOBN(0x651d14db, 0x3f3bd37c), TOBN(0x1d3837fb, 0xb6ad4664),
3869 TOBN(0x7c5fb538, 0xff4f94ab), TOBN(0x7243c712, 0x6d7fb8f2),
3870 TOBN(0xef13d60c, 0xa85c5287), TOBN(0x18cfb7c7, 0x4bb8dd1b),
3871 TOBN(0x82f9bfe6, 0x72908219), TOBN(0x35c4592b, 0x9d5144ab),
3872 TOBN(0x52734f37, 0x9cf4b42f), TOBN(0x6bac55e7, 0x8c60ddc4),
3873 TOBN(0xb5cd811e, 0x94dea0f6), TOBN(0x259ecae4, 0xe18cc1a3),
3874 TOBN(0x6a0e836e, 0x15e660f8), TOBN(0x6c639ea6, 0x0e02bff2),
3875 TOBN(0x8721b8cb, 0x7e1026fd), TOBN(0x9e73b50b, 0x63261942),
3876 TOBN(0xb8c70974, 0x77f01da3), TOBN(0x1839e6a6, 0x8268f57f),
3877 TOBN(0x571b9415, 0x5150b805), TOBN(0x1892389e, 0xf92c7097),
3878 TOBN(0x8d69c18e, 0x4a084b95), TOBN(0x7014c512, 0xbe5b495c),
3879 TOBN(0x4780db36, 0x1b07523c), TOBN(0x2f6219ce, 0x2c1c64fa),
3880 TOBN(0xc38b81b0, 0x602c105a), TOBN(0xab4f4f20, 0x5dc8e360),
3881 TOBN(0x20d3c982, 0xcf7d62d2), TOBN(0x1f36e29d, 0x23ba8150),
3882 TOBN(0x48ae0bf0, 0x92763f9e), TOBN(0x7a527e6b, 0x1d3a7007),
3883 TOBN(0xb4a89097, 0x581a85e3), TOBN(0x1f1a520f, 0xdc158be5),
3884 TOBN(0xf98db37d, 0x167d726e), TOBN(0x8802786e, 0x1113e862)},
3885 {TOBN(0xefb2149e, 0x36f09ab0), TOBN(0x03f163ca, 0x4a10bb5b),
3886 TOBN(0xd0297045, 0x06e20998), TOBN(0x56f0af00, 0x1b5a3bab),
3887 TOBN(0x7af4cfec, 0x70880e0d), TOBN(0x7332a66f, 0xbe3d913f),
3888 TOBN(0x32e6c84a, 0x7eceb4bd), TOBN(0xedc4a79a, 0x9c228f55),
3889 TOBN(0xc37c7dd0, 0xc55c4496), TOBN(0xa6a96357, 0x25bbabd2),
3890 TOBN(0x5b7e63f2, 0xadd7f363), TOBN(0x9dce3782, 0x2e73f1df),
3891 TOBN(0xe1e5a16a, 0xb2b91f71), TOBN(0xe4489823, 0x5ba0163c),
3892 TOBN(0xf2759c32, 0xf6e515ad), TOBN(0xa5e2f1f8, 0x8615eecf),
3893 TOBN(0x74519be7, 0xabded551), TOBN(0x03d358b8, 0xc8b74410),
3894 TOBN(0x4d00b10b, 0x0e10d9a9), TOBN(0x6392b0b1, 0x28da52b7),
3895 TOBN(0x6744a298, 0x0b75c904), TOBN(0xc305b0ae, 0xa8f7f96c),
3896 TOBN(0x042e421d, 0x182cf932), TOBN(0xf6fc5d50, 0x9e4636ca),
3897 TOBN(0x795847c9, 0xd64cc78c), TOBN(0x6c50621b, 0x9b6cb27b),
3898 TOBN(0x07099bf8, 0xdf8022ab), TOBN(0x48f862eb, 0xc04eda1d),
3899 TOBN(0xd12732ed, 0xe1603c16), TOBN(0x19a80e0f, 0x5c9a9450),
3900 TOBN(0xe2257f54, 0xb429b4fc), TOBN(0x66d3b2c6, 0x45460515),
3901 TOBN(0x6ca4f87e, 0x822e37be), TOBN(0x73f237b4, 0x253bda4e),
3902 TOBN(0xf747f3a2, 0x41190aeb), TOBN(0xf06fa36f, 0x804cf284),
3903 TOBN(0x0a6bbb6e, 0xfc621c12), TOBN(0x5d624b64, 0x40b80ec6),
3904 TOBN(0x4b072425, 0x7ba556f3), TOBN(0x7fa0c354, 0x3e2d20a8),
3905 TOBN(0xe921fa31, 0xe3229d41), TOBN(0xa929c652, 0x94531bd4),
3906 TOBN(0x84156027, 0xa6d38209), TOBN(0xf3d69f73, 0x6bdb97bd),
3907 TOBN(0x8906d19a, 0x16833631), TOBN(0x68a34c2e, 0x03d51be3),
3908 TOBN(0xcb59583b, 0x0e511cd8), TOBN(0x99ce6bfd, 0xfdc132a8),
3909 TOBN(0x3facdaaa, 0xffcdb463), TOBN(0x658bbc1a, 0x34a38b08),
3910 TOBN(0x12a801f8, 0xf1a9078d), TOBN(0x1567bcf9, 0x6ab855de),
3911 TOBN(0xe08498e0, 0x3572359b), TOBN(0xcf0353e5, 0x8659e68b),
3912 TOBN(0xbb86e9c8, 0x7d23807c), TOBN(0xbc08728d, 0x2198e8a2),
3913 TOBN(0x8de2b7bc, 0x453cadd6), TOBN(0x203900a7, 0xbc0bc1f8),
3914 TOBN(0xbcd86e47, 0xa6abd3af), TOBN(0x911cac12, 0x8502effb),
3915 TOBN(0x2d550242, 0xec965469), TOBN(0x0e9f7692, 0x29e0017e),
3916 TOBN(0x633f078f, 0x65979885), TOBN(0xfb87d449, 0x4cf751ef),
3917 TOBN(0xe1790e4b, 0xfc25419a), TOBN(0x36467203, 0x4bff3cfd),
3918 TOBN(0xc8db6386, 0x25b6e83f), TOBN(0x6cc69f23, 0x6cad6fd2),
3919 TOBN(0x0219e45a, 0x6bc68bb9), TOBN(0xe43d79b6, 0x297f7334),
3920 TOBN(0x7d445368, 0x465dc97c), TOBN(0x4b9eea32, 0x2a0b949a),
3921 TOBN(0x1b96c6ba, 0x6102d021), TOBN(0xeaafac78, 0x2f4461ea),
3922 TOBN(0xd4b85c41, 0xc49f19a8), TOBN(0x275c28e4, 0xcf538875),
3923 TOBN(0x35451a9d, 0xdd2e54e0), TOBN(0x6991adb5, 0x0605618b),
3924 TOBN(0x5b8b4bcd, 0x7b36cd24), TOBN(0x372a4f8c, 0x56f37216),
3925 TOBN(0xc890bd73, 0xa6a5da60), TOBN(0x6f083da0, 0xdc4c9ff0),
3926 TOBN(0xf4e14d94, 0xf0536e57), TOBN(0xf9ee1eda, 0xaaec8243),
3927 TOBN(0x571241ec, 0x8bdcf8e7), TOBN(0xa5db8271, 0x0b041e26),
3928 TOBN(0x9a0b9a99, 0xe3fff040), TOBN(0xcaaf21dd, 0x7c271202),
3929 TOBN(0xb4e2b2e1, 0x4f0dd2e8), TOBN(0xe77e7c4f, 0x0a377ac7),
3930 TOBN(0x69202c3f, 0x0d7a2198), TOBN(0xf759b7ff, 0x28200eb8),
3931 TOBN(0xc87526ed, 0xdcfe314e), TOBN(0xeb84c524, 0x53d5cf99),
3932 TOBN(0xb1b52ace, 0x515138b6), TOBN(0x5aa7ff8c, 0x23fca3f4),
3933 TOBN(0xff0b13c3, 0xb9791a26), TOBN(0x960022da, 0xcdd58b16),
3934 TOBN(0xdbd55c92, 0x57aad2de), TOBN(0x3baaaaa3, 0xf30fe619),
3935 TOBN(0x9a4b2346, 0x0d881efd), TOBN(0x506416c0, 0x46325e2a),
3936 TOBN(0x91381e76, 0x035c18d4), TOBN(0xb3bb68be, 0xf27817b0),
3937 TOBN(0x15bfb8bf, 0x5116f937), TOBN(0x7c64a586, 0xc1268943),
3938 TOBN(0x71e25cc3, 0x8419a2c8), TOBN(0x9fd6b0c4, 0x8335f463),
3939 TOBN(0x4bf0ba3c, 0xe8ee0e0e), TOBN(0x6f6fba60, 0x298c21fa),
3940 TOBN(0x57d57b39, 0xae66bee0), TOBN(0x292d5130, 0x22672544),
3941 TOBN(0xf451105d, 0xbab093b3), TOBN(0x012f59b9, 0x02839986),
3942 TOBN(0x8a915802, 0x3474a89c), TOBN(0x048c919c, 0x2de03e97),
3943 TOBN(0xc476a2b5, 0x91071cd5), TOBN(0x791ed89a, 0x034970a5),
3944 TOBN(0x89bd9042, 0xe1b7994b), TOBN(0x8eaf5179, 0xa1057ffd),
3945 TOBN(0x6066e2a2, 0xd551ee10), TOBN(0x87a8f1d8, 0x727e09a6),
3946 TOBN(0x00d08bab, 0x2c01148d), TOBN(0x6da8e4f1, 0x424f33fe),
3947 TOBN(0x466d17f0, 0xcf9a4e71), TOBN(0xff502010, 0x3bf5cb19),
3948 TOBN(0xdccf97d8, 0xd062ecc0), TOBN(0x80c0d9af, 0x81d80ac4),
3949 TOBN(0xe87771d8, 0x033f2876), TOBN(0xb0186ec6, 0x7d5cc3db),
3950 TOBN(0x58e8bb80, 0x3bc9bc1d), TOBN(0x4d1395cc, 0x6f6ef60e),
3951 TOBN(0xa73c62d6, 0x186244a0), TOBN(0x918e5f23, 0x110a5b53),
3952 TOBN(0xed4878ca, 0x741b7eab), TOBN(0x3038d71a, 0xdbe03e51),
3953 TOBN(0x840204b7, 0xa93c3246), TOBN(0x21ab6069, 0xa0b9b4cd),
3954 TOBN(0xf5fa6e2b, 0xb1d64218), TOBN(0x1de6ad0e, 0xf3d56191),
3955 TOBN(0x570aaa88, 0xff1929c7), TOBN(0xc6df4c6b, 0x640e87b5),
3956 TOBN(0xde8a74f2, 0xc65f0ccc), TOBN(0x8b972fd5, 0xe6f6cc01),
3957 TOBN(0x3fff36b6, 0x0b846531), TOBN(0xba7e45e6, 0x10a5e475),
3958 TOBN(0x84a1d10e, 0x4145b6c5), TOBN(0xf1f7f91a, 0x5e046d9d),
3959 TOBN(0x0317a692, 0x44de90d7), TOBN(0x951a1d4a, 0xf199c15e),
3960 TOBN(0x91f78046, 0xc9d73deb), TOBN(0x74c82828, 0xfab8224f),
3961 TOBN(0xaa6778fc, 0xe7560b90), TOBN(0xb4073e61, 0xa7e824ce),
3962 TOBN(0xff0d693c, 0xd642eba8), TOBN(0x7ce2e57a, 0x5dccef38),
3963 TOBN(0x89c2c789, 0x1df1ad46), TOBN(0x83a06922, 0x098346fd),
3964 TOBN(0x2d715d72, 0xda2fc177), TOBN(0x7b6dd71d, 0x85b6cf1d),
3965 TOBN(0xc60a6d0a, 0x73fa9cb0), TOBN(0xedd3992e, 0x328bf5a9),
3966 TOBN(0xc380ddd0, 0x832c8c82), TOBN(0xd182d410, 0xa2a0bf50),
3967 TOBN(0x7d9d7438, 0xd9a528db), TOBN(0xe8b1a0e9, 0xcaf53994),
3968 TOBN(0xddd6e5fe, 0x0e19987c), TOBN(0xacb8df03, 0x190b059d),
3969 TOBN(0x53703a32, 0x8300129f), TOBN(0x1f637662, 0x68c43bfd),
3970 TOBN(0xbcbd1913, 0x00e54051), TOBN(0x812fcc62, 0x7bf5a8c5),
3971 TOBN(0x3f969d5f, 0x29fb85da), TOBN(0x72f4e00a, 0x694759e8),
3972 TOBN(0x426b6e52, 0x790726b7), TOBN(0x617bbc87, 0x3bdbb209),
3973 TOBN(0x511f8bb9, 0x97aee317), TOBN(0x812a4096, 0xe81536a8),
3974 TOBN(0x137dfe59, 0x3ac09b9b), TOBN(0x0682238f, 0xba8c9a7a),
3975 TOBN(0x7072ead6, 0xaeccb4bd), TOBN(0x6a34e9aa, 0x692ba633),
3976 TOBN(0xc82eaec2, 0x6fff9d33), TOBN(0xfb753512, 0x1d4d2b62),
3977 TOBN(0x1a0445ff, 0x1d7aadab), TOBN(0x65d38260, 0xd5f6a67c),
3978 TOBN(0x6e62fb08, 0x91cfb26f), TOBN(0xef1e0fa5, 0x5c7d91d6),
3979 TOBN(0x47e7c7ba, 0x33db72cd), TOBN(0x017cbc09, 0xfa7c74b2),
3980 TOBN(0x3c931590, 0xf50a503c), TOBN(0xcac54f60, 0x616baa42),
3981 TOBN(0x9b6cd380, 0xb2369f0f), TOBN(0x97d3a70d, 0x23c76151),
3982 TOBN(0x5f9dd6fc, 0x9862a9c6), TOBN(0x044c4ab2, 0x12312f51),
3983 TOBN(0x035ea0fd, 0x834a2ddc), TOBN(0x49e6b862, 0xcc7b826d),
3984 TOBN(0xb03d6883, 0x62fce490), TOBN(0x62f2497a, 0xb37e36e9),
3985 TOBN(0x04b005b6, 0xc6458293), TOBN(0x36bb5276, 0xe8d10af7),
3986 TOBN(0xacf2dc13, 0x8ee617b8), TOBN(0x470d2d35, 0xb004b3d4),
3987 TOBN(0x06790832, 0xfeeb1b77), TOBN(0x2bb75c39, 0x85657f9c),
3988 TOBN(0xd70bd4ed, 0xc0f60004), TOBN(0xfe797ecc, 0x219b018b),
3989 TOBN(0x9b5bec2a, 0x753aebcc), TOBN(0xdaf9f3dc, 0xc939eca5),
3990 TOBN(0xd6bc6833, 0xd095ad09), TOBN(0x98abdd51, 0xdaa4d2fc),
3991 TOBN(0xd9840a31, 0x8d168be5), TOBN(0xcf7c10e0, 0x2325a23c),
3992 TOBN(0xa5c02aa0, 0x7e6ecfaf), TOBN(0x2462e7e6, 0xb5bfdf18),
3993 TOBN(0xab2d8a8b, 0xa0cc3f12), TOBN(0x68dd485d, 0xbc672a29),
3994 TOBN(0x72039752, 0x596f2cd3), TOBN(0x5d3eea67, 0xa0cf3d8d),
3995 TOBN(0x810a1a81, 0xe6602671), TOBN(0x8f144a40, 0x14026c0c),
3996 TOBN(0xbc753a6d, 0x76b50f85), TOBN(0xc4dc21e8, 0x645cd4a4),
3997 TOBN(0xc5262dea, 0x521d0378), TOBN(0x802b8e0e, 0x05011c6f),
3998 TOBN(0x1ba19cbb, 0x0b4c19ea), TOBN(0x21db64b5, 0xebf0aaec),
3999 TOBN(0x1f394ee9, 0x70342f9d), TOBN(0x93a10aee, 0x1bc44a14),
4000 TOBN(0xa7eed31b, 0x3efd0baa), TOBN(0x6e7c824e, 0x1d154e65),
4001 TOBN(0xee23fa81, 0x9966e7ee), TOBN(0x64ec4aa8, 0x05b7920d),
4002 TOBN(0x2d44462d, 0x2d90aad4), TOBN(0xf44dd195, 0xdf277ad5),
4003 TOBN(0x8d6471f1, 0xbb46b6a1), TOBN(0x1e65d313, 0xfd885090),
4004 TOBN(0x33a800f5, 0x13a977b4), TOBN(0xaca9d721, 0x0797e1ef),
4005 TOBN(0x9a5a85a0, 0xfcff6a17), TOBN(0x9970a3f3, 0x1eca7cee),
4006 TOBN(0xbb9f0d6b, 0xc9504be3), TOBN(0xe0c504be, 0xadd24ee2),
4007 TOBN(0x7e09d956, 0x77fcc2f4), TOBN(0xef1a5227, 0x65bb5fc4),
4008 TOBN(0x145d4fb1, 0x8b9286aa), TOBN(0x66fd0c5d, 0x6649028b),
4009 TOBN(0x98857ceb, 0x1bf4581c), TOBN(0xe635e186, 0xaca7b166),
4010 TOBN(0x278ddd22, 0x659722ac), TOBN(0xa0903c4c, 0x1db68007),
4011 TOBN(0x366e4589, 0x48f21402), TOBN(0x31b49c14, 0xb96abda2),
4012 TOBN(0x329c4b09, 0xe0403190), TOBN(0x97197ca3, 0xd29f43fe),
4013 TOBN(0x8073dd1e, 0x274983d8), TOBN(0xda1a3bde, 0x55717c8f),
4014 TOBN(0xfd3d4da2, 0x0361f9d1), TOBN(0x1332d081, 0x4c7de1ce),
4015 TOBN(0x9b7ef7a3, 0xaa6d0e10), TOBN(0x17db2e73, 0xf54f1c4a),
4016 TOBN(0xaf3dffae, 0x4cd35567), TOBN(0xaaa2f406, 0xe56f4e71),
4017 TOBN(0x8966759e, 0x7ace3fc7), TOBN(0x9594eacf, 0x45a8d8c6),
4018 TOBN(0x8de3bd8b, 0x91834e0e), TOBN(0xafe4ca53, 0x548c0421),
4019 TOBN(0xfdd7e856, 0xe6ee81c6), TOBN(0x8f671beb, 0x6b891a3a),
4020 TOBN(0xf7a58f2b, 0xfae63829), TOBN(0x9ab186fb, 0x9c11ac9f),
4021 TOBN(0x8d6eb369, 0x10b5be76), TOBN(0x046b7739, 0xfb040bcd),
4022 TOBN(0xccb4529f, 0xcb73de88), TOBN(0x1df0fefc, 0xcf26be03),
4023 TOBN(0xad7757a6, 0xbcfcd027), TOBN(0xa8786c75, 0xbb3165ca),
4024 TOBN(0xe9db1e34, 0x7e99a4d9), TOBN(0x99ee86df, 0xb06c504b),
4025 TOBN(0x5b7c2ddd, 0xc15c9f0a), TOBN(0xdf87a734, 0x4295989e),
4026 TOBN(0x59ece47c, 0x03d08fda), TOBN(0xb074d3dd, 0xad5fc702),
4027 TOBN(0x20407903, 0x51a03776), TOBN(0x2bb1f77b, 0x2a608007),
4028 TOBN(0x25c58f4f, 0xe1153185), TOBN(0xe6df62f6, 0x766e6447),
4029 TOBN(0xefb3d1be, 0xed51275a), TOBN(0x5de47dc7, 0x2f0f483f),
4030 TOBN(0x7932d98e, 0x97c2bedf), TOBN(0xd5c11927, 0x0219f8a1),
4031 TOBN(0x9d751200, 0xa73a294e), TOBN(0x5f88434a, 0x9dc20172),
4032 TOBN(0xd28d9fd3, 0xa26f506a), TOBN(0xa890cd31, 0x9d1dcd48),
4033 TOBN(0x0aebaec1, 0x70f4d3b4), TOBN(0xfd1a1369, 0x0ffc8d00),
4034 TOBN(0xb9d9c240, 0x57d57838), TOBN(0x45929d26, 0x68bac361),
4035 TOBN(0x5a2cd060, 0x25b15ca6), TOBN(0x4b3c83e1, 0x6e474446),
4036 TOBN(0x1aac7578, 0xee1e5134), TOBN(0xa418f5d6, 0xc91e2f41),
4037 TOBN(0x6936fc8a, 0x213ed68b), TOBN(0x860ae7ed, 0x510a5224),
4038 TOBN(0x63660335, 0xdef09b53), TOBN(0x641b2897, 0xcd79c98d),
4039 TOBN(0x29bd38e1, 0x01110f35), TOBN(0x79c26f42, 0x648b1937),
4040 TOBN(0x64dae519, 0x9d9164f4), TOBN(0xd85a2310, 0x0265c273),
4041 TOBN(0x7173dd5d, 0x4b07e2b1), TOBN(0xd144c4cb, 0x8d9ea221),
4042 TOBN(0xe8b04ea4, 0x1105ab14), TOBN(0x92dda542, 0xfe80d8f1),
4043 TOBN(0xe9982fa8, 0xcf03dce6), TOBN(0x8b5ea965, 0x1a22cffc),
4044 TOBN(0xf7f4ea7f, 0x3fad88c4), TOBN(0x62db773e, 0x6a5ba95c),
4045 TOBN(0xd20f02fb, 0x93f24567), TOBN(0xfd46c69a, 0x315257ca),
4046 TOBN(0x0ac74cc7, 0x8bcab987), TOBN(0x46f31c01, 0x5ceca2f5),
4047 TOBN(0x40aedb59, 0x888b219e), TOBN(0xe50ecc37, 0xe1fccd02),
4048 TOBN(0x1bcd9dad, 0x911f816c), TOBN(0x583cc1ec, 0x8db9b00c),
4049 TOBN(0xf3cd2e66, 0xa483bf11), TOBN(0xfa08a6f5, 0xb1b2c169),
4050 TOBN(0xf375e245, 0x4be9fa28), TOBN(0x99a7ffec, 0x5b6d011f),
4051 TOBN(0x6a3ebddb, 0xc4ae62da), TOBN(0x6cea00ae, 0x374aef5d),
4052 TOBN(0xab5fb98d, 0x9d4d05bc), TOBN(0x7cba1423, 0xd560f252),
4053 TOBN(0x49b2cc21, 0x208490de), TOBN(0x1ca66ec3, 0xbcfb2879),
4054 TOBN(0x7f1166b7, 0x1b6fb16f), TOBN(0xfff63e08, 0x65fe5db3),
4055 TOBN(0xb8345abe, 0x8b2610be), TOBN(0xb732ed80, 0x39de3df4),
4056 TOBN(0x0e24ed50, 0x211c32b4), TOBN(0xd10d8a69, 0x848ff27d),
4057 TOBN(0xc1074398, 0xed4de248), TOBN(0xd7cedace, 0x10488927),
4058 TOBN(0xa4aa6bf8, 0x85673e13), TOBN(0xb46bae91, 0x6daf30af),
4059 TOBN(0x07088472, 0xfcef7ad8), TOBN(0x61151608, 0xd4b35e97),
4060 TOBN(0xbcfe8f26, 0xdde29986), TOBN(0xeb84c4c7, 0xd5a34c79),
4061 TOBN(0xc1eec55c, 0x164e1214), TOBN(0x891be86d, 0xa147bb03),
4062 TOBN(0x9fab4d10, 0x0ba96835), TOBN(0xbf01e9b8, 0xa5c1ae9f),
4063 TOBN(0x6b4de139, 0xb186ebc0), TOBN(0xd5c74c26, 0x85b91bca),
4064 TOBN(0x5086a99c, 0xc2d93854), TOBN(0xeed62a7b, 0xa7a9dfbc),
4065 TOBN(0x8778ed6f, 0x76b7618a), TOBN(0xbff750a5, 0x03b66062),
4066 TOBN(0x4cb7be22, 0xb65186db), TOBN(0x369dfbf0, 0xcc3a6d13),
4067 TOBN(0xc7dab26c, 0x7191a321), TOBN(0x9edac3f9, 0x40ed718e),
4068 TOBN(0xbc142b36, 0xd0cfd183), TOBN(0xc8af82f6, 0x7c991693),
4069 TOBN(0xb3d1e4d8, 0x97ce0b2a), TOBN(0xe6d7c87f, 0xc3a55cdf),
4070 TOBN(0x35846b95, 0x68b81afe), TOBN(0x018d12af, 0xd3c239d8),
4071 TOBN(0x2b2c6208, 0x01206e15), TOBN(0xe0e42453, 0xa3b882c6),
4072 TOBN(0x854470a3, 0xa50162d5), TOBN(0x08157478, 0x7017a62a),
4073 TOBN(0x18bd3fb4, 0x820357c7), TOBN(0x992039ae, 0x6f1458ad),
4074 TOBN(0x9a1df3c5, 0x25b44aa1), TOBN(0x2d780357, 0xed3d5281),
4075 TOBN(0x58cf7e4d, 0xc77ad4d4), TOBN(0xd49a7998, 0xf9df4fc4),
4076 TOBN(0x4465a8b5, 0x1d71205e), TOBN(0xa0ee0ea6, 0x649254aa),
4077 TOBN(0x4b5eeecf, 0xab7bd771), TOBN(0x6c873073, 0x35c262b9),
4078 TOBN(0xdc5bd648, 0x3c9d61e7), TOBN(0x233d6d54, 0x321460d2),
4079 TOBN(0xd20c5626, 0xfc195bcc), TOBN(0x25445958, 0x04d78b63),
4080 TOBN(0xe03fcb3d, 0x17ec8ef3), TOBN(0x54b690d1, 0x46b8f781),
4081 TOBN(0x82fa2c8a, 0x21230646), TOBN(0xf51aabb9, 0x084f418c),
4082 TOBN(0xff4fbec1, 0x1a30ba43), TOBN(0x6a5acf73, 0x743c9df7),
4083 TOBN(0x1da2b357, 0xd635b4d5), TOBN(0xc3de68dd, 0xecd5c1da),
4084 TOBN(0xa689080b, 0xd61af0dd), TOBN(0xdea5938a, 0xd665bf99),
4085 TOBN(0x0231d71a, 0xfe637294), TOBN(0x01968aa6, 0xa5a81cd8),
4086 TOBN(0x11252d50, 0x048e63b5), TOBN(0xc446bc52, 0x6ca007e9),
4087 TOBN(0xef8c50a6, 0x96d6134b), TOBN(0x9361fbf5, 0x9e09a05c),
4088 TOBN(0xf17f85a6, 0xdca3291a), TOBN(0xb178d548, 0xff251a21),
4089 TOBN(0x87f6374b, 0xa4df3915), TOBN(0x566ce1bf, 0x2fd5d608),
4090 TOBN(0x425cba4d, 0x7de35102), TOBN(0x6b745f8f, 0x58c5d5e2),
4091 TOBN(0x88402af6, 0x63122edf), TOBN(0x3190f9ed, 0x3b989a89),
4092 TOBN(0x4ad3d387, 0xebba3156), TOBN(0xef385ad9, 0xc7c469a5),
4093 TOBN(0xb08281de, 0x3f642c29), TOBN(0x20be0888, 0x910ffb88),
4094 TOBN(0xf353dd4a, 0xd5292546), TOBN(0x3f1627de, 0x8377a262),
4095 TOBN(0xa5faa013, 0xeefcd638), TOBN(0x8f3bf626, 0x74cc77c3),
4096 TOBN(0x32618f65, 0xa348f55e), TOBN(0x5787c0dc, 0x9fefeb9e),
4097 TOBN(0xf1673aa2, 0xd9a23e44), TOBN(0x88dfa993, 0x4e10690d),
4098 TOBN(0x1ced1b36, 0x2bf91108), TOBN(0x9193ceca, 0x3af48649),
4099 TOBN(0xfb34327d, 0x2d738fc5), TOBN(0x6697b037, 0x975fee6c),
4100 TOBN(0x2f485da0, 0xc04079a5), TOBN(0x2cdf5735, 0x2feaa1ac),
4101 TOBN(0x76944420, 0xbd55659e), TOBN(0x7973e32b, 0x4376090c),
4102 TOBN(0x86bb4fe1, 0x163b591a), TOBN(0x10441aed, 0xc196f0ca),
4103 TOBN(0x3b431f4a, 0x045ad915), TOBN(0x6c11b437, 0xa4afacb1),
4104 TOBN(0x30b0c7db, 0x71fdbbd8), TOBN(0xb642931f, 0xeda65acd),
4105 TOBN(0x4baae6e8, 0x9c92b235), TOBN(0xa73bbd0e, 0x6b3993a1),
4106 TOBN(0xd06d60ec, 0x693dd031), TOBN(0x03cab91b, 0x7156881c),
4107 TOBN(0xd615862f, 0x1db3574b), TOBN(0x485b0185, 0x64bb061a),
4108 TOBN(0x27434988, 0xa0181e06), TOBN(0x2cd61ad4, 0xc1c0c757),
4109 TOBN(0x3effed5a, 0x2ff9f403), TOBN(0x8dc98d8b, 0x62239029),
4110 TOBN(0x2206021e, 0x1f17b70d), TOBN(0xafbec0ca, 0xbf510015),
4111 TOBN(0x9fed7164, 0x80130dfa), TOBN(0x306dc2b5, 0x8a02dcf5),
4112 TOBN(0x48f06620, 0xfeb10fc0), TOBN(0x78d1e1d5, 0x5a57cf51),
4113 TOBN(0xadef8c5a, 0x192ef710), TOBN(0x88afbd4b, 0x3b7431f9),
4114 TOBN(0x7e1f7407, 0x64250c9e), TOBN(0x6e31318d, 0xb58bec07),
4115 TOBN(0xfd4fc4b8, 0x24f89b4e), TOBN(0x65a5dd88, 0x48c36a2a),
4116 TOBN(0x4f1eccff, 0xf024baa7), TOBN(0x22a21cf2, 0xcba94650),
4117 TOBN(0x95d29dee, 0x42a554f7), TOBN(0x828983a5, 0x002ec4ba),
4118 TOBN(0x8112a1f7, 0x8badb73d), TOBN(0x79ea8897, 0xa27c1839),
4119 TOBN(0x8969a5a7, 0xd065fd83), TOBN(0xf49af791, 0xb262a0bc),
4120 TOBN(0xfcdea8b6, 0xaf2b5127), TOBN(0x10e913e1, 0x564c2dbc),
4121 TOBN(0x51239d14, 0xbc21ef51), TOBN(0xe51c3ceb, 0x4ce57292),
4122 TOBN(0x795ff068, 0x47bbcc3b), TOBN(0x86b46e1e, 0xbd7e11e6),
4123 TOBN(0x0ea6ba23, 0x80041ef4), TOBN(0xd72fe505, 0x6262342e),
4124 TOBN(0x8abc6dfd, 0x31d294d4), TOBN(0xbbe017a2, 0x1278c2c9),
4125 TOBN(0xb1fcfa09, 0xb389328a), TOBN(0x322fbc62, 0xd01771b5),
4126 TOBN(0x04c0d063, 0x60b045bf), TOBN(0xdb652edc, 0x10e52d01),
4127 TOBN(0x50ef932c, 0x03ec6627), TOBN(0xde1b3b2d, 0xc1ee50e3),
4128 TOBN(0x5ab7bdc5, 0xdc37a90d), TOBN(0xfea67213, 0x31e33a96),
4129 TOBN(0x6482b5cb, 0x4f2999aa), TOBN(0x38476cc6, 0xb8cbf0dd),
4130 TOBN(0x93ebfacb, 0x173405bb), TOBN(0x15cdafe7, 0xe52369ec),
4131 TOBN(0xd42d5ba4, 0xd935b7db), TOBN(0x648b6004, 0x1c99a4cd),
4132 TOBN(0x785101bd, 0xa3b5545b), TOBN(0x4bf2c38a, 0x9dd67faf),
4133 TOBN(0xb1aadc63, 0x4442449c), TOBN(0xe0e9921a, 0x33ad4fb8),
4134 TOBN(0x5c552313, 0xaa686d82), TOBN(0xdee635fa, 0x465d866c),
4135 TOBN(0xbc3c224a, 0x18ee6e8a), TOBN(0xeed748a6, 0xed42e02f),
4136 TOBN(0xe70f930a, 0xd474cd08), TOBN(0x774ea6ec, 0xfff24adf),
4137 TOBN(0x03e2de1c, 0xf3480d4a), TOBN(0xf0d8edc7, 0xbc8acf1a),
4138 TOBN(0xf23e3303, 0x68295a9c), TOBN(0xfadd5f68, 0xc546a97d),
4139 TOBN(0x895597ad, 0x96f8acb1), TOBN(0xbddd49d5, 0x671bdae2),
4140 TOBN(0x16fcd528, 0x21dd43f4), TOBN(0xa5a45412, 0x6619141a)},
4141 {TOBN(0x8ce9b6bf, 0xc360e25a), TOBN(0xe6425195, 0x075a1a78),
4142 TOBN(0x9dc756a8, 0x481732f4), TOBN(0x83c0440f, 0x5432b57a),
4143 TOBN(0xc670b3f1, 0xd720281f), TOBN(0x2205910e, 0xd135e051),
4144 TOBN(0xded14b0e, 0xdb052be7), TOBN(0x697b3d27, 0xc568ea39),
4145 TOBN(0x2e599b9a, 0xfb3ff9ed), TOBN(0x28c2e0ab, 0x17f6515c),
4146 TOBN(0x1cbee4fd, 0x474da449), TOBN(0x071279a4, 0x4f364452),
4147 TOBN(0x97abff66, 0x01fbe855), TOBN(0x3ee394e8, 0x5fda51c4),
4148 TOBN(0x190385f6, 0x67597c0b), TOBN(0x6e9fccc6, 0xa27ee34b),
4149 TOBN(0x0b89de93, 0x14092ebb), TOBN(0xf17256bd, 0x428e240c),
4150 TOBN(0xcf89a7f3, 0x93d2f064), TOBN(0x4f57841e, 0xe1ed3b14),
4151 TOBN(0x4ee14405, 0xe708d855), TOBN(0x856aae72, 0x03f1c3d0),
4152 TOBN(0xc8e5424f, 0xbdd7eed5), TOBN(0x3333e4ef, 0x73ab4270),
4153 TOBN(0x3bc77ade, 0xdda492f8), TOBN(0xc11a3aea, 0x78297205),
4154 TOBN(0x5e89a3e7, 0x34931b4c), TOBN(0x17512e2e, 0x9f5694bb),
4155 TOBN(0x5dc349f3, 0x177bf8b6), TOBN(0x232ea4ba, 0x08c7ff3e),
4156 TOBN(0x9c4f9d16, 0xf511145d), TOBN(0xccf109a3, 0x33b379c3),
4157 TOBN(0xe75e7a88, 0xa1f25897), TOBN(0x7ac6961f, 0xa1b5d4d8),
4158 TOBN(0xe3e10773, 0x08f3ed5c), TOBN(0x208a54ec, 0x0a892dfb),
4159 TOBN(0xbe826e19, 0x78660710), TOBN(0x0cf70a97, 0x237df2c8),
4160 TOBN(0x418a7340, 0xed704da5), TOBN(0xa3eeb9a9, 0x08ca33fd),
4161 TOBN(0x49d96233, 0x169bca96), TOBN(0x04d286d4, 0x2da6aafb),
4162 TOBN(0xc09606ec, 0xa0c2fa94), TOBN(0x8869d0d5, 0x23ff0fb3),
4163 TOBN(0xa99937e5, 0xd0150d65), TOBN(0xa92e2503, 0x240c14c9),
4164 TOBN(0x656bf945, 0x108e2d49), TOBN(0x152a733a, 0xa2f59e2b),
4165 TOBN(0xb4323d58, 0x8434a920), TOBN(0xc0af8e93, 0x622103c5),
4166 TOBN(0x667518ef, 0x938dbf9a), TOBN(0xa1843073, 0x83a9cdf2),
4167 TOBN(0x350a94aa, 0x5447ab80), TOBN(0xe5e5a325, 0xc75a3d61),
4168 TOBN(0x74ba507f, 0x68411a9e), TOBN(0x10581fc1, 0x594f70c5),
4169 TOBN(0x60e28570, 0x80eb24a9), TOBN(0x7bedfb4d, 0x488e0cfd),
4170 TOBN(0x721ebbd7, 0xc259cdb8), TOBN(0x0b0da855, 0xbc6390a9),
4171 TOBN(0x2b4d04db, 0xde314c70), TOBN(0xcdbf1fbc, 0x6c32e846),
4172 TOBN(0x33833eab, 0xb162fc9e), TOBN(0x9939b48b, 0xb0dd3ab7),
4173 TOBN(0x5aaa98a7, 0xcb0c9c8c), TOBN(0x75105f30, 0x81c4375c),
4174 TOBN(0xceee5057, 0x5ef1c90f), TOBN(0xb31e065f, 0xc23a17bf),
4175 TOBN(0x5364d275, 0xd4b6d45a), TOBN(0xd363f3ad, 0x62ec8996),
4176 TOBN(0xb5d21239, 0x4391c65b), TOBN(0x84564765, 0xebb41b47),
4177 TOBN(0x20d18ecc, 0x37107c78), TOBN(0xacff3b6b, 0x570c2a66),
4178 TOBN(0x22f975d9, 0x9bd0d845), TOBN(0xef0a0c46, 0xba178fa0),
4179 TOBN(0x1a419651, 0x76b6028e), TOBN(0xc49ec674, 0x248612d4),
4180 TOBN(0x5b6ac4f2, 0x7338af55), TOBN(0x06145e62, 0x7bee5a36),
4181 TOBN(0x33e95d07, 0xe75746b5), TOBN(0x1c1e1f6d, 0xc40c78be),
4182 TOBN(0x967833ef, 0x222ff8e2), TOBN(0x4bedcf6a, 0xb49180ad),
4183 TOBN(0x6b37e9c1, 0x3d7a4c8a), TOBN(0x2748887c, 0x6ddfe760),
4184 TOBN(0xf7055123, 0xaa3a5bbc), TOBN(0x954ff225, 0x7bbb8e74),
4185 TOBN(0xc42b8ab1, 0x97c3dfb9), TOBN(0x55a549b0, 0xcf168154),
4186 TOBN(0xad6748e7, 0xc1b50692), TOBN(0x2775780f, 0x6fc5cbcb),
4187 TOBN(0x4eab80b8, 0xe1c9d7c8), TOBN(0x8c69dae1, 0x3fdbcd56),
4188 TOBN(0x47e6b4fb, 0x9969eace), TOBN(0x002f1085, 0xa705cb5a),
4189 TOBN(0x4e23ca44, 0x6d3fea55), TOBN(0xb4ae9c86, 0xf4810568),
4190 TOBN(0x47bfb91b, 0x2a62f27d), TOBN(0x60deb4c9, 0xd9bac28c),
4191 TOBN(0xa892d894, 0x7de6c34c), TOBN(0x4ee68259, 0x4494587d),
4192 TOBN(0x914ee14e, 0x1a3f8a5b), TOBN(0xbb113eaa, 0x28700385),
4193 TOBN(0x81ca03b9, 0x2115b4c9), TOBN(0x7c163d38, 0x8908cad1),
4194 TOBN(0xc912a118, 0xaa18179a), TOBN(0xe09ed750, 0x886e3081),
4195 TOBN(0xa676e3fa, 0x26f516ca), TOBN(0x753cacf7, 0x8e732f91),
4196 TOBN(0x51592aea, 0x833da8b4), TOBN(0xc626f42f, 0x4cbea8aa),
4197 TOBN(0xef9dc899, 0xa7b56eaf), TOBN(0x00c0e52c, 0x34ef7316),
4198 TOBN(0x5b1e4e24, 0xfe818a86), TOBN(0x9d31e20d, 0xc538be47),
4199 TOBN(0x22eb932d, 0x3ed68974), TOBN(0xe44bbc08, 0x7c4e87c4),
4200 TOBN(0x4121086e, 0x0dde9aef), TOBN(0x8e6b9cff, 0x134f4345),
4201 TOBN(0x96892c1f, 0x711b0eb9), TOBN(0xb905f2c8, 0x780ab954),
4202 TOBN(0xace26309, 0xa20792db), TOBN(0xec8ac9b3, 0x0684e126),
4203 TOBN(0x486ad8b6, 0xb40a2447), TOBN(0x60121fc1, 0x9fe3fb24),
4204 TOBN(0x5626fccf, 0x1a8e3b3f), TOBN(0x4e568622, 0x6ad1f394),
4205 TOBN(0xda7aae0d, 0x196aa5a1), TOBN(0xe0df8c77, 0x1041b5fb),
4206 TOBN(0x451465d9, 0x26b318b7), TOBN(0xc29b6e55, 0x7ab136e9),
4207 TOBN(0x2c2ab48b, 0x71148463), TOBN(0xb5738de3, 0x64454a76),
4208 TOBN(0x54ccf9a0, 0x5a03abe4), TOBN(0x377c0296, 0x0427d58e),
4209 TOBN(0x73f5f0b9, 0x2bb39c1f), TOBN(0x14373f2c, 0xe608d8c5),
4210 TOBN(0xdcbfd314, 0x00fbb805), TOBN(0xdf18fb20, 0x83afdcfb),
4211 TOBN(0x81a57f42, 0x42b3523f), TOBN(0xe958532d, 0x87f650fb),
4212 TOBN(0xaa8dc8b6, 0x8b0a7d7c), TOBN(0x1b75dfb7, 0x150166be),
4213 TOBN(0x90e4f7c9, 0x2d7d1413), TOBN(0x67e2d6b5, 0x9834f597),
4214 TOBN(0x4fd4f4f9, 0xa808c3e8), TOBN(0xaf8237e0, 0xd5281ec1),
4215 TOBN(0x25ab5fdc, 0x84687cee), TOBN(0xc5ded6b1, 0xa5b26c09),
4216 TOBN(0x8e4a5aec, 0xc8ea7650), TOBN(0x23b73e5c, 0x14cc417f),
4217 TOBN(0x2bfb4318, 0x3037bf52), TOBN(0xb61e6db5, 0x78c725d7),
4218 TOBN(0x8efd4060, 0xbbb3e5d7), TOBN(0x2e014701, 0xdbac488e),
4219 TOBN(0xac75cf9a, 0x360aa449), TOBN(0xb70cfd05, 0x79634d08),
4220 TOBN(0xa591536d, 0xfffb15ef), TOBN(0xb2c37582, 0xd07c106c),
4221 TOBN(0xb4293fdc, 0xf50225f9), TOBN(0xc52e175c, 0xb0e12b03),
4222 TOBN(0xf649c3ba, 0xd0a8bf64), TOBN(0x745a8fef, 0xeb8ae3c6),
4223 TOBN(0x30d7e5a3, 0x58321bc3), TOBN(0xb1732be7, 0x0bc4df48),
4224 TOBN(0x1f217993, 0xe9ea5058), TOBN(0xf7a71cde, 0x3e4fd745),
4225 TOBN(0x86cc533e, 0x894c5bbb), TOBN(0x6915c7d9, 0x69d83082),
4226 TOBN(0xa6aa2d05, 0x5815c244), TOBN(0xaeeee592, 0x49b22ce5),
4227 TOBN(0x89e39d13, 0x78135486), TOBN(0x3a275c1f, 0x16b76f2f),
4228 TOBN(0xdb6bcc1b, 0xe036e8f5), TOBN(0x4df69b21, 0x5e4709f5),
4229 TOBN(0xa188b250, 0x2d0f39aa), TOBN(0x622118bb, 0x15a85947),
4230 TOBN(0x2ebf520f, 0xfde0f4fa), TOBN(0xa40e9f29, 0x4860e539),
4231 TOBN(0x7b6a51eb, 0x22b57f0f), TOBN(0x849a33b9, 0x7e80644a),
4232 TOBN(0x50e5d16f, 0x1cf095fe), TOBN(0xd754b54e, 0xec55f002),
4233 TOBN(0x5cfbbb22, 0x236f4a98), TOBN(0x0b0c59e9, 0x066800bb),
4234 TOBN(0x4ac69a8f, 0x5a9a7774), TOBN(0x2b33f804, 0xd6bec948),
4235 TOBN(0xb3729295, 0x32e6c466), TOBN(0x68956d0f, 0x4e599c73),
4236 TOBN(0xa47a249f, 0x155c31cc), TOBN(0x24d80f0d, 0xe1ce284e),
4237 TOBN(0xcd821dfb, 0x988baf01), TOBN(0xe6331a7d, 0xdbb16647),
4238 TOBN(0x1eb8ad33, 0x094cb960), TOBN(0x593cca38, 0xc91bbca5),
4239 TOBN(0x384aac8d, 0x26567456), TOBN(0x40fa0309, 0xc04b6490),
4240 TOBN(0x97834cd6, 0xdab6c8f6), TOBN(0x68a7318d, 0x3f91e55f),
4241 TOBN(0xa00fd04e, 0xfc4d3157), TOBN(0xb56f8ab2, 0x2bf3bdea),
4242 TOBN(0x014f5648, 0x4fa57172), TOBN(0x948c5860, 0x450abdb3),
4243 TOBN(0x342b5df0, 0x0ebd4f08), TOBN(0x3e5168cd, 0x0e82938e),
4244 TOBN(0x7aedc1ce, 0xb0df5dd0), TOBN(0x6bbbc6d9, 0xe5732516),
4245 TOBN(0xc7bfd486, 0x605daaa6), TOBN(0x46fd72b7, 0xbb9a6c9e),
4246 TOBN(0xe4847fb1, 0xa124fb89), TOBN(0x75959cbd, 0xa2d8ffbc),
4247 TOBN(0x42579f65, 0xc8a588ee), TOBN(0x368c92e6, 0xb80b499d),
4248 TOBN(0xea4ef6cd, 0x999a5df1), TOBN(0xaa73bb7f, 0x936fe604),
4249 TOBN(0xf347a70d, 0x6457d188), TOBN(0x86eda86b, 0x8b7a388b),
4250 TOBN(0xb7cdff06, 0x0ccd6013), TOBN(0xbeb1b6c7, 0xd0053fb2),
4251 TOBN(0x0b022387, 0x99240a9f), TOBN(0x1bbb384f, 0x776189b2),
4252 TOBN(0x8695e71e, 0x9066193a), TOBN(0x2eb50097, 0x06ffac7e),
4253 TOBN(0x0654a9c0, 0x4a7d2caa), TOBN(0x6f3fb3d1, 0xa5aaa290),
4254 TOBN(0x835db041, 0xff476e8f), TOBN(0x540b8b0b, 0xc42295e4),
4255 TOBN(0xa5c73ac9, 0x05e214f5), TOBN(0x9a74075a, 0x56a0b638),
4256 TOBN(0x2e4b1090, 0xce9e680b), TOBN(0x57a5b479, 0x6b8d9afa),
4257 TOBN(0x0dca48e7, 0x26bfe65c), TOBN(0x097e391c, 0x7290c307),
4258 TOBN(0x683c462e, 0x6669e72e), TOBN(0xf505be1e, 0x062559ac),
4259 TOBN(0x5fbe3ea1, 0xe3a3035a), TOBN(0x6431ebf6, 0x9cd50da8),
4260 TOBN(0xfd169d5c, 0x1f6407f2), TOBN(0x8d838a95, 0x60fce6b8),
4261 TOBN(0x2a2bfa7f, 0x650006f0), TOBN(0xdfd7dad3, 0x50c0fbb2),
4262 TOBN(0x92452495, 0xccf9ad96), TOBN(0x183bf494, 0xd95635f9),
4263 TOBN(0x02d5df43, 0x4a7bd989), TOBN(0x505385cc, 0xa5431095),
4264 TOBN(0xdd98e67d, 0xfd43f53e), TOBN(0xd61e1a6c, 0x500c34a9),
4265 TOBN(0x5a4b46c6, 0x4a8a3d62), TOBN(0x8469c4d0, 0x247743d2),
4266 TOBN(0x2bb3a13d, 0x88f7e433), TOBN(0x62b23a10, 0x01be5849),
4267 TOBN(0xe83596b4, 0xa63d1a4c), TOBN(0x454e7fea, 0x7d183f3e),
4268 TOBN(0x643fce61, 0x17afb01c), TOBN(0x4e65e5e6, 0x1c4c3638),
4269 TOBN(0x41d85ea1, 0xef74c45b), TOBN(0x2cfbfa66, 0xae328506),
4270 TOBN(0x98b078f5, 0x3ada7da9), TOBN(0xd985fe37, 0xec752fbb),
4271 TOBN(0xeece68fe, 0x5a0148b4), TOBN(0x6f9a55c7, 0x2d78136d),
4272 TOBN(0x232dccc4, 0xd2b729ce), TOBN(0xa27e0dfd, 0x90aafbc4),
4273 TOBN(0x96474452, 0x12b4603e), TOBN(0xa876c551, 0x6b706d14),
4274 TOBN(0xdf145fcf, 0x69a9d412), TOBN(0xe2ab75b7, 0x2d479c34),
4275 TOBN(0x12df9a76, 0x1a23ff97), TOBN(0xc6138992, 0x5d359d10),
4276 TOBN(0x6e51c7ae, 0xfa835f22), TOBN(0x69a79cb1, 0xc0fcc4d9),
4277 TOBN(0xf57f350d, 0x594cc7e1), TOBN(0x3079ca63, 0x3350ab79),
4278 TOBN(0x226fb614, 0x9aff594a), TOBN(0x35afec02, 0x6d59a62b),
4279 TOBN(0x9bee46f4, 0x06ed2c6e), TOBN(0x58da1735, 0x7d939a57),
4280 TOBN(0x44c50402, 0x8fd1797e), TOBN(0xd8853e7c, 0x5ccea6ca),
4281 TOBN(0x4065508d, 0xa35fcd5f), TOBN(0x8965df8c, 0x495ccaeb),
4282 TOBN(0x0f2da850, 0x12e1a962), TOBN(0xee471b94, 0xc1cf1cc4),
4283 TOBN(0xcef19bc8, 0x0a08fb75), TOBN(0x704958f5, 0x81de3591),
4284 TOBN(0x2867f8b2, 0x3aef4f88), TOBN(0x8d749384, 0xea9f9a5f),
4285 TOBN(0x1b385537, 0x8c9049f4), TOBN(0x5be948f3, 0x7b92d8b6),
4286 TOBN(0xd96f725d, 0xb6e2bd6b), TOBN(0x37a222bc, 0x958c454d),
4287 TOBN(0xe7c61abb, 0x8809bf61), TOBN(0x46f07fbc, 0x1346f18d),
4288 TOBN(0xfb567a7a, 0xe87c0d1c), TOBN(0x84a461c8, 0x7ef3d07a),
4289 TOBN(0x0a5adce6, 0xd9278d98), TOBN(0x24d94813, 0x9dfc73e1),
4290 TOBN(0x4f3528b6, 0x054321c3), TOBN(0x2e03fdde, 0x692ea706),
4291 TOBN(0x10e60619, 0x47b533c0), TOBN(0x1a8bc73f, 0x2ca3c055),
4292 TOBN(0xae58d4b2, 0x1bb62b8f), TOBN(0xb2045a73, 0x584a24e3),
4293 TOBN(0x3ab3d5af, 0xbd76e195), TOBN(0x478dd1ad, 0x6938a810),
4294 TOBN(0x6ffab393, 0x6ee3d5cb), TOBN(0xdfb693db, 0x22b361e4),
4295 TOBN(0xf9694496, 0x51dbf1a7), TOBN(0xcab4b4ef, 0x08a2e762),
4296 TOBN(0xe8c92f25, 0xd39bba9a), TOBN(0x850e61bc, 0xf1464d96),
4297 TOBN(0xb7e830e3, 0xdc09508b), TOBN(0xfaf6d2cf, 0x74317655),
4298 TOBN(0x72606ceb, 0xdf690355), TOBN(0x48bb92b3, 0xd0c3ded6),
4299 TOBN(0x65b75484, 0x5c7cf892), TOBN(0xf6cd7ac9, 0xd5d5f01f),
4300 TOBN(0xc2c30a59, 0x96401d69), TOBN(0x91268650, 0xed921878),
4301 TOBN(0x380bf913, 0xb78c558f), TOBN(0x43c0baeb, 0xc8afdaa9),
4302 TOBN(0x377f61d5, 0x54f169d3), TOBN(0xf8da07e3, 0xae5ff20b),
4303 TOBN(0xb676c49d, 0xa8a90ea8), TOBN(0x81c1ff2b, 0x83a29b21),
4304 TOBN(0x383297ac, 0x2ad8d276), TOBN(0x3001122f, 0xba89f982),
4305 TOBN(0xe1d794be, 0x6718e448), TOBN(0x246c1482, 0x7c3e6e13),
4306 TOBN(0x56646ef8, 0x5d26b5ef), TOBN(0x80f5091e, 0x88069cdd),
4307 TOBN(0xc5992e2f, 0x724bdd38), TOBN(0x02e915b4, 0x8471e8c7),
4308 TOBN(0x96ff320a, 0x0d0ff2a9), TOBN(0xbf886487, 0x4384d1a0),
4309 TOBN(0xbbe1e6a6, 0xc93f72d6), TOBN(0xd5f75d12, 0xcad800ea),
4310 TOBN(0xfa40a09f, 0xe7acf117), TOBN(0x32c8cdd5, 0x7581a355),
4311 TOBN(0x74221992, 0x7023c499), TOBN(0xa8afe5d7, 0x38ec3901),
4312 TOBN(0x5691afcb, 0xa90e83f0), TOBN(0x41bcaa03, 0x0b8f8eac),
4313 TOBN(0xe38b5ff9, 0x8d2668d5), TOBN(0x0715281a, 0x7ad81965),
4314 TOBN(0x1bc8fc7c, 0x03c6ce11), TOBN(0xcbbee6e2, 0x8b650436),
4315 TOBN(0x06b00fe8, 0x0cdb9808), TOBN(0x17d6e066, 0xfe3ed315),
4316 TOBN(0x2e9d38c6, 0x4d0b5018), TOBN(0xab8bfd56, 0x844dcaef),
4317 TOBN(0x42894a59, 0x513aed8b), TOBN(0xf77f3b6d, 0x314bd07a),
4318 TOBN(0xbbdecb8f, 0x8e42b582), TOBN(0xf10e2fa8, 0xd2390fe6),
4319 TOBN(0xefb95022, 0x62a2f201), TOBN(0x4d59ea50, 0x50ee32b0),
4320 TOBN(0xd87f7728, 0x6da789a8), TOBN(0xcf98a2cf, 0xf79492c4),
4321 TOBN(0xf9577239, 0x720943c2), TOBN(0xba044cf5, 0x3990b9d0),
4322 TOBN(0x5aa8e823, 0x95f2884a), TOBN(0x834de6ed, 0x0278a0af),
4323 TOBN(0xc8e1ee9a, 0x5f25bd12), TOBN(0x9259ceaa, 0x6f7ab271),
4324 TOBN(0x7e6d97a2, 0x77d00b76), TOBN(0x5c0c6eea, 0xa437832a),
4325 TOBN(0x5232c20f, 0x5606b81d), TOBN(0xabd7b375, 0x0d991ee5),
4326 TOBN(0x4d2bfe35, 0x8632d951), TOBN(0x78f85146, 0x98ed9364),
4327 TOBN(0x951873f0, 0xf30c3282), TOBN(0x0da8ac80, 0xa789230b),
4328 TOBN(0x3ac7789c, 0x5398967f), TOBN(0xa69b8f7f, 0xbdda0fb5),
4329 TOBN(0xe5db7717, 0x6add8545), TOBN(0x1b71cb66, 0x72c49b66),
4330 TOBN(0xd8560739, 0x68421d77), TOBN(0x03840fe8, 0x83e3afea),
4331 TOBN(0xb391dad5, 0x1ec69977), TOBN(0xae243fb9, 0x307f6726),
4332 TOBN(0xc88ac87b, 0xe8ca160c), TOBN(0x5174cced, 0x4ce355f4),
4333 TOBN(0x98a35966, 0xe58ba37d), TOBN(0xfdcc8da2, 0x7817335d),
4334 TOBN(0x5b752830, 0x83fbc7bf), TOBN(0x68e419d4, 0xd9c96984),
4335 TOBN(0x409a39f4, 0x02a40380), TOBN(0x88940faf, 0x1fe977bc),
4336 TOBN(0xc640a94b, 0x8f8edea6), TOBN(0x1e22cd17, 0xed11547d),
4337 TOBN(0xe28568ce, 0x59ffc3e2), TOBN(0x60aa1b55, 0xc1dee4e7),
4338 TOBN(0xc67497c8, 0x837cb363), TOBN(0x06fb438a, 0x105a2bf2),
4339 TOBN(0x30357ec4, 0x500d8e20), TOBN(0x1ad9095d, 0x0670db10),
4340 TOBN(0x7f589a05, 0xc73b7cfd), TOBN(0xf544607d, 0x880d6d28),
4341 TOBN(0x17ba93b1, 0xa20ef103), TOBN(0xad859130, 0x6ba6577b),
4342 TOBN(0x65c91cf6, 0x6fa214a0), TOBN(0xd7d49c6c, 0x27990da5),
4343 TOBN(0xecd9ec8d, 0x20bb569d), TOBN(0xbd4b2502, 0xeeffbc33),
4344 TOBN(0x2056ca5a, 0x6bed0467), TOBN(0x7916a1f7, 0x5b63728c),
4345 TOBN(0xd4f9497d, 0x53a4f566), TOBN(0x89734664, 0x97b56810),
4346 TOBN(0xf8e1da74, 0x0494a621), TOBN(0x82546a93, 0x8d011c68),
4347 TOBN(0x1f3acb19, 0xc61ac162), TOBN(0x52f8fa9c, 0xabad0d3e),
4348 TOBN(0x15356523, 0xb4b7ea43), TOBN(0x5a16ad61, 0xae608125),
4349 TOBN(0xb0bcb87f, 0x4faed184), TOBN(0x5f236b1d, 0x5029f45f),
4350 TOBN(0xd42c7607, 0x0bc6b1fc), TOBN(0xc644324e, 0x68aefce3),
4351 TOBN(0x8e191d59, 0x5c5d8446), TOBN(0xc0208077, 0x13ae1979),
4352 TOBN(0xadcaee55, 0x3ba59cc7), TOBN(0x20ed6d6b, 0xa2cb81ba),
4353 TOBN(0x0952ba19, 0xb6efcffc), TOBN(0x60f12d68, 0x97c0b87c),
4354 TOBN(0x4ee2c7c4, 0x9caa30bc), TOBN(0x767238b7, 0x97fbff4e),
4355 TOBN(0xebc73921, 0x501b5d92), TOBN(0x3279e3df, 0xc2a37737),
4356 TOBN(0x9fc12bc8, 0x6d197543), TOBN(0xfa94dc6f, 0x0a40db4e),
4357 TOBN(0x7392b41a, 0x530ccbbd), TOBN(0x87c82146, 0xea823525),
4358 TOBN(0xa52f984c, 0x05d98d0c), TOBN(0x2ae57d73, 0x5ef6974c),
4359 TOBN(0x9377f7bf, 0x3042a6dd), TOBN(0xb1a007c0, 0x19647a64),
4360 TOBN(0xfaa9079a, 0x0cca9767), TOBN(0x3d81a25b, 0xf68f72d5),
4361 TOBN(0x752067f8, 0xff81578e), TOBN(0x78622150, 0x9045447d),
4362 TOBN(0xc0c22fcf, 0x0505aa6f), TOBN(0x1030f0a6, 0x6bed1c77),
4363 TOBN(0x31f29f15, 0x1f0bd739), TOBN(0x2d7989c7, 0xe6debe85),
4364 TOBN(0x5c070e72, 0x8e677e98), TOBN(0x0a817bd3, 0x06e81fd5),
4365 TOBN(0xc110d830, 0xb0f2ac95), TOBN(0x48d0995a, 0xab20e64e),
4366 TOBN(0x0f3e00e1, 0x7729cd9a), TOBN(0x2a570c20, 0xdd556946),
4367 TOBN(0x912dbcfd, 0x4e86214d), TOBN(0x2d014ee2, 0xcf615498),
4368 TOBN(0x55e2b1e6, 0x3530d76e), TOBN(0xc5135ae4, 0xfd0fd6d1),
4369 TOBN(0x0066273a, 0xd4f3049f), TOBN(0xbb8e9893, 0xe7087477),
4370 TOBN(0x2dba1ddb, 0x14c6e5fd), TOBN(0xdba37886, 0x51f57e6c),
4371 TOBN(0x5aaee0a6, 0x5a72f2cf), TOBN(0x1208bfbf, 0x7bea5642),
4372 TOBN(0xf5c6aa3b, 0x67872c37), TOBN(0xd726e083, 0x43f93224),
4373 TOBN(0x1854daa5, 0x061f1658), TOBN(0xc0016df1, 0xdf0cd2b3),
4374 TOBN(0xc2a3f23e, 0x833d50de), TOBN(0x73b681d2, 0xbbbd3017),
4375 TOBN(0x2f046dc4, 0x3ac343c0), TOBN(0x9c847e7d, 0x85716421),
4376 TOBN(0xe1e13c91, 0x0917eed4), TOBN(0x3fc9eebd, 0x63a1b9c6),
4377 TOBN(0x0f816a72, 0x7fe02299), TOBN(0x6335ccc2, 0x294f3319),
4378 TOBN(0x3820179f, 0x4745c5be), TOBN(0xe647b782, 0x922f066e),
4379 TOBN(0xc22e49de, 0x02cafb8a), TOBN(0x299bc2ff, 0xfcc2eccc),
4380 TOBN(0x9a8feea2, 0x6e0e8282), TOBN(0xa627278b, 0xfe893205),
4381 TOBN(0xa7e19733, 0x7933e47b), TOBN(0xf4ff6b13, 0x2e766402),
4382 TOBN(0xa4d8be0a, 0x98440d9f), TOBN(0x658f5c2f, 0x38938808),
4383 TOBN(0x90b75677, 0xc95b3b3e), TOBN(0xfa044269, 0x3137b6ff),
4384 TOBN(0x077b039b, 0x43c47c29), TOBN(0xcca95dd3, 0x8a6445b2),
4385 TOBN(0x0b498ba4, 0x2333fc4c), TOBN(0x274f8e68, 0xf736a1b1),
4386 TOBN(0x6ca348fd, 0x5f1d4b2e), TOBN(0x24d3be78, 0xa8f10199),
4387 TOBN(0x8535f858, 0xca14f530), TOBN(0xa6e7f163, 0x5b982e51),
4388 TOBN(0x847c8512, 0x36e1bf62), TOBN(0xf6a7c58e, 0x03448418),
4389 TOBN(0x583f3703, 0xf9374ab6), TOBN(0x864f9195, 0x6e564145),
4390 TOBN(0x33bc3f48, 0x22526d50), TOBN(0x9f323c80, 0x1262a496),
4391 TOBN(0xaa97a7ae, 0x3f046a9a), TOBN(0x70da183e, 0xdf8a039a),
4392 TOBN(0x5b68f71c, 0x52aa0ba6), TOBN(0x9be0fe51, 0x21459c2d),
4393 TOBN(0xc1e17eb6, 0xcbc613e5), TOBN(0x33131d55, 0x497ea61c),
4394 TOBN(0x2f69d39e, 0xaf7eded5), TOBN(0x73c2f434, 0xde6af11b),
4395 TOBN(0x4ca52493, 0xa4a375fa), TOBN(0x5f06787c, 0xb833c5c2),
4396 TOBN(0x814e091f, 0x3e6e71cf), TOBN(0x76451f57, 0x8b746666)},
4397 {
4398 TOBN(0x80f9bdef, 0x694db7e0), TOBN(0xedca8787, 0xb9fcddc6),
4399 TOBN(0x51981c34, 0x03b8dce1), TOBN(0x4274dcf1, 0x70e10ba1),
4400 TOBN(0xf72743b8, 0x6def6d1a), TOBN(0xd25b1670, 0xebdb1866),
4401 TOBN(0xc4491e8c, 0x050c6f58), TOBN(0x2be2b2ab, 0x87fbd7f5),
4402 TOBN(0x3e0e5c9d, 0xd111f8ec), TOBN(0xbcc33f8d, 0xb7c4e760),
4403 TOBN(0x702f9a91, 0xbd392a51), TOBN(0x7da4a795, 0xc132e92d),
4404 TOBN(0x1a0b0ae3, 0x0bb1151b), TOBN(0x54febac8, 0x02e32251),
4405 TOBN(0xea3a5082, 0x694e9e78), TOBN(0xe58ffec1, 0xe4fe40b8),
4406 TOBN(0xf85592fc, 0xd1e0cf9e), TOBN(0xdea75f0d, 0xc0e7b2e8),
4407 TOBN(0xc04215cf, 0xc135584e), TOBN(0x174fc727, 0x2f57092a),
4408 TOBN(0xe7277877, 0xeb930bea), TOBN(0x504caccb, 0x5eb02a5a),
4409 TOBN(0xf9fe08f7, 0xf5241b9b), TOBN(0xe7fb62f4, 0x8d5ca954),
4410 TOBN(0xfbb8349d, 0x29c4120b), TOBN(0x9f94391f, 0xc0d0d915),
4411 TOBN(0xc4074fa7, 0x5410ba51), TOBN(0xa66adbf6, 0x150a5911),
4412 TOBN(0xc164543c, 0x34bfca38), TOBN(0xe0f27560, 0xb9e1ccfc),
4413 TOBN(0x99da0f53, 0xe820219c), TOBN(0xe8234498, 0xc6b4997a),
4414 TOBN(0xcfb88b76, 0x9d4c5423), TOBN(0x9e56eb10, 0xb0521c49),
4415 TOBN(0x418e0b5e, 0xbe8700a1), TOBN(0x00cbaad6, 0xf93cb58a),
4416 TOBN(0xe923fbde, 0xd92a5e67), TOBN(0xca4979ac, 0x1f347f11),
4417 TOBN(0x89162d85, 0x6bc0585b), TOBN(0xdd6254af, 0xac3c70e3),
4418 TOBN(0x7b23c513, 0x516e19e4), TOBN(0x56e2e847, 0xc5c4d593),
4419 TOBN(0x9f727d73, 0x5ce71ef6), TOBN(0x5b6304a6, 0xf79a44c5),
4420 TOBN(0x6638a736, 0x3ab7e433), TOBN(0x1adea470, 0xfe742f83),
4421 TOBN(0xe054b854, 0x5b7fc19f), TOBN(0xf935381a, 0xba1d0698),
4422 TOBN(0x546eab2d, 0x799e9a74), TOBN(0x96239e0e, 0xa949f729),
4423 TOBN(0xca274c6b, 0x7090055a), TOBN(0x835142c3, 0x9020c9b0),
4424 TOBN(0xa405667a, 0xa2e8807f), TOBN(0x29f2c085, 0x1aa3d39e),
4425 TOBN(0xcc555d64, 0x42fc72f5), TOBN(0xe856e0e7, 0xfbeacb3c),
4426 TOBN(0xb5504f9d, 0x918e4936), TOBN(0x65035ef6, 0xb2513982),
4427 TOBN(0x0553a0c2, 0x6f4d9cb9), TOBN(0x6cb10d56, 0xbea85509),
4428 TOBN(0x48d957b7, 0xa242da11), TOBN(0x16a4d3dd, 0x672b7268),
4429 TOBN(0x3d7e637c, 0x8502a96b), TOBN(0x27c7032b, 0x730d463b),
4430 TOBN(0xbdc02b18, 0xe4136a14), TOBN(0xbacf969d, 0x678e32bf),
4431 TOBN(0xc98d89a3, 0xdd9c3c03), TOBN(0x7b92420a, 0x23becc4f),
4432 TOBN(0xd4b41f78, 0xc64d565c), TOBN(0x9f969d00, 0x10f28295),
4433 TOBN(0xec7f7f76, 0xb13d051a), TOBN(0x08945e1e, 0xa92da585),
4434 TOBN(0x55366b7d, 0x5846426f), TOBN(0xe7d09e89, 0x247d441d),
4435 TOBN(0x510b404d, 0x736fbf48), TOBN(0x7fa003d0, 0xe784bd7d),
4436 TOBN(0x25f7614f, 0x17fd9596), TOBN(0x49e0e0a1, 0x35cb98db),
4437 TOBN(0x2c65957b, 0x2e83a76a), TOBN(0x5d40da8d, 0xcddbe0f8),
4438 TOBN(0xf2b8c405, 0x050bad24), TOBN(0x8918426d, 0xc2aa4823),
4439 TOBN(0x2aeab3dd, 0xa38365a7), TOBN(0x72031717, 0x7c91b690),
4440 TOBN(0x8b00d699, 0x60a94120), TOBN(0x478a255d, 0xe99eaeec),
4441 TOBN(0xbf656a5f, 0x6f60aafd), TOBN(0xdfd7cb75, 0x5dee77b3),
4442 TOBN(0x37f68bb4, 0xa595939d), TOBN(0x03556479, 0x28740217),
4443 TOBN(0x8e740e7c, 0x84ad7612), TOBN(0xd89bc843, 0x9044695f),
4444 TOBN(0xf7f3da5d, 0x85a9184d), TOBN(0x562563bb, 0x9fc0b074),
4445 TOBN(0x06d2e6aa, 0xf88a888e), TOBN(0x612d8643, 0x161fbe7c),
4446 TOBN(0x465edba7, 0xf64085e7), TOBN(0xb230f304, 0x29aa8511),
4447 TOBN(0x53388426, 0xcda2d188), TOBN(0x90885735, 0x4b666649),
4448 TOBN(0x6f02ff9a, 0x652f54f6), TOBN(0x65c82294, 0x5fae2bf0),
4449 TOBN(0x7816ade0, 0x62f5eee3), TOBN(0xdcdbdf43, 0xfcc56d70),
4450 TOBN(0x9fb3bba3, 0x54530bb2), TOBN(0xbde3ef77, 0xcb0869ea),
4451 TOBN(0x89bc9046, 0x0b431163), TOBN(0x4d03d7d2, 0xe4819a35),
4452 TOBN(0x33ae4f9e, 0x43b6a782), TOBN(0x216db307, 0x9c88a686),
4453 TOBN(0x91dd88e0, 0x00ffedd9), TOBN(0xb280da9f, 0x12bd4840),
4454 TOBN(0x32a7cb8a, 0x1635e741), TOBN(0xfe14008a, 0x78be02a7),
4455 TOBN(0x3fafb334, 0x1b7ae030), TOBN(0x7fd508e7, 0x5add0ce9),
4456 TOBN(0x72c83219, 0xd607ad51), TOBN(0x0f229c0a, 0x8d40964a),
4457 TOBN(0x1be2c336, 0x1c878da2), TOBN(0xe0c96742, 0xeab2ab86),
4458 TOBN(0x458f8691, 0x3e538cd7), TOBN(0xa7001f6c, 0x8e08ad53),
4459 TOBN(0x52b8c6e6, 0xbf5d15ff), TOBN(0x548234a4, 0x011215dd),
4460 TOBN(0xff5a9d2d, 0x3d5b4045), TOBN(0xb0ffeeb6, 0x4a904190),
4461 TOBN(0x55a3aca4, 0x48607f8b), TOBN(0x8cbd665c, 0x30a0672a),
4462 TOBN(0x87f834e0, 0x42583068), TOBN(0x02da2aeb, 0xf3f6e683),
4463 TOBN(0x6b763e5d, 0x05c12248), TOBN(0x7230378f, 0x65a8aefc),
4464 TOBN(0x93bd80b5, 0x71e8e5ca), TOBN(0x53ab041c, 0xb3b62524),
4465 TOBN(0x1b860513, 0x6c9c552e), TOBN(0xe84d402c, 0xd5524e66),
4466 TOBN(0xa37f3573, 0xf37f5937), TOBN(0xeb0f6c7d, 0xd1e4fca5),
4467 TOBN(0x2965a554, 0xac8ab0fc), TOBN(0x17fbf56c, 0x274676ac),
4468 TOBN(0x2e2f6bd9, 0xacf7d720), TOBN(0x41fc8f88, 0x10224766),
4469 TOBN(0x517a14b3, 0x85d53bef), TOBN(0xdae327a5, 0x7d76a7d1),
4470 TOBN(0x6ad0a065, 0xc4818267), TOBN(0x33aa189b, 0x37c1bbc1),
4471 TOBN(0x64970b52, 0x27392a92), TOBN(0x21699a1c, 0x2d1535ea),
4472 TOBN(0xcd20779c, 0xc2d7a7fd), TOBN(0xe3186059, 0x99c83cf2),
4473 TOBN(0x9b69440b, 0x72c0b8c7), TOBN(0xa81497d7, 0x7b9e0e4d),
4474 TOBN(0x515d5c89, 0x1f5f82dc), TOBN(0x9a7f67d7, 0x6361079e),
4475 TOBN(0xa8da81e3, 0x11a35330), TOBN(0xe44990c4, 0x4b18be1b),
4476 TOBN(0xc7d5ed95, 0xaf103e59), TOBN(0xece8aba7, 0x8dac9261),
4477 TOBN(0xbe82b099, 0x9394b8d3), TOBN(0x6830f09a, 0x16adfe83),
4478 TOBN(0x250a29b4, 0x88172d01), TOBN(0x8b20bd65, 0xcaff9e02),
4479 TOBN(0xb8a7661e, 0xe8a6329a), TOBN(0x4520304d, 0xd3fce920),
4480 TOBN(0xae45da1f, 0x2b47f7ef), TOBN(0xe07f5288, 0x5bffc540),
4481 TOBN(0xf7997009, 0x3464f874), TOBN(0x2244c2cd, 0xa6fa1f38),
4482 TOBN(0x43c41ac1, 0x94d7d9b1), TOBN(0x5bafdd82, 0xc82e7f17),
4483 TOBN(0xdf0614c1, 0x5fda0fca), TOBN(0x74b043a7, 0xa8ae37ad),
4484 TOBN(0x3ba6afa1, 0x9e71734c), TOBN(0x15d5437e, 0x9c450f2e),
4485 TOBN(0x4a5883fe, 0x67e242b1), TOBN(0x5143bdc2, 0x2c1953c2),
4486 TOBN(0x542b8b53, 0xfc5e8920), TOBN(0x363bf9a8, 0x9a9cee08),
4487 TOBN(0x02375f10, 0xc3486e08), TOBN(0x2037543b, 0x8c5e70d2),
4488 TOBN(0x7109bccc, 0x625640b4), TOBN(0xcbc1051e, 0x8bc62c3b),
4489 TOBN(0xf8455fed, 0x803f26ea), TOBN(0x6badceab, 0xeb372424),
4490 TOBN(0xa2a9ce7c, 0x6b53f5f9), TOBN(0x64246595, 0x1b176d99),
4491 TOBN(0xb1298d36, 0xb95c081b), TOBN(0x53505bb8, 0x1d9a9ee6),
4492 TOBN(0x3f6f9e61, 0xf2ba70b0), TOBN(0xd07e16c9, 0x8afad453),
4493 TOBN(0x9f1694bb, 0xe7eb4a6a), TOBN(0xdfebced9, 0x3cb0bc8e),
4494 TOBN(0x92d3dcdc, 0x53868c8b), TOBN(0x174311a2, 0x386107a6),
4495 TOBN(0x4109e07c, 0x689b4e64), TOBN(0x30e4587f, 0x2df3dcb6),
4496 TOBN(0x841aea31, 0x0811b3b2), TOBN(0x6144d41d, 0x0cce43ea),
4497 TOBN(0x464c4581, 0x2a9a7803), TOBN(0xd03d371f, 0x3e158930),
4498 TOBN(0xc676d7f2, 0xb1f3390b), TOBN(0x9f7a1b8c, 0xa5b61272),
4499 TOBN(0x4ebebfc9, 0xc2e127a9), TOBN(0x4602500c, 0x5dd997bf),
4500 TOBN(0x7f09771c, 0x4711230f), TOBN(0x058eb37c, 0x020f09c1),
4501 TOBN(0xab693d4b, 0xfee5e38b), TOBN(0x9289eb1f, 0x4653cbc0),
4502 TOBN(0xbecf46ab, 0xd51b9cf5), TOBN(0xd2aa9c02, 0x9f0121af),
4503 TOBN(0x36aaf7d2, 0xe90dc274), TOBN(0x909e4ea0, 0x48b95a3c),
4504 TOBN(0xe6b70496, 0x6f32dbdb), TOBN(0x672188a0, 0x8b030b3e),
4505 TOBN(0xeeffe5b3, 0xcfb617e2), TOBN(0x87e947de, 0x7c82709e),
4506 TOBN(0xa44d2b39, 0x1770f5a7), TOBN(0xe4d4d791, 0x0e44eb82),
4507 TOBN(0x42e69d1e, 0x3f69712a), TOBN(0xbf11c4d6, 0xac6a820e),
4508 TOBN(0xb5e7f3e5, 0x42c4224c), TOBN(0xd6b4e81c, 0x449d941c),
4509 TOBN(0x5d72bd16, 0x5450e878), TOBN(0x6a61e28a, 0xee25ac54),
4510 TOBN(0x33272094, 0xe6f1cd95), TOBN(0x7512f30d, 0x0d18673f),
4511 TOBN(0x32f7a4ca, 0x5afc1464), TOBN(0x2f095656, 0x6bbb977b),
4512 TOBN(0x586f47ca, 0xa8226200), TOBN(0x02c868ad, 0x1ac07369),
4513 TOBN(0x4ef2b845, 0xc613acbe), TOBN(0x43d7563e, 0x0386054c),
4514 TOBN(0x54da9dc7, 0xab952578), TOBN(0xb5423df2, 0x26e84d0b),
4515 TOBN(0xa8b64eeb, 0x9b872042), TOBN(0xac205782, 0x5990f6df),
4516 TOBN(0x4ff696eb, 0x21f4c77a), TOBN(0x1a79c3e4, 0xaab273af),
4517 TOBN(0x29bc922e, 0x9436b3f1), TOBN(0xff807ef8, 0xd6d9a27a),
4518 TOBN(0x82acea3d, 0x778f22a0), TOBN(0xfb10b2e8, 0x5b5e7469),
4519 TOBN(0xc0b16980, 0x2818ee7d), TOBN(0x011afff4, 0xc91c1a2f),
4520 TOBN(0x95a6d126, 0xad124418), TOBN(0x31c081a5, 0xe72e295f),
4521 TOBN(0x36bb283a, 0xf2f4db75), TOBN(0xd115540f, 0x7acef462),
4522 TOBN(0xc7f3a8f8, 0x33f6746c), TOBN(0x21e46f65, 0xfea990ca),
4523 TOBN(0x915fd5c5, 0xcaddb0a9), TOBN(0xbd41f016, 0x78614555),
4524 TOBN(0x346f4434, 0x426ffb58), TOBN(0x80559436, 0x14dbc204),
4525 TOBN(0xf3dd20fe, 0x5a969b7f), TOBN(0x9d59e956, 0xe899a39a),
4526 TOBN(0xf1b0971c, 0x8ad4cf4b), TOBN(0x03448860, 0x2ffb8fb8),
4527 TOBN(0xf071ac3c, 0x65340ba4), TOBN(0x408d0596, 0xb27fd758),
4528 TOBN(0xe7c78ea4, 0x98c364b0), TOBN(0xa4aac4a5, 0x051e8ab5),
4529 TOBN(0xb9e1d560, 0x485d9002), TOBN(0x9acd518a, 0x88844455),
4530 TOBN(0xe4ca688f, 0xd06f56c0), TOBN(0xa48af70d, 0xdf027972),
4531 TOBN(0x691f0f04, 0x5e9a609d), TOBN(0xa9dd82cd, 0xee61270e),
4532 TOBN(0x8903ca63, 0xa0ef18d3), TOBN(0x9fb7ee35, 0x3d6ca3bd),
4533 TOBN(0xa7b4a09c, 0xabf47d03), TOBN(0x4cdada01, 0x1c67de8e),
4534 TOBN(0x52003749, 0x9355a244), TOBN(0xe77fd2b6, 0x4f2151a9),
4535 TOBN(0x695d6cf6, 0x66b4efcb), TOBN(0xc5a0cacf, 0xda2cfe25),
4536 TOBN(0x104efe5c, 0xef811865), TOBN(0xf52813e8, 0x9ea5cc3d),
4537 TOBN(0x855683dc, 0x40b58dbc), TOBN(0x0338ecde, 0x175fcb11),
4538 TOBN(0xf9a05637, 0x74921592), TOBN(0xb4f1261d, 0xb9bb9d31),
4539 TOBN(0x551429b7, 0x4e9c5459), TOBN(0xbe182e6f, 0x6ea71f53),
4540 TOBN(0xd3a3b07c, 0xdfc50573), TOBN(0x9ba1afda, 0x62be8d44),
4541 TOBN(0x9bcfd2cb, 0x52ab65d3), TOBN(0xdf11d547, 0xa9571802),
4542 TOBN(0x099403ee, 0x02a2404a), TOBN(0x497406f4, 0x21088a71),
4543 TOBN(0x99479409, 0x5004ae71), TOBN(0xbdb42078, 0xa812c362),
4544 TOBN(0x2b72a30f, 0xd8828442), TOBN(0x283add27, 0xfcb5ed1c),
4545 TOBN(0xf7c0e200, 0x66a40015), TOBN(0x3e3be641, 0x08b295ef),
4546 TOBN(0xac127dc1, 0xe038a675), TOBN(0x729deff3, 0x8c5c6320),
4547 TOBN(0xb7df8fd4, 0xa90d2c53), TOBN(0x9b74b0ec, 0x681e7cd3),
4548 TOBN(0x5cb5a623, 0xdab407e5), TOBN(0xcdbd3615, 0x76b340c6),
4549 TOBN(0xa184415a, 0x7d28392c), TOBN(0xc184c1d8, 0xe96f7830),
4550 TOBN(0xc3204f19, 0x81d3a80f), TOBN(0xfde0c841, 0xc8e02432),
4551 TOBN(0x78203b3e, 0x8149e0c1), TOBN(0x5904bdbb, 0x08053a73),
4552 TOBN(0x30fc1dd1, 0x101b6805), TOBN(0x43c223bc, 0x49aa6d49),
4553 TOBN(0x9ed67141, 0x7a174087), TOBN(0x311469a0, 0xd5997008),
4554 TOBN(0xb189b684, 0x5e43fc61), TOBN(0xf3282375, 0xe0d3ab57),
4555 TOBN(0x4fa34b67, 0xb1181da8), TOBN(0x621ed0b2, 0x99ee52b8),
4556 TOBN(0x9b178de1, 0xad990676), TOBN(0xd51de67b, 0x56d54065),
4557 TOBN(0x2a2c27c4, 0x7538c201), TOBN(0x33856ec8, 0x38a40f5c),
4558 TOBN(0x2522fc15, 0xbe6cdcde), TOBN(0x1e603f33, 0x9f0c6f89),
4559 TOBN(0x7994edc3, 0x103e30a6), TOBN(0x033a00db, 0x220c853e),
4560 TOBN(0xd3cfa409, 0xf7bb7fd7), TOBN(0x70f8781e, 0x462d18f6),
4561 TOBN(0xbbd82980, 0x687fe295), TOBN(0x6eef4c32, 0x595669f3),
4562 TOBN(0x86a9303b, 0x2f7e85c3), TOBN(0x5fce4621, 0x71988f9b),
4563 TOBN(0x5b935bf6, 0xc138acb5), TOBN(0x30ea7d67, 0x25661212),
4564 TOBN(0xef1eb5f4, 0xe51ab9a2), TOBN(0x0587c98a, 0xae067c78),
4565 TOBN(0xb3ce1b3c, 0x77ca9ca6), TOBN(0x2a553d4d, 0x54b5f057),
4566 TOBN(0xc7898236, 0x4da29ec2), TOBN(0xdbdd5d13, 0xb9c57316),
4567 TOBN(0xc57d6e6b, 0x2cd80d47), TOBN(0x80b460cf, 0xfe9e7391),
4568 TOBN(0x98648cab, 0xf963c31e), TOBN(0x67f9f633, 0xcc4d32fd),
4569 TOBN(0x0af42a9d, 0xfdf7c687), TOBN(0x55f292a3, 0x0b015ea7),
4570 TOBN(0x89e468b2, 0xcd21ab3d), TOBN(0xe504f022, 0xc393d392),
4571 TOBN(0xab21e1d4, 0xa5013af9), TOBN(0xe3283f78, 0xc2c28acb),
4572 TOBN(0xf38b35f6, 0x226bf99f), TOBN(0xe8354274, 0x0e291e69),
4573 TOBN(0x61673a15, 0xb20c162d), TOBN(0xc101dc75, 0xb04fbdbe),
4574 TOBN(0x8323b4c2, 0x255bd617), TOBN(0x6c969693, 0x6c2a9154),
4575 TOBN(0xc6e65860, 0x62679387), TOBN(0x8e01db0c, 0xb8c88e23),
4576 TOBN(0x33c42873, 0x893a5559), TOBN(0x7630f04b, 0x47a3e149),
4577 TOBN(0xb5d80805, 0xddcf35f8), TOBN(0x582ca080, 0x77dfe732),
4578 TOBN(0x2c7156e1, 0x0b1894a0), TOBN(0x92034001, 0xd81c68c0),
4579 TOBN(0xed225d00, 0xc8b115b5), TOBN(0x237f9c22, 0x83b907f2),
4580 TOBN(0x0ea2f32f, 0x4470e2c0), TOBN(0xb725f7c1, 0x58be4e95),
4581 TOBN(0x0f1dcafa, 0xb1ae5463), TOBN(0x59ed5187, 0x1ba2fc04),
4582 TOBN(0xf6e0f316, 0xd0115d4d), TOBN(0x5180b12f, 0xd3691599),
4583 TOBN(0x157e32c9, 0x527f0a41), TOBN(0x7b0b081d, 0xa8e0ecc0),
4584 TOBN(0x6dbaaa8a, 0xbf4f0dd0), TOBN(0x99b289c7, 0x4d252696),
4585 TOBN(0x79b7755e, 0xdbf864fe), TOBN(0x6974e2b1, 0x76cad3ab),
4586 TOBN(0x35dbbee2, 0x06ddd657), TOBN(0xe7cbdd11, 0x2ff3a96d),
4587 TOBN(0x88381968, 0x076be758), TOBN(0x2d737e72, 0x08c91f5d),
4588 TOBN(0x5f83ab62, 0x86ec3776), TOBN(0x98aa649d, 0x945fa7a1),
4589 TOBN(0xf477ec37, 0x72ef0933), TOBN(0x66f52b1e, 0x098c17b1),
4590 TOBN(0x9eec58fb, 0xd803738b), TOBN(0x91aaade7, 0xe4e86aa4),
4591 TOBN(0x6b1ae617, 0xa5b51492), TOBN(0x63272121, 0xbbc45974),
4592 TOBN(0x7e0e28f0, 0x862c5129), TOBN(0x0a8f79a9, 0x3321a4a0),
4593 TOBN(0xe26d1664, 0x5041c88f), TOBN(0x0571b805, 0x53233e3a),
4594 TOBN(0xd1b0ccde, 0xc9520711), TOBN(0x55a9e4ed, 0x3c8b84bf),
4595 TOBN(0x9426bd39, 0xa1fef314), TOBN(0x4f5f638e, 0x6eb93f2b),
4596 TOBN(0xba2a1ed3, 0x2bf9341b), TOBN(0xd63c1321, 0x4d42d5a9),
4597 TOBN(0xd2964a89, 0x316dc7c5), TOBN(0xd1759606, 0xca511851),
4598 TOBN(0xd8a9201f, 0xf9e6ed35), TOBN(0xb7b5ee45, 0x6736925a),
4599 TOBN(0x0a83fbbc, 0x99581af7), TOBN(0x3076bc40, 0x64eeb051),
4600 TOBN(0x5511c98c, 0x02dec312), TOBN(0x270de898, 0x238dcb78),
4601 TOBN(0x2cf4cf9c, 0x539c08c9), TOBN(0xa70cb65e, 0x38d3b06e),
4602 TOBN(0xb12ec10e, 0xcfe57bbd), TOBN(0x82c7b656, 0x35a0c2b5),
4603 TOBN(0xddc7d5cd, 0x161c67bd), TOBN(0xe32e8985, 0xae3a32cc),
4604 TOBN(0x7aba9444, 0xd11a5529), TOBN(0xe964ed02, 0x2427fa1a),
4605 TOBN(0x1528392d, 0x24a1770a), TOBN(0xa152ce2c, 0x12c72fcd),
4606 TOBN(0x714553a4, 0x8ec07649), TOBN(0x18b4c290, 0x459dd453),
4607 TOBN(0xea32b714, 0x7b64b110), TOBN(0xb871bfa5, 0x2e6f07a2),
4608 TOBN(0xb67112e5, 0x9e2e3c9b), TOBN(0xfbf250e5, 0x44aa90f6),
4609 TOBN(0xf77aedb8, 0xbd539006), TOBN(0x3b0cdf9a, 0xd172a66f),
4610 TOBN(0xedf69fea, 0xf8c51187), TOBN(0x05bb67ec, 0x741e4da7),
4611 TOBN(0x47df0f32, 0x08114345), TOBN(0x56facb07, 0xbb9792b1),
4612 TOBN(0xf3e007e9, 0x8f6229e4), TOBN(0x62d103f4, 0x526fba0f),
4613 TOBN(0x4f33bef7, 0xb0339d79), TOBN(0x9841357b, 0xb59bfec1),
4614 TOBN(0xfa8dbb59, 0xc34e6705), TOBN(0xc3c7180b, 0x7fdaa84c),
4615 TOBN(0xf95872fc, 0xa4108537), TOBN(0x8750cc3b, 0x932a3e5a),
4616 TOBN(0xb61cc69d, 0xb7275d7d), TOBN(0xffa0168b, 0x2e59b2e9),
4617 TOBN(0xca032abc, 0x6ecbb493), TOBN(0x1d86dbd3, 0x2c9082d8),
4618 TOBN(0xae1e0b67, 0xe28ef5ba), TOBN(0x2c9a4699, 0xcb18e169),
4619 TOBN(0x0ecd0e33, 0x1e6bbd20), TOBN(0x571b360e, 0xaf5e81d2),
4620 TOBN(0xcd9fea58, 0x101c1d45), TOBN(0x6651788e, 0x18880452),
4621 TOBN(0xa9972635, 0x1f8dd446), TOBN(0x44bed022, 0xe37281d0),
4622 TOBN(0x094b2b2d, 0x33da525d), TOBN(0xf193678e, 0x13144fd8),
4623 TOBN(0xb8ab5ba4, 0xf4c1061d), TOBN(0x4343b5fa, 0xdccbe0f4),
4624 TOBN(0xa8702371, 0x63812713), TOBN(0x47bf6d2d, 0xf7611d93),
4625 TOBN(0x46729b8c, 0xbd21e1d7), TOBN(0x7484d4e0, 0xd629e77d),
4626 TOBN(0x830e6eea, 0x60dbac1f), TOBN(0x23d8c484, 0xda06a2f7),
4627 TOBN(0x896714b0, 0x50ca535b), TOBN(0xdc8d3644, 0xebd97a9b),
4628 TOBN(0x106ef9fa, 0xb12177b4), TOBN(0xf79bf464, 0x534d5d9c),
4629 TOBN(0x2537a349, 0xa6ab360b), TOBN(0xc7c54253, 0xa00c744f),
4630 TOBN(0xb3c7a047, 0xe5911a76), TOBN(0x61ffa5c8, 0x647f1ee7),
4631 TOBN(0x15aed36f, 0x8f56ab42), TOBN(0x6a0d41b0, 0xa3ff9ac9),
4632 TOBN(0x68f469f5, 0xcc30d357), TOBN(0xbe9adf81, 0x6b72be96),
4633 TOBN(0x1cd926fe, 0x903ad461), TOBN(0x7e89e38f, 0xcaca441b),
4634 TOBN(0xf0f82de5, 0xfacf69d4), TOBN(0x363b7e76, 0x4775344c),
4635 TOBN(0x6894f312, 0xb2e36d04), TOBN(0x3c6cb4fe, 0x11d1c9a5),
4636 TOBN(0x85d9c339, 0x4008e1f2), TOBN(0x5e9a85ea, 0x249f326c),
4637 TOBN(0xdc35c60a, 0x678c5e06), TOBN(0xc08b944f, 0x9f86fba9),
4638 TOBN(0xde40c02c, 0x89f71f0f), TOBN(0xad8f3e31, 0xff3da3c0),
4639 TOBN(0x3ea5096b, 0x42125ded), TOBN(0x13879cbf, 0xa7379183),
4640 TOBN(0x6f4714a5, 0x6b306a0b), TOBN(0x359c2ea6, 0x67646c5e),
4641 TOBN(0xfacf8943, 0x07726368), TOBN(0x07a58935, 0x65ff431e),
4642 TOBN(0x24d661d1, 0x68754ab0), TOBN(0x801fce1d, 0x6f429a76),
4643 TOBN(0xc068a85f, 0xa58ce769), TOBN(0xedc35c54, 0x5d5eca2b),
4644 TOBN(0xea31276f, 0xa3f660d1), TOBN(0xa0184ebe, 0xb8fc7167),
4645 TOBN(0x0f20f21a, 0x1d8db0ae), TOBN(0xd96d095f, 0x56c35e12),
4646 TOBN(0xedf402b5, 0xf8c2a25b), TOBN(0x1bb772b9, 0x059204b6),
4647 TOBN(0x50cbeae2, 0x19b4e34c), TOBN(0x93109d80, 0x3fa0845a),
4648 TOBN(0x54f7ccf7, 0x8ef59fb5), TOBN(0x3b438fe2, 0x88070963),
4649 TOBN(0x9e28c659, 0x31f3ba9b), TOBN(0x9cc31b46, 0xead9da92),
4650 TOBN(0x3c2f0ba9, 0xb733aa5f), TOBN(0xdece47cb, 0xf05af235),
4651 TOBN(0xf8e3f715, 0xa2ac82a5), TOBN(0xc97ba641, 0x2203f18a),
4652 TOBN(0xc3af5504, 0x09c11060), TOBN(0x56ea2c05, 0x46af512d),
4653 TOBN(0xfac28daf, 0xf3f28146), TOBN(0x87fab43a, 0x959ef494),
4654 },
4655 {
4656 TOBN(0x09891641, 0xd4c5105f), TOBN(0x1ae80f8e, 0x6d7fbd65),
4657 TOBN(0x9d67225f, 0xbee6bdb0), TOBN(0x3b433b59, 0x7fc4d860),
4658 TOBN(0x44e66db6, 0x93e85638), TOBN(0xf7b59252, 0xe3e9862f),
4659 TOBN(0xdb785157, 0x665c32ec), TOBN(0x702fefd7, 0xae362f50),
4660 TOBN(0x3754475d, 0x0fefb0c3), TOBN(0xd48fb56b, 0x46d7c35d),
4661 TOBN(0xa070b633, 0x363798a4), TOBN(0xae89f3d2, 0x8fdb98e6),
4662 TOBN(0x970b89c8, 0x6363d14c), TOBN(0x89817521, 0x67abd27d),
4663 TOBN(0x9bf7d474, 0x44d5a021), TOBN(0xb3083baf, 0xcac72aee),
4664 TOBN(0x389741de, 0xbe949a44), TOBN(0x638e9388, 0x546a4fa5),
4665 TOBN(0x3fe6419c, 0xa0047bdc), TOBN(0x7047f648, 0xaaea57ca),
4666 TOBN(0x54e48a90, 0x41fbab17), TOBN(0xda8e0b28, 0x576bdba2),
4667 TOBN(0xe807eebc, 0xc72afddc), TOBN(0x07d3336d, 0xf42577bf),
4668 TOBN(0x62a8c244, 0xbfe20925), TOBN(0x91c19ac3, 0x8fdce867),
4669 TOBN(0x5a96a5d5, 0xdd387063), TOBN(0x61d587d4, 0x21d324f6),
4670 TOBN(0xe87673a2, 0xa37173ea), TOBN(0x23848008, 0x53778b65),
4671 TOBN(0x10f8441e, 0x05bab43e), TOBN(0xfa11fe12, 0x4621efbe),
4672 TOBN(0x047b772e, 0x81685d7b), TOBN(0x23f27d81, 0xbf34a976),
4673 TOBN(0xc27608e2, 0x915f48ef), TOBN(0x3b0b43fa, 0xa521d5c3),
4674 TOBN(0x7613fb26, 0x63ca7284), TOBN(0x7f5729b4, 0x1d4db837),
4675 TOBN(0x87b14898, 0x583b526b), TOBN(0x00b732a6, 0xbbadd3d1),
4676 TOBN(0x8e02f426, 0x2048e396), TOBN(0x436b50b6, 0x383d9de4),
4677 TOBN(0xf78d3481, 0x471e85ad), TOBN(0x8b01ea6a, 0xd005c8d6),
4678 TOBN(0xd3c7afee, 0x97015c07), TOBN(0x46cdf1a9, 0x4e3ba2ae),
4679 TOBN(0x7a42e501, 0x83d3a1d2), TOBN(0xd54b5268, 0xb541dff4),
4680 TOBN(0x3f24cf30, 0x4e23e9bc), TOBN(0x4387f816, 0x126e3624),
4681 TOBN(0x26a46a03, 0x3b0b6d61), TOBN(0xaf1bc845, 0x8b2d777c),
4682 TOBN(0x25c401ba, 0x527de79c), TOBN(0x0e1346d4, 0x4261bbb6),
4683 TOBN(0x4b96c44b, 0x287b4bc7), TOBN(0x658493c7, 0x5254562f),
4684 TOBN(0x23f949fe, 0xb8a24a20), TOBN(0x17ebfed1, 0xf52ca53f),
4685 TOBN(0x9b691bbe, 0xbcfb4853), TOBN(0x5617ff6b, 0x6278a05d),
4686 TOBN(0x241b34c5, 0xe3c99ebd), TOBN(0xfc64242e, 0x1784156a),
4687 TOBN(0x4206482f, 0x695d67df), TOBN(0xb967ce0e, 0xee27c011),
4688 TOBN(0x65db3751, 0x21c80b5d), TOBN(0x2e7a563c, 0xa31ecca0),
4689 TOBN(0xe56ffc4e, 0x5238a07e), TOBN(0x3d6c2966, 0x32ced854),
4690 TOBN(0xe99d7d1a, 0xaf70b885), TOBN(0xafc3bad9, 0x2d686459),
4691 TOBN(0x9c78bf46, 0x0cc8ba5b), TOBN(0x5a439519, 0x18955aa3),
4692 TOBN(0xf8b517a8, 0x5fe4e314), TOBN(0xe60234d0, 0xfcb8906f),
4693 TOBN(0xffe542ac, 0xf2061b23), TOBN(0x287e191f, 0x6b4cb59c),
4694 TOBN(0x21857ddc, 0x09d877d8), TOBN(0x1c23478c, 0x14678941),
4695 TOBN(0xbbf0c056, 0xb6e05ea4), TOBN(0x82da4b53, 0xb01594fe),
4696 TOBN(0xf7526791, 0xfadb8608), TOBN(0x049e832d, 0x7b74cdf6),
4697 TOBN(0xa43581cc, 0xc2b90a34), TOBN(0x73639eb8, 0x9360b10c),
4698 TOBN(0x4fba331f, 0xe1e4a71b), TOBN(0x6ffd6b93, 0x8072f919),
4699 TOBN(0x6e53271c, 0x65679032), TOBN(0x67206444, 0xf14272ce),
4700 TOBN(0xc0f734a3, 0xb2335834), TOBN(0x9526205a, 0x90ef6860),
4701 TOBN(0xcb8be717, 0x04e2bb0d), TOBN(0x2418871e, 0x02f383fa),
4702 TOBN(0xd7177681, 0x4082c157), TOBN(0xcc914ad0, 0x29c20073),
4703 TOBN(0xf186c1eb, 0xe587e728), TOBN(0x6fdb3c22, 0x61bcd5fd),
4704 TOBN(0x30d014a6, 0xf2f9f8e9), TOBN(0x963ece23, 0x4fec49d2),
4705 TOBN(0x862025c5, 0x9605a8d9), TOBN(0x39874445, 0x19f8929a),
4706 TOBN(0x01b6ff65, 0x12bf476a), TOBN(0x598a64d8, 0x09cf7d91),
4707 TOBN(0xd7ec7749, 0x93be56ca), TOBN(0x10899785, 0xcbb33615),
4708 TOBN(0xb8a092fd, 0x02eee3ad), TOBN(0xa86b3d35, 0x30145270),
4709 TOBN(0x323d98c6, 0x8512b675), TOBN(0x4b8bc785, 0x62ebb40f),
4710 TOBN(0x7d301f54, 0x413f9cde), TOBN(0xa5e4fb4f, 0x2bab5664),
4711 TOBN(0x1d2b252d, 0x1cbfec23), TOBN(0xfcd576bb, 0xe177120d),
4712 TOBN(0x04427d3e, 0x83731a34), TOBN(0x2bb9028e, 0xed836e8e),
4713 TOBN(0xb36acff8, 0xb612ca7c), TOBN(0xb88fe5ef, 0xd3d9c73a),
4714 TOBN(0xbe2a6bc6, 0xedea4eb3), TOBN(0x43b93133, 0x488eec77),
4715 TOBN(0xf41ff566, 0xb17106e1), TOBN(0x469e9172, 0x654efa32),
4716 TOBN(0xb4480f04, 0x41c23fa3), TOBN(0xb4712eb0, 0xc1989a2e),
4717 TOBN(0x3ccbba0f, 0x93a29ca7), TOBN(0x6e205c14, 0xd619428c),
4718 TOBN(0x90db7957, 0xb3641686), TOBN(0x0432691d, 0x45ac8b4e),
4719 TOBN(0x07a759ac, 0xf64e0350), TOBN(0x0514d89c, 0x9c972517),
4720 TOBN(0x1701147f, 0xa8e67fc3), TOBN(0x9e2e0b8b, 0xab2085be),
4721 TOBN(0xd5651824, 0xac284e57), TOBN(0x890d4325, 0x74893664),
4722 TOBN(0x8a7c5e6e, 0xc55e68a3), TOBN(0xbf12e90b, 0x4339c85a),
4723 TOBN(0x31846b85, 0xf922b655), TOBN(0x9a54ce4d, 0x0bf4d700),
4724 TOBN(0xd7f4e83a, 0xf1a14295), TOBN(0x916f955c, 0xb285d4f9),
4725 TOBN(0xe57bb0e0, 0x99ffdaba), TOBN(0x28a43034, 0xeab0d152),
4726 TOBN(0x0a36ffa2, 0xb8a9cef8), TOBN(0x5517407e, 0xb9ec051a),
4727 TOBN(0x9c796096, 0xea68e672), TOBN(0x853db5fb, 0xfb3c77fb),
4728 TOBN(0x21474ba9, 0xe864a51a), TOBN(0x6c267699, 0x6e8a1b8b),
4729 TOBN(0x7c823626, 0x94120a28), TOBN(0xe61e9a48, 0x8383a5db),
4730 TOBN(0x7dd75003, 0x9f84216d), TOBN(0xab020d07, 0xad43cd85),
4731 TOBN(0x9437ae48, 0xda12c659), TOBN(0x6449c2eb, 0xe65452ad),
4732 TOBN(0xcc7c4c1c, 0x2cf9d7c1), TOBN(0x1320886a, 0xee95e5ab),
4733 TOBN(0xbb7b9056, 0xbeae170c), TOBN(0xc8a5b250, 0xdbc0d662),
4734 TOBN(0x4ed81432, 0xc11d2303), TOBN(0x7da66912, 0x1f03769f),
4735 TOBN(0x3ac7a5fd, 0x84539828), TOBN(0x14dada94, 0x3bccdd02),
4736 TOBN(0x8b84c321, 0x7ef6b0d1), TOBN(0x52a9477a, 0x7c933f22),
4737 TOBN(0x5ef6728a, 0xfd440b82), TOBN(0x5c3bd859, 0x6ce4bd5e),
4738 TOBN(0x918b80f5, 0xf22c2d3e), TOBN(0x368d5040, 0xb7bb6cc5),
4739 TOBN(0xb66142a1, 0x2695a11c), TOBN(0x60ac583a, 0xeb19ea70),
4740 TOBN(0x317cbb98, 0x0eab2437), TOBN(0x8cc08c55, 0x5e2654c8),
4741 TOBN(0xfe2d6520, 0xe6d8307f), TOBN(0xe9f147f3, 0x57428993),
4742 TOBN(0x5f9c7d14, 0xd2fd6cf1), TOBN(0xa3ecd064, 0x2d4fcbb0),
4743 TOBN(0xad83fef0, 0x8e7341f7), TOBN(0x643f23a0, 0x3a63115c),
4744 TOBN(0xd38a78ab, 0xe65ab743), TOBN(0xbf7c75b1, 0x35edc89c),
4745 TOBN(0x3dd8752e, 0x530df568), TOBN(0xf85c4a76, 0xe308c682),
4746 TOBN(0x4c9955b2, 0xe68acf37), TOBN(0xa544df3d, 0xab32af85),
4747 TOBN(0x4b8ec3f5, 0xa25cf493), TOBN(0x4d8f2764, 0x1a622feb),
4748 TOBN(0x7bb4f7aa, 0xf0dcbc49), TOBN(0x7de551f9, 0x70bbb45b),
4749 TOBN(0xcfd0f3e4, 0x9f2ca2e5), TOBN(0xece58709, 0x1f5c76ef),
4750 TOBN(0x32920edd, 0x167d79ae), TOBN(0x039df8a2, 0xfa7d7ec1),
4751 TOBN(0xf46206c0, 0xbb30af91), TOBN(0x1ff5e2f5, 0x22676b59),
4752 TOBN(0x11f4a039, 0x6ea51d66), TOBN(0x506c1445, 0x807d7a26),
4753 TOBN(0x60da5705, 0x755a9b24), TOBN(0x8fc8cc32, 0x1f1a319e),
4754 TOBN(0x83642d4d, 0x9433d67d), TOBN(0x7fa5cb8f, 0x6a7dd296),
4755 TOBN(0x576591db, 0x9b7bde07), TOBN(0x13173d25, 0x419716fb),
4756 TOBN(0xea30599d, 0xd5b340ff), TOBN(0xfc6b5297, 0xb0fe76c5),
4757 TOBN(0x1c6968c8, 0xab8f5adc), TOBN(0xf723c7f5, 0x901c928d),
4758 TOBN(0x4203c321, 0x9773d402), TOBN(0xdf7c6aa3, 0x1b51dd47),
4759 TOBN(0x3d49e37a, 0x552be23c), TOBN(0x57febee8, 0x0b5a6e87),
4760 TOBN(0xc5ecbee4, 0x7bd8e739), TOBN(0x79d44994, 0xae63bf75),
4761 TOBN(0x168bd00f, 0x38fb8923), TOBN(0x75d48ee4, 0xd0533130),
4762 TOBN(0x554f77aa, 0xdb5cdf33), TOBN(0x3396e896, 0x3c696769),
4763 TOBN(0x2fdddbf2, 0xd3fd674e), TOBN(0xbbb8f6ee, 0x99d0e3e5),
4764 TOBN(0x51b90651, 0xcbae2f70), TOBN(0xefc4bc05, 0x93aaa8eb),
4765 TOBN(0x8ecd8689, 0xdd1df499), TOBN(0x1aee99a8, 0x22f367a5),
4766 TOBN(0x95d485b9, 0xae8274c5), TOBN(0x6c14d445, 0x7d30b39c),
4767 TOBN(0xbafea90b, 0xbcc1ef81), TOBN(0x7c5f317a, 0xa459a2ed),
4768 TOBN(0x01211075, 0x4ef44227), TOBN(0xa17bed6e, 0xdc20f496),
4769 TOBN(0x0cdfe424, 0x819853cd), TOBN(0x13793298, 0xf71e2ce7),
4770 TOBN(0x3c1f3078, 0xdbbe307b), TOBN(0x6dd1c20e, 0x76ee9936),
4771 TOBN(0x23ee4b57, 0x423caa20), TOBN(0x4ac3793b, 0x8efb840e),
4772 TOBN(0x934438eb, 0xed1f8ca0), TOBN(0x3e546658, 0x4ebb25a2),
4773 TOBN(0xc415af0e, 0xc069896f), TOBN(0xc13eddb0, 0x9a5aa43d),
4774 TOBN(0x7a04204f, 0xd49eb8f6), TOBN(0xd0d5bdfc, 0xd74f1670),
4775 TOBN(0x3697e286, 0x56fc0558), TOBN(0x10207371, 0x01cebade),
4776 TOBN(0x5f87e690, 0x0647a82b), TOBN(0x908e0ed4, 0x8f40054f),
4777 TOBN(0xa9f633d4, 0x79853803), TOBN(0x8ed13c9a, 0x4a28b252),
4778 TOBN(0x3e2ef676, 0x1f460f64), TOBN(0x53930b9b, 0x36d06336),
4779 TOBN(0x347073ac, 0x8fc4979b), TOBN(0x84380e0e, 0x5ecd5597),
4780 TOBN(0xe3b22c6b, 0xc4fe3c39), TOBN(0xba4a8153, 0x6c7bebdf),
4781 TOBN(0xf23ab6b7, 0x25693459), TOBN(0x53bc3770, 0x14922b11),
4782 TOBN(0x4645c8ab, 0x5afc60db), TOBN(0xaa022355, 0x20b9f2a3),
4783 TOBN(0x52a2954c, 0xce0fc507), TOBN(0x8c2731bb, 0x7ce1c2e7),
4784 TOBN(0xf39608ab, 0x18a0339d), TOBN(0xac7a658d, 0x3735436c),
4785 TOBN(0xb22c2b07, 0xcd992b4f), TOBN(0x4e83daec, 0xf40dcfd4),
4786 TOBN(0x8a34c7be, 0x2f39ea3e), TOBN(0xef0c005f, 0xb0a56d2e),
4787 TOBN(0x62731f6a, 0x6edd8038), TOBN(0x5721d740, 0x4e3cb075),
4788 TOBN(0x1ea41511, 0xfbeeee1b), TOBN(0xd1ef5e73, 0xef1d0c05),
4789 TOBN(0x42feefd1, 0x73c07d35), TOBN(0xe530a00a, 0x8a329493),
4790 TOBN(0x5d55b7fe, 0xf15ebfb0), TOBN(0x549de03c, 0xd322491a),
4791 TOBN(0xf7b5f602, 0x745b3237), TOBN(0x3632a3a2, 0x1ab6e2b6),
4792 TOBN(0x0d3bba89, 0x0ef59f78), TOBN(0x0dfc6443, 0xc9e52b9a),
4793 TOBN(0x1dc79699, 0x72631447), TOBN(0xef033917, 0xb3be20b1),
4794 TOBN(0x0c92735d, 0xb1383948), TOBN(0xc1fc29a2, 0xc0dd7d7d),
4795 TOBN(0x6485b697, 0x403ed068), TOBN(0x13bfaab3, 0xaac93bdc),
4796 TOBN(0x410dc6a9, 0x0deeaf52), TOBN(0xb003fb02, 0x4c641c15),
4797 TOBN(0x1384978c, 0x5bc504c4), TOBN(0x37640487, 0x864a6a77),
4798 TOBN(0x05991bc6, 0x222a77da), TOBN(0x62260a57, 0x5e47eb11),
4799 TOBN(0xc7af6613, 0xf21b432c), TOBN(0x22f3acc9, 0xab4953e9),
4800 TOBN(0x52934922, 0x8e41d155), TOBN(0x4d024568, 0x3ac059ef),
4801 TOBN(0xb0201755, 0x4d884411), TOBN(0xce8055cf, 0xa59a178f),
4802 TOBN(0xcd77d1af, 0xf6204549), TOBN(0xa0a00a3e, 0xc7066759),
4803 TOBN(0x471071ef, 0x0272c229), TOBN(0x009bcf6b, 0xd3c4b6b0),
4804 TOBN(0x2a2638a8, 0x22305177), TOBN(0xd51d59df, 0x41645bbf),
4805 TOBN(0xa81142fd, 0xc0a7a3c0), TOBN(0xa17eca6d, 0x4c7063ee),
4806 TOBN(0x0bb887ed, 0x60d9dcec), TOBN(0xd6d28e51, 0x20ad2455),
4807 TOBN(0xebed6308, 0xa67102ba), TOBN(0x042c3114, 0x8bffa408),
4808 TOBN(0xfd099ac5, 0x8aa68e30), TOBN(0x7a6a3d7c, 0x1483513e),
4809 TOBN(0xffcc6b75, 0xba2d8f0c), TOBN(0x54dacf96, 0x1e78b954),
4810 TOBN(0xf645696f, 0xa4a9af89), TOBN(0x3a411940, 0x06ac98ec),
4811 TOBN(0x41b8b3f6, 0x22a67a20), TOBN(0x2d0b1e0f, 0x99dec626),
4812 TOBN(0x27c89192, 0x40be34e8), TOBN(0xc7162b37, 0x91907f35),
4813 TOBN(0x90188ec1, 0xa956702b), TOBN(0xca132f7d, 0xdf93769c),
4814 TOBN(0x3ece44f9, 0x0e2025b4), TOBN(0x67aaec69, 0x0c62f14c),
4815 TOBN(0xad741418, 0x22e3cc11), TOBN(0xcf9b75c3, 0x7ff9a50e),
4816 TOBN(0x02fa2b16, 0x4d348272), TOBN(0xbd99d61a, 0x9959d56d),
4817 TOBN(0xbc4f19db, 0x18762916), TOBN(0xcc7cce50, 0x49c1ac80),
4818 TOBN(0x4d59ebaa, 0xd846bd83), TOBN(0x8775a9dc, 0xa9202849),
4819 TOBN(0x07ec4ae1, 0x6e1f4ca9), TOBN(0x27eb5875, 0xba893f11),
4820 TOBN(0x00284d51, 0x662cc565), TOBN(0x82353a6b, 0x0db4138d),
4821 TOBN(0xd9c7aaaa, 0xaa32a594), TOBN(0xf5528b5e, 0xa5669c47),
4822 TOBN(0xf3220231, 0x2f23c5ff), TOBN(0xe3e8147a, 0x6affa3a1),
4823 TOBN(0xfb423d5c, 0x202ddda0), TOBN(0x3d6414ac, 0x6b871bd4),
4824 TOBN(0x586f82e1, 0xa51a168a), TOBN(0xb712c671, 0x48ae5448),
4825 TOBN(0x9a2e4bd1, 0x76233eb8), TOBN(0x0188223a, 0x78811ca9),
4826 TOBN(0x553c5e21, 0xf7c18de1), TOBN(0x7682e451, 0xb27bb286),
4827 TOBN(0x3ed036b3, 0x0e51e929), TOBN(0xf487211b, 0xec9cb34f),
4828 TOBN(0x0d094277, 0x0c24efc8), TOBN(0x0349fd04, 0xbef737a4),
4829 TOBN(0x6d1c9dd2, 0x514cdd28), TOBN(0x29c135ff, 0x30da9521),
4830 TOBN(0xea6e4508, 0xf78b0b6f), TOBN(0x176f5dd2, 0x678c143c),
4831 TOBN(0x08148418, 0x4be21e65), TOBN(0x27f7525c, 0xe7df38c4),
4832 TOBN(0x1fb70e09, 0x748ab1a4), TOBN(0x9cba50a0, 0x5efe4433),
4833 TOBN(0x7846c7a6, 0x15f75af2), TOBN(0x2a7c2c57, 0x5ee73ea8),
4834 TOBN(0x42e566a4, 0x3f0a449a), TOBN(0x45474c3b, 0xad90fc3d),
4835 TOBN(0x7447be3d, 0x8b61d057), TOBN(0x3e9d1cf1, 0x3a4ec092),
4836 TOBN(0x1603e453, 0xf380a6e6), TOBN(0x0b86e431, 0x9b1437c2),
4837 TOBN(0x7a4173f2, 0xef29610a), TOBN(0x8fa729a7, 0xf03d57f7),
4838 TOBN(0x3e186f6e, 0x6c9c217e), TOBN(0xbe1d3079, 0x91919524),
4839 TOBN(0x92a62a70, 0x153d4fb1), TOBN(0x32ed3e34, 0xd68c2f71),
4840 TOBN(0xd785027f, 0x9eb1a8b7), TOBN(0xbc37eb77, 0xc5b22fe8),
4841 TOBN(0x466b34f0, 0xb9d6a191), TOBN(0x008a89af, 0x9a05f816),
4842 TOBN(0x19b028fb, 0x7d42c10a), TOBN(0x7fe8c92f, 0x49b3f6b8),
4843 TOBN(0x58907cc0, 0xa5a0ade3), TOBN(0xb3154f51, 0x559d1a7c),
4844 TOBN(0x5066efb6, 0xd9790ed6), TOBN(0xa77a0cbc, 0xa6aa793b),
4845 TOBN(0x1a915f3c, 0x223e042e), TOBN(0x1c5def04, 0x69c5874b),
4846 TOBN(0x0e830078, 0x73b6c1da), TOBN(0x55cf85d2, 0xfcd8557a),
4847 TOBN(0x0f7c7c76, 0x0460f3b1), TOBN(0x87052acb, 0x46e58063),
4848 TOBN(0x09212b80, 0x907eae66), TOBN(0x3cb068e0, 0x4d721c89),
4849 TOBN(0xa87941ae, 0xdd45ac1c), TOBN(0xde8d5c0d, 0x0daa0dbb),
4850 TOBN(0xda421fdc, 0xe3502e6e), TOBN(0xc8944201, 0x4d89a084),
4851 TOBN(0x7307ba5e, 0xf0c24bfb), TOBN(0xda212beb, 0x20bde0ef),
4852 TOBN(0xea2da24b, 0xf82ce682), TOBN(0x058d3816, 0x07f71fe4),
4853 TOBN(0x35a02462, 0x5ffad8de), TOBN(0xcd7b05dc, 0xaadcefab),
4854 TOBN(0xd442f8ed, 0x1d9f54ec), TOBN(0x8be3d618, 0xb2d3b5ca),
4855 TOBN(0xe2220ed0, 0xe06b2ce2), TOBN(0x82699a5f, 0x1b0da4c0),
4856 TOBN(0x3ff106f5, 0x71c0c3a7), TOBN(0x8f580f5a, 0x0d34180c),
4857 TOBN(0x4ebb120e, 0x22d7d375), TOBN(0x5e5782cc, 0xe9513675),
4858 TOBN(0x2275580c, 0x99c82a70), TOBN(0xe8359fbf, 0x15ea8c4c),
4859 TOBN(0x53b48db8, 0x7b415e70), TOBN(0xaacf2240, 0x100c6014),
4860 TOBN(0x9faaccf5, 0xe4652f1d), TOBN(0xbd6fdd2a, 0xd56157b2),
4861 TOBN(0xa4f4fb1f, 0x6261ec50), TOBN(0x244e55ad, 0x476bcd52),
4862 TOBN(0x881c9305, 0x047d320b), TOBN(0x1ca983d5, 0x6181263f),
4863 TOBN(0x354e9a44, 0x278fb8ee), TOBN(0xad2dbc0f, 0x396e4964),
4864 TOBN(0x723f3aa2, 0x9268b3de), TOBN(0x0d1ca29a, 0xe6e0609a),
4865 TOBN(0x794866aa, 0x6cf44252), TOBN(0x0b59f3e3, 0x01af87ed),
4866 TOBN(0xe234e5ff, 0x7f4a6c51), TOBN(0xa8768fd2, 0x61dc2f7e),
4867 TOBN(0xdafc7332, 0x0a94d81f), TOBN(0xd7f84282, 0x06938ce1),
4868 TOBN(0xae0b3c0e, 0x0546063e), TOBN(0x7fbadcb2, 0x5d61abc6),
4869 TOBN(0xd5d7a2c9, 0x369ac400), TOBN(0xa5978d09, 0xae67d10c),
4870 TOBN(0x290f211e, 0x4f85eaac), TOBN(0xe61e2ad1, 0xfacac681),
4871 TOBN(0xae125225, 0x388384cd), TOBN(0xa7fb68e9, 0xccfde30f),
4872 TOBN(0x7a59b936, 0x3daed4c2), TOBN(0x80a9aa40, 0x2606f789),
4873 TOBN(0xb40c1ea5, 0xf6a6d90a), TOBN(0x948364d3, 0x514d5885),
4874 TOBN(0x062ebc60, 0x70985182), TOBN(0xa6db5b0e, 0x33310895),
4875 TOBN(0x64a12175, 0xe329c2f5), TOBN(0xc5f25bd2, 0x90ea237e),
4876 TOBN(0x7915c524, 0x2d0a4c23), TOBN(0xeb5d26e4, 0x6bb3cc52),
4877 TOBN(0x369a9116, 0xc09e2c92), TOBN(0x0c527f92, 0xcf182cf8),
4878 TOBN(0x9e591938, 0x2aede0ac), TOBN(0xb2922208, 0x6cc34939),
4879 TOBN(0x3c9d8962, 0x99a34361), TOBN(0x3c81836d, 0xc1905fe6),
4880 TOBN(0x4bfeb57f, 0xa001ec5a), TOBN(0xe993f5bb, 0xa0dc5dba),
4881 TOBN(0x47884109, 0x724a1380), TOBN(0x8a0369ab, 0x32fe9a04),
4882 TOBN(0xea068d60, 0x8c927db8), TOBN(0xbf5f37cf, 0x94655741),
4883 TOBN(0x47d402a2, 0x04b6c7ea), TOBN(0x4551c295, 0x6af259cb),
4884 TOBN(0x698b71e7, 0xed77ee8b), TOBN(0xbddf7bd0, 0xf309d5c7),
4885 TOBN(0x6201c22c, 0x34e780ca), TOBN(0xab04f7d8, 0x4c295ef4),
4886 TOBN(0x1c947294, 0x4313a8ce), TOBN(0xe532e4ac, 0x92ca4cfe),
4887 TOBN(0x89738f80, 0xd0a7a97a), TOBN(0xec088c88, 0xa580fd5b),
4888 TOBN(0x612b1ecc, 0x42ce9e51), TOBN(0x8f9840fd, 0xb25fdd2a),
4889 TOBN(0x3cda78c0, 0x01e7f839), TOBN(0x546b3d3a, 0xece05480),
4890 TOBN(0x271719a9, 0x80d30916), TOBN(0x45497107, 0x584c20c4),
4891 TOBN(0xaf8f9478, 0x5bc78608), TOBN(0x28c7d484, 0x277e2a4c),
4892 TOBN(0xfce01767, 0x88a2ffe4), TOBN(0xdc506a35, 0x28e169a5),
4893 TOBN(0x0ea10861, 0x7af9c93a), TOBN(0x1ed24361, 0x03fa0e08),
4894 TOBN(0x96eaaa92, 0xa3d694e7), TOBN(0xc0f43b4d, 0xef50bc74),
4895 TOBN(0xce6aa58c, 0x64114db4), TOBN(0x8218e8ea, 0x7c000fd4),
4896 TOBN(0xac815dfb, 0x185f8844), TOBN(0xcd7e90cb, 0x1557abfb),
4897 TOBN(0x23d16655, 0xafbfecdf), TOBN(0x80f3271f, 0x085cac4a),
4898 TOBN(0x7fc39aa7, 0xd0e62f47), TOBN(0x88d519d1, 0x460a48e5),
4899 TOBN(0x59559ac4, 0xd28f101e), TOBN(0x7981d9e9, 0xca9ae816),
4900 TOBN(0x5c38652c, 0x9ac38203), TOBN(0x86eaf87f, 0x57657fe5),
4901 TOBN(0x568fc472, 0xe21f5416), TOBN(0x2afff39c, 0xe7e597b5),
4902 TOBN(0x3adbbb07, 0x256d4eab), TOBN(0x22598692, 0x8285ab89),
4903 TOBN(0x35f8112a, 0x041caefe), TOBN(0x95df02e3, 0xa5064c8b),
4904 TOBN(0x4d63356e, 0xc7004bf3), TOBN(0x230a08f4, 0xdb83c7de),
4905 TOBN(0xca27b270, 0x8709a7b7), TOBN(0x0d1c4cc4, 0xcb9abd2d),
4906 TOBN(0x8a0bc66e, 0x7550fee8), TOBN(0x369cd4c7, 0x9cf7247e),
4907 TOBN(0x75562e84, 0x92b5b7e7), TOBN(0x8fed0da0, 0x5802af7b),
4908 TOBN(0x6a7091c2, 0xe48fb889), TOBN(0x26882c13, 0x7b8a9d06),
4909 TOBN(0xa2498663, 0x1b82a0e2), TOBN(0x844ed736, 0x3518152d),
4910 TOBN(0x282f476f, 0xd86e27c7), TOBN(0xa04edaca, 0x04afefdc),
4911 TOBN(0x8b256ebc, 0x6119e34d), TOBN(0x56a413e9, 0x0787d78b),
4912 },
4913 {
4914 TOBN(0x82ee061d, 0x5a74be50), TOBN(0xe41781c4, 0xdea16ff5),
4915 TOBN(0xe0b0c81e, 0x99bfc8a2), TOBN(0x624f4d69, 0x0b547e2d),
4916 TOBN(0x3a83545d, 0xbdcc9ae4), TOBN(0x2573dbb6, 0x409b1e8e),
4917 TOBN(0x482960c4, 0xa6c93539), TOBN(0xf01059ad, 0x5ae18798),
4918 TOBN(0x715c9f97, 0x3112795f), TOBN(0xe8244437, 0x984e6ee1),
4919 TOBN(0x55cb4858, 0xecb66bcd), TOBN(0x7c136735, 0xabaffbee),
4920 TOBN(0x54661595, 0x5dbec38e), TOBN(0x51c0782c, 0x388ad153),
4921 TOBN(0x9ba4c53a, 0xc6e0952f), TOBN(0x27e6782a, 0x1b21dfa8),
4922 TOBN(0x682f903d, 0x4ed2dbc2), TOBN(0x0eba59c8, 0x7c3b2d83),
4923 TOBN(0x8e9dc84d, 0x9c7e9335), TOBN(0x5f9b21b0, 0x0eb226d7),
4924 TOBN(0xe33bd394, 0xaf267bae), TOBN(0xaa86cc25, 0xbe2e15ae),
4925 TOBN(0x4f0bf67d, 0x6a8ec500), TOBN(0x5846aa44, 0xf9630658),
4926 TOBN(0xfeb09740, 0xe2c2bf15), TOBN(0x627a2205, 0xa9e99704),
4927 TOBN(0xec8d73d0, 0xc2fbc565), TOBN(0x223eed8f, 0xc20c8de8),
4928 TOBN(0x1ee32583, 0xa8363b49), TOBN(0x1a0b6cb9, 0xc9c2b0a6),
4929 TOBN(0x49f7c3d2, 0x90dbc85c), TOBN(0xa8dfbb97, 0x1ef4c1ac),
4930 TOBN(0xafb34d4c, 0x65c7c2ab), TOBN(0x1d4610e7, 0xe2c5ea84),
4931 TOBN(0x893f6d1b, 0x973c4ab5), TOBN(0xa3cdd7e9, 0x945ba5c4),
4932 TOBN(0x60514983, 0x064417ee), TOBN(0x1459b23c, 0xad6bdf2b),
4933 TOBN(0x23b2c341, 0x5cf726c3), TOBN(0x3a829635, 0x32d6354a),
4934 TOBN(0x294f901f, 0xab192c18), TOBN(0xec5fcbfe, 0x7030164f),
4935 TOBN(0xe2e2fcb7, 0xe2246ba6), TOBN(0x1e7c88b3, 0x221a1a0c),
4936 TOBN(0x72c7dd93, 0xc92d88c5), TOBN(0x41c2148e, 0x1106fb59),
4937 TOBN(0x547dd4f5, 0xa0f60f14), TOBN(0xed9b52b2, 0x63960f31),
4938 TOBN(0x6c8349eb, 0xb0a5b358), TOBN(0xb154c5c2, 0x9e7e2ed6),
4939 TOBN(0xcad5eccf, 0xeda462db), TOBN(0xf2d6dbe4, 0x2de66b69),
4940 TOBN(0x426aedf3, 0x8665e5b2), TOBN(0x488a8513, 0x7b7f5723),
4941 TOBN(0x15cc43b3, 0x8bcbb386), TOBN(0x27ad0af3, 0xd791d879),
4942 TOBN(0xc16c236e, 0x846e364f), TOBN(0x7f33527c, 0xdea50ca0),
4943 TOBN(0xc4810775, 0x0926b86d), TOBN(0x6c2a3609, 0x0598e70c),
4944 TOBN(0xa6755e52, 0xf024e924), TOBN(0xe0fa07a4, 0x9db4afca),
4945 TOBN(0x15c3ce7d, 0x66831790), TOBN(0x5b4ef350, 0xa6cbb0d6),
4946 TOBN(0x2c4aafc4, 0xb6205969), TOBN(0x42563f02, 0xf6c7854f),
4947 TOBN(0x016aced5, 0x1d983b48), TOBN(0xfeb356d8, 0x99949755),
4948 TOBN(0x8c2a2c81, 0xd1a39bd7), TOBN(0x8f44340f, 0xe6934ae9),
4949 TOBN(0x148cf91c, 0x447904da), TOBN(0x7340185f, 0x0f51a926),
4950 TOBN(0x2f8f00fb, 0x7409ab46), TOBN(0x057e78e6, 0x80e289b2),
4951 TOBN(0x03e5022c, 0xa888e5d1), TOBN(0x3c87111a, 0x9dede4e2),
4952 TOBN(0x5b9b0e1c, 0x7809460b), TOBN(0xe751c852, 0x71c9abc7),
4953 TOBN(0x8b944e28, 0xc7cc1dc9), TOBN(0x4f201ffa, 0x1d3cfa08),
4954 TOBN(0x02fc905c, 0x3e6721ce), TOBN(0xd52d70da, 0xd0b3674c),
4955 TOBN(0x5dc2e5ca, 0x18810da4), TOBN(0xa984b273, 0x5c69dd99),
4956 TOBN(0x63b92527, 0x84de5ca4), TOBN(0x2f1c9872, 0xc852dec4),
4957 TOBN(0x18b03593, 0xc2e3de09), TOBN(0x19d70b01, 0x9813dc2f),
4958 TOBN(0x42806b2d, 0xa6dc1d29), TOBN(0xd3030009, 0xf871e144),
4959 TOBN(0xa1feb333, 0xaaf49276), TOBN(0xb5583b9e, 0xc70bc04b),
4960 TOBN(0x1db0be78, 0x95695f20), TOBN(0xfc841811, 0x89d012b5),
4961 TOBN(0x6409f272, 0x05f61643), TOBN(0x40d34174, 0xd5883128),
4962 TOBN(0xd79196f5, 0x67419833), TOBN(0x6059e252, 0x863b7b08),
4963 TOBN(0x84da1817, 0x1c56700c), TOBN(0x5758ee56, 0xb28d3ec4),
4964 TOBN(0x7da2771d, 0x013b0ea6), TOBN(0xfddf524b, 0x54c5e9b9),
4965 TOBN(0x7df4faf8, 0x24305d80), TOBN(0x58f5c1bf, 0x3a97763f),
4966 TOBN(0xa5af37f1, 0x7c696042), TOBN(0xd4cba22c, 0x4a2538de),
4967 TOBN(0x211cb995, 0x9ea42600), TOBN(0xcd105f41, 0x7b069889),
4968 TOBN(0xb1e1cf19, 0xddb81e74), TOBN(0x472f2d89, 0x5157b8ca),
4969 TOBN(0x086fb008, 0xee9db885), TOBN(0x365cd570, 0x0f26d131),
4970 TOBN(0x284b02bb, 0xa2be7053), TOBN(0xdcbbf7c6, 0x7ab9a6d6),
4971 TOBN(0x4425559c, 0x20f7a530), TOBN(0x961f2dfa, 0x188767c8),
4972 TOBN(0xe2fd9435, 0x70dc80c4), TOBN(0x104d6b63, 0xf0784120),
4973 TOBN(0x7f592bc1, 0x53567122), TOBN(0xf6bc1246, 0xf688ad77),
4974 TOBN(0x05214c05, 0x0f15dde9), TOBN(0xa47a76a8, 0x0d5f2b82),
4975 TOBN(0xbb254d30, 0x62e82b62), TOBN(0x11a05fe0, 0x3ec955ee),
4976 TOBN(0x7eaff46e, 0x9d529b36), TOBN(0x55ab1301, 0x8f9e3df6),
4977 TOBN(0xc463e371, 0x99317698), TOBN(0xfd251438, 0xccda47ad),
4978 TOBN(0xca9c3547, 0x23d695ea), TOBN(0x48ce626e, 0x16e589b5),
4979 TOBN(0x6b5b64c7, 0xb187d086), TOBN(0xd02e1794, 0xb2207948),
4980 TOBN(0x8b58e98f, 0x7198111d), TOBN(0x90ca6305, 0xdcf9c3cc),
4981 TOBN(0x5691fe72, 0xf34089b0), TOBN(0x60941af1, 0xfc7c80ff),
4982 TOBN(0xa09bc0a2, 0x22eb51e5), TOBN(0xc0bb7244, 0xaa9cf09a),
4983 TOBN(0x36a8077f, 0x80159f06), TOBN(0x8b5c989e, 0xdddc560e),
4984 TOBN(0x19d2f316, 0x512e1f43), TOBN(0x02eac554, 0xad08ff62),
4985 TOBN(0x012ab84c, 0x07d20b4e), TOBN(0x37d1e115, 0xd6d4e4e1),
4986 TOBN(0xb6443e1a, 0xab7b19a8), TOBN(0xf08d067e, 0xdef8cd45),
4987 TOBN(0x63adf3e9, 0x685e03da), TOBN(0xcf15a10e, 0x4792b916),
4988 TOBN(0xf44bcce5, 0xb738a425), TOBN(0xebe131d5, 0x9636b2fd),
4989 TOBN(0x94068841, 0x7850d605), TOBN(0x09684eaa, 0xb40d749d),
4990 TOBN(0x8c3c669c, 0x72ba075b), TOBN(0x89f78b55, 0xba469015),
4991 TOBN(0x5706aade, 0x3e9f8ba8), TOBN(0x6d8bd565, 0xb32d7ed7),
4992 TOBN(0x25f4e63b, 0x805f08d6), TOBN(0x7f48200d, 0xc3bcc1b5),
4993 TOBN(0x4e801968, 0xb025d847), TOBN(0x74afac04, 0x87cbe0a8),
4994 TOBN(0x43ed2c2b, 0x7e63d690), TOBN(0xefb6bbf0, 0x0223cdb8),
4995 TOBN(0x4fec3cae, 0x2884d3fe), TOBN(0x065ecce6, 0xd75e25a4),
4996 TOBN(0x6c2294ce, 0x69f79071), TOBN(0x0d9a8e5f, 0x044b8666),
4997 TOBN(0x5009f238, 0x17b69d8f), TOBN(0x3c29f8fe, 0xc5dfdaf7),
4998 TOBN(0x9067528f, 0xebae68c4), TOBN(0x5b385632, 0x30c5ba21),
4999 TOBN(0x540df119, 0x1fdd1aec), TOBN(0xcf37825b, 0xcfba4c78),
5000 TOBN(0x77eff980, 0xbeb11454), TOBN(0x40a1a991, 0x60c1b066),
5001 TOBN(0xe8018980, 0xf889a1c7), TOBN(0xb9c52ae9, 0x76c24be0),
5002 TOBN(0x05fbbcce, 0x45650ef4), TOBN(0xae000f10, 0x8aa29ac7),
5003 TOBN(0x884b7172, 0x4f04c470), TOBN(0x7cd4fde2, 0x19bb5c25),
5004 TOBN(0x6477b22a, 0xe8840869), TOBN(0xa8868859, 0x5fbd0686),
5005 TOBN(0xf23cc02e, 0x1116dfba), TOBN(0x76cd563f, 0xd87d7776),
5006 TOBN(0xe2a37598, 0xa9d82abf), TOBN(0x5f188ccb, 0xe6c170f5),
5007 TOBN(0x81682200, 0x5066b087), TOBN(0xda22c212, 0xc7155ada),
5008 TOBN(0x151e5d3a, 0xfbddb479), TOBN(0x4b606b84, 0x6d715b99),
5009 TOBN(0x4a73b54b, 0xf997cb2e), TOBN(0x9a1bfe43, 0x3ecd8b66),
5010 TOBN(0x1c312809, 0x2a67d48a), TOBN(0xcd6a671e, 0x031fa9e2),
5011 TOBN(0xbec3312a, 0x0e43a34a), TOBN(0x1d935639, 0x55ef47d3),
5012 TOBN(0x5ea02489, 0x8fea73ea), TOBN(0x8247b364, 0xa035afb2),
5013 TOBN(0xb58300a6, 0x5265b54c), TOBN(0x3286662f, 0x722c7148),
5014 TOBN(0xb77fd76b, 0xb4ec4c20), TOBN(0xf0a12fa7, 0x0f3fe3fd),
5015 TOBN(0xf845bbf5, 0x41d8c7e8), TOBN(0xe4d969ca, 0x5ec10aa8),
5016 TOBN(0x4c0053b7, 0x43e232a3), TOBN(0xdc7a3fac, 0x37f8a45a),
5017 TOBN(0x3c4261c5, 0x20d81c8f), TOBN(0xfd4b3453, 0xb00eab00),
5018 TOBN(0x76d48f86, 0xd36e3062), TOBN(0x626c5277, 0xa143ff02),
5019 TOBN(0x538174de, 0xaf76f42e), TOBN(0x2267aa86, 0x6407ceac),
5020 TOBN(0xfad76351, 0x72e572d5), TOBN(0xab861af7, 0xba7330eb),
5021 TOBN(0xa0a1c8c7, 0x418d8657), TOBN(0x988821cb, 0x20289a52),
5022 TOBN(0x79732522, 0xcccc18ad), TOBN(0xaadf3f8d, 0xf1a6e027),
5023 TOBN(0xf7382c93, 0x17c2354d), TOBN(0x5ce1680c, 0xd818b689),
5024 TOBN(0x359ebbfc, 0xd9ecbee9), TOBN(0x4330689c, 0x1cae62ac),
5025 TOBN(0xb55ce5b4, 0xc51ac38a), TOBN(0x7921dfea, 0xfe238ee8),
5026 TOBN(0x3972bef8, 0x271d1ca5), TOBN(0x3e423bc7, 0xe8aabd18),
5027 TOBN(0x57b09f3f, 0x44a3e5e3), TOBN(0x5da886ae, 0x7b444d66),
5028 TOBN(0x68206634, 0xa9964375), TOBN(0x356a2fa3, 0x699cd0ff),
5029 TOBN(0xaf0faa24, 0xdba515e9), TOBN(0x536e1f5c, 0xb321d79a),
5030 TOBN(0xd3b9913a, 0x5c04e4ea), TOBN(0xd549dcfe, 0xd6f11513),
5031 TOBN(0xee227bf5, 0x79fd1d94), TOBN(0x9f35afee, 0xb43f2c67),
5032 TOBN(0xd2638d24, 0xf1314f53), TOBN(0x62baf948, 0xcabcd822),
5033 TOBN(0x5542de29, 0x4ef48db0), TOBN(0xb3eb6a04, 0xfc5f6bb2),
5034 TOBN(0x23c110ae, 0x1208e16a), TOBN(0x1a4d15b5, 0xf8363e24),
5035 TOBN(0x30716844, 0x164be00b), TOBN(0xa8e24824, 0xf6f4690d),
5036 TOBN(0x548773a2, 0x90b170cf), TOBN(0xa1bef331, 0x42f191f4),
5037 TOBN(0x70f418d0, 0x9247aa97), TOBN(0xea06028e, 0x48be9147),
5038 TOBN(0xe13122f3, 0xdbfb894e), TOBN(0xbe9b79f6, 0xce274b18),
5039 TOBN(0x85a49de5, 0xca58aadf), TOBN(0x24957758, 0x11487351),
5040 TOBN(0x111def61, 0xbb939099), TOBN(0x1d6a974a, 0x26d13694),
5041 TOBN(0x4474b4ce, 0xd3fc253b), TOBN(0x3a1485e6, 0x4c5db15e),
5042 TOBN(0xe79667b4, 0x147c15b4), TOBN(0xe34f553b, 0x7bc61301),
5043 TOBN(0x032b80f8, 0x17094381), TOBN(0x55d8bafd, 0x723eaa21),
5044 TOBN(0x5a987995, 0xf1c0e74e), TOBN(0x5a9b292e, 0xebba289c),
5045 TOBN(0x413cd4b2, 0xeb4c8251), TOBN(0x98b5d243, 0xd162db0a),
5046 TOBN(0xbb47bf66, 0x68342520), TOBN(0x08d68949, 0xbaa862d1),
5047 TOBN(0x11f349c7, 0xe906abcd), TOBN(0x454ce985, 0xed7bf00e),
5048 TOBN(0xacab5c9e, 0xb55b803b), TOBN(0xb03468ea, 0x31e3c16d),
5049 TOBN(0x5c24213d, 0xd273bf12), TOBN(0x211538eb, 0x71587887),
5050 TOBN(0x198e4a2f, 0x731dea2d), TOBN(0xd5856cf2, 0x74ed7b2a),
5051 TOBN(0x86a632eb, 0x13a664fe), TOBN(0x932cd909, 0xbda41291),
5052 TOBN(0x850e95d4, 0xc0c4ddc0), TOBN(0xc0f422f8, 0x347fc2c9),
5053 TOBN(0xe68cbec4, 0x86076bcb), TOBN(0xf9e7c0c0, 0xcd6cd286),
5054 TOBN(0x65994ddb, 0x0f5f27ca), TOBN(0xe85461fb, 0xa80d59ff),
5055 TOBN(0xff05481a, 0x66601023), TOBN(0xc665427a, 0xfc9ebbfb),
5056 TOBN(0xb0571a69, 0x7587fd52), TOBN(0x935289f8, 0x8d49efce),
5057 TOBN(0x61becc60, 0xea420688), TOBN(0xb22639d9, 0x13a786af),
5058 TOBN(0x1a8e6220, 0x361ecf90), TOBN(0x001f23e0, 0x25506463),
5059 TOBN(0xe4ae9b5d, 0x0a5c2b79), TOBN(0xebc9cdad, 0xd8149db5),
5060 TOBN(0xb33164a1, 0x934aa728), TOBN(0x750eb00e, 0xae9b60f3),
5061 TOBN(0x5a91615b, 0x9b9cfbfd), TOBN(0x97015cbf, 0xef45f7f6),
5062 TOBN(0xb462c4a5, 0xbf5151df), TOBN(0x21adcc41, 0xb07118f2),
5063 TOBN(0xd60c545b, 0x043fa42c), TOBN(0xfc21aa54, 0xe96be1ab),
5064 TOBN(0xe84bc32f, 0x4e51ea80), TOBN(0x3dae45f0, 0x259b5d8d),
5065 TOBN(0xbb73c7eb, 0xc38f1b5e), TOBN(0xe405a74a, 0xe8ae617d),
5066 TOBN(0xbb1ae9c6, 0x9f1c56bd), TOBN(0x8c176b98, 0x49f196a4),
5067 TOBN(0xc448f311, 0x6875092b), TOBN(0xb5afe3de, 0x9f976033),
5068 TOBN(0xa8dafd49, 0x145813e5), TOBN(0x687fc4d9, 0xe2b34226),
5069 TOBN(0xf2dfc92d, 0x4c7ff57f), TOBN(0x004e3fc1, 0x401f1b46),
5070 TOBN(0x5afddab6, 0x1430c9ab), TOBN(0x0bdd41d3, 0x2238e997),
5071 TOBN(0xf0947430, 0x418042ae), TOBN(0x71f9adda, 0xcdddc4cb),
5072 TOBN(0x7090c016, 0xc52dd907), TOBN(0xd9bdf44d, 0x29e2047f),
5073 TOBN(0xe6f1fe80, 0x1b1011a6), TOBN(0xb63accbc, 0xd9acdc78),
5074 TOBN(0xcfc7e235, 0x1272a95b), TOBN(0x0c667717, 0xa6276ac8),
5075 TOBN(0x3c0d3709, 0xe2d7eef7), TOBN(0x5add2b06, 0x9a685b3e),
5076 TOBN(0x363ad32d, 0x14ea5d65), TOBN(0xf8e01f06, 0x8d7dd506),
5077 TOBN(0xc9ea2213, 0x75b4aac6), TOBN(0xed2a2bf9, 0x0d353466),
5078 TOBN(0x439d79b5, 0xe9d3a7c3), TOBN(0x8e0ee5a6, 0x81b7f34b),
5079 TOBN(0xcf3dacf5, 0x1dc4ba75), TOBN(0x1d3d1773, 0xeb3310c7),
5080 TOBN(0xa8e67112, 0x7747ae83), TOBN(0x31f43160, 0x197d6b40),
5081 TOBN(0x0521ccee, 0xcd961400), TOBN(0x67246f11, 0xf6535768),
5082 TOBN(0x702fcc5a, 0xef0c3133), TOBN(0x247cc45d, 0x7e16693b),
5083 TOBN(0xfd484e49, 0xc729b749), TOBN(0x522cef7d, 0xb218320f),
5084 TOBN(0xe56ef405, 0x59ab93b3), TOBN(0x225fba11, 0x9f181071),
5085 TOBN(0x33bd6595, 0x15330ed0), TOBN(0xc4be69d5, 0x1ddb32f7),
5086 TOBN(0x264c7668, 0x0448087c), TOBN(0xac30903f, 0x71432dae),
5087 TOBN(0x3851b266, 0x00f9bf47), TOBN(0x400ed311, 0x6cdd6d03),
5088 TOBN(0x045e79fe, 0xf8fd2424), TOBN(0xfdfd974a, 0xfa6da98b),
5089 TOBN(0x45c9f641, 0x0c1e673a), TOBN(0x76f2e733, 0x5b2c5168),
5090 TOBN(0x1adaebb5, 0x2a601753), TOBN(0xb286514c, 0xc57c2d49),
5091 TOBN(0xd8769670, 0x1e0bfd24), TOBN(0x950c547e, 0x04478922),
5092 TOBN(0xd1d41969, 0xe5d32bfe), TOBN(0x30bc1472, 0x750d6c3e),
5093 TOBN(0x8f3679fe, 0xe0e27f3a), TOBN(0x8f64a7dc, 0xa4a6ee0c),
5094 TOBN(0x2fe59937, 0x633dfb1f), TOBN(0xea82c395, 0x977f2547),
5095 TOBN(0xcbdfdf1a, 0x661ea646), TOBN(0xc7ccc591, 0xb9085451),
5096 TOBN(0x82177962, 0x81761e13), TOBN(0xda57596f, 0x9196885c),
5097 TOBN(0xbc17e849, 0x28ffbd70), TOBN(0x1e6e0a41, 0x2671d36f),
5098 TOBN(0x61ae872c, 0x4152fcf5), TOBN(0x441c87b0, 0x9e77e754),
5099 TOBN(0xd0799dd5, 0xa34dff09), TOBN(0x766b4e44, 0x88a6b171),
5100 TOBN(0xdc06a512, 0x11f1c792), TOBN(0xea02ae93, 0x4be35c3e),
5101 TOBN(0xe5ca4d6d, 0xe90c469e), TOBN(0x4df4368e, 0x56e4ff5c),
5102 TOBN(0x7817acab, 0x4baef62e), TOBN(0x9f5a2202, 0xa85b91e8),
5103 TOBN(0x9666ebe6, 0x6ce57610), TOBN(0x32ad31f3, 0xf73bfe03),
5104 TOBN(0x628330a4, 0x25bcf4d6), TOBN(0xea950593, 0x515056e6),
5105 TOBN(0x59811c89, 0xe1332156), TOBN(0xc89cf1fe, 0x8c11b2d7),
5106 TOBN(0x75b63913, 0x04e60cc0), TOBN(0xce811e8d, 0x4625d375),
5107 TOBN(0x030e43fc, 0x2d26e562), TOBN(0xfbb30b4b, 0x608d36a0),
5108 TOBN(0x634ff82c, 0x48528118), TOBN(0x7c6fe085, 0xcd285911),
5109 TOBN(0x7f2830c0, 0x99358f28), TOBN(0x2e60a95e, 0x665e6c09),
5110 TOBN(0x08407d3d, 0x9b785dbf), TOBN(0x530889ab, 0xa759bce7),
5111 TOBN(0xf228e0e6, 0x52f61239), TOBN(0x2b6d1461, 0x6879be3c),
5112 TOBN(0xe6902c04, 0x51a7bbf7), TOBN(0x30ad99f0, 0x76f24a64),
5113 TOBN(0x66d9317a, 0x98bc6da0), TOBN(0xf4f877f3, 0xcb596ac0),
5114 TOBN(0xb05ff62d, 0x4c44f119), TOBN(0x4555f536, 0xe9b77416),
5115 TOBN(0xc7c0d059, 0x8caed63b), TOBN(0x0cd2b7ce, 0xc358b2a9),
5116 TOBN(0x3f33287b, 0x46945fa3), TOBN(0xf8785b20, 0xd67c8791),
5117 TOBN(0xc54a7a61, 0x9637bd08), TOBN(0x54d4598c, 0x18be79d7),
5118 TOBN(0x889e5acb, 0xc46d7ce1), TOBN(0x9a515bb7, 0x8b085877),
5119 TOBN(0xfac1a03d, 0x0b7a5050), TOBN(0x7d3e738a, 0xf2926035),
5120 TOBN(0x861cc2ce, 0x2a6cb0eb), TOBN(0x6f2e2955, 0x8f7adc79),
5121 TOBN(0x61c4d451, 0x33016376), TOBN(0xd9fd2c80, 0x5ad59090),
5122 TOBN(0xe5a83738, 0xb2b836a1), TOBN(0x855b41a0, 0x7c0d6622),
5123 TOBN(0x186fe317, 0x7cc19af1), TOBN(0x6465c1ff, 0xfdd99acb),
5124 TOBN(0x46e5c23f, 0x6974b99e), TOBN(0x75a7cf8b, 0xa2717cbe),
5125 TOBN(0x4d2ebc3f, 0x062be658), TOBN(0x094b4447, 0x5f209c98),
5126 TOBN(0x4af285ed, 0xb940cb5a), TOBN(0x6706d792, 0x7cc82f10),
5127 TOBN(0xc8c8776c, 0x030526fa), TOBN(0xfa8e6f76, 0xa0da9140),
5128 TOBN(0x77ea9d34, 0x591ee4f0), TOBN(0x5f46e337, 0x40274166),
5129 TOBN(0x1bdf98bb, 0xea671457), TOBN(0xd7c08b46, 0x862a1fe2),
5130 TOBN(0x46cc303c, 0x1c08ad63), TOBN(0x99543440, 0x4c845e7b),
5131 TOBN(0x1b8fbdb5, 0x48f36bf7), TOBN(0x5b82c392, 0x8c8273a7),
5132 TOBN(0x08f712c4, 0x928435d5), TOBN(0x071cf0f1, 0x79330380),
5133 TOBN(0xc74c2d24, 0xa8da054a), TOBN(0xcb0e7201, 0x43c46b5c),
5134 TOBN(0x0ad7337a, 0xc0b7eff3), TOBN(0x8552225e, 0xc5e48b3c),
5135 TOBN(0xe6f78b0c, 0x73f13a5f), TOBN(0x5e70062e, 0x82349cbe),
5136 TOBN(0x6b8d5048, 0xe7073969), TOBN(0x392d2a29, 0xc33cb3d2),
5137 TOBN(0xee4f727c, 0x4ecaa20f), TOBN(0xa068c99e, 0x2ccde707),
5138 TOBN(0xfcd5651f, 0xb87a2913), TOBN(0xea3e3c15, 0x3cc252f0),
5139 TOBN(0x777d92df, 0x3b6cd3e4), TOBN(0x7a414143, 0xc5a732e7),
5140 TOBN(0xa895951a, 0xa71ff493), TOBN(0xfe980c92, 0xbbd37cf6),
5141 TOBN(0x45bd5e64, 0xdecfeeff), TOBN(0x910dc2a9, 0xa44c43e9),
5142 TOBN(0xcb403f26, 0xcca9f54d), TOBN(0x928bbdfb, 0x9303f6db),
5143 TOBN(0x3c37951e, 0xa9eee67c), TOBN(0x3bd61a52, 0xf79961c3),
5144 TOBN(0x09a238e6, 0x395c9a79), TOBN(0x6940ca2d, 0x61eb352d),
5145 TOBN(0x7d1e5c5e, 0xc1875631), TOBN(0x1e19742c, 0x1e1b20d1),
5146 TOBN(0x4633d908, 0x23fc2e6e), TOBN(0xa76e29a9, 0x08959149),
5147 TOBN(0x61069d9c, 0x84ed7da5), TOBN(0x0baa11cf, 0x5dbcad51),
5148 TOBN(0xd01eec64, 0x961849da), TOBN(0x93b75f1f, 0xaf3d8c28),
5149 TOBN(0x57bc4f9f, 0x1ca2ee44), TOBN(0x5a26322d, 0x00e00558),
5150 TOBN(0x1888d658, 0x61a023ef), TOBN(0x1d72aab4, 0xb9e5246e),
5151 TOBN(0xa9a26348, 0xe5563ec0), TOBN(0xa0971963, 0xc3439a43),
5152 TOBN(0x567dd54b, 0xadb9b5b7), TOBN(0x73fac1a1, 0xc45a524b),
5153 TOBN(0x8fe97ef7, 0xfe38e608), TOBN(0x608748d2, 0x3f384f48),
5154 TOBN(0xb0571794, 0xc486094f), TOBN(0x869254a3, 0x8bf3a8d6),
5155 TOBN(0x148a8dd1, 0x310b0e25), TOBN(0x99ab9f3f, 0x9aa3f7d8),
5156 TOBN(0x0927c68a, 0x6706c02e), TOBN(0x22b5e76c, 0x69790e6c),
5157 TOBN(0x6c325260, 0x6c71376c), TOBN(0x53a57690, 0x09ef6657),
5158 TOBN(0x8d63f852, 0xedffcf3a), TOBN(0xb4d2ed04, 0x3c0a6f55),
5159 TOBN(0xdb3aa8de, 0x12519b9e), TOBN(0x5d38e9c4, 0x1e0a569a),
5160 TOBN(0x871528bf, 0x303747e2), TOBN(0xa208e77c, 0xf5b5c18d),
5161 TOBN(0x9d129c88, 0xca6bf923), TOBN(0xbcbf197f, 0xbf02839f),
5162 TOBN(0x9b9bf030, 0x27323194), TOBN(0x3b055a8b, 0x339ca59d),
5163 TOBN(0xb46b2312, 0x0f669520), TOBN(0x19789f1f, 0x497e5f24),
5164 TOBN(0x9c499468, 0xaaf01801), TOBN(0x72ee1190, 0x8b69d59c),
5165 TOBN(0x8bd39595, 0xacf4c079), TOBN(0x3ee11ece, 0x8e0cd048),
5166 TOBN(0xebde86ec, 0x1ed66f18), TOBN(0x225d906b, 0xd61fce43),
5167 TOBN(0x5cab07d6, 0xe8bed74d), TOBN(0x16e4617f, 0x27855ab7),
5168 TOBN(0x6568aadd, 0xb2fbc3dd), TOBN(0xedb5484f, 0x8aeddf5b),
5169 TOBN(0x878f20e8, 0x6dcf2fad), TOBN(0x3516497c, 0x615f5699),
5170 },
5171 {
5172 TOBN(0xef0a3fec, 0xfa181e69), TOBN(0x9ea02f81, 0x30d69a98),
5173 TOBN(0xb2e9cf8e, 0x66eab95d), TOBN(0x520f2beb, 0x24720021),
5174 TOBN(0x621c540a, 0x1df84361), TOBN(0x12037721, 0x71fa6d5d),
5175 TOBN(0x6e3c7b51, 0x0ff5f6ff), TOBN(0x817a069b, 0xabb2bef3),
5176 TOBN(0x83572fb6, 0xb294cda6), TOBN(0x6ce9bf75, 0xb9039f34),
5177 TOBN(0x20e012f0, 0x095cbb21), TOBN(0xa0aecc1b, 0xd063f0da),
5178 TOBN(0x57c21c3a, 0xf02909e5), TOBN(0xc7d59ecf, 0x48ce9cdc),
5179 TOBN(0x2732b844, 0x8ae336f8), TOBN(0x056e3723, 0x3f4f85f4),
5180 TOBN(0x8a10b531, 0x89e800ca), TOBN(0x50fe0c17, 0x145208fd),
5181 TOBN(0x9e43c0d3, 0xb714ba37), TOBN(0x427d200e, 0x34189acc),
5182 TOBN(0x05dee24f, 0xe616e2c0), TOBN(0x9c25f4c8, 0xee1854c1),
5183 TOBN(0x4d3222a5, 0x8f342a73), TOBN(0x0807804f, 0xa027c952),
5184 TOBN(0xc222653a, 0x4f0d56f3), TOBN(0x961e4047, 0xca28b805),
5185 TOBN(0x2c03f8b0, 0x4a73434b), TOBN(0x4c966787, 0xab712a19),
5186 TOBN(0xcc196c42, 0x864fee42), TOBN(0xc1be93da, 0x5b0ece5c),
5187 TOBN(0xa87d9f22, 0xc131c159), TOBN(0x2bb6d593, 0xdce45655),
5188 TOBN(0x22c49ec9, 0xb809b7ce), TOBN(0x8a41486b, 0xe2c72c2c),
5189 TOBN(0x813b9420, 0xfea0bf36), TOBN(0xb3d36ee9, 0xa66dac69),
5190 TOBN(0x6fddc08a, 0x328cc987), TOBN(0x0a3bcd2c, 0x3a326461),
5191 TOBN(0x7103c49d, 0xd810dbba), TOBN(0xf9d81a28, 0x4b78a4c4),
5192 TOBN(0x3de865ad, 0xe4d55941), TOBN(0xdedafa5e, 0x30384087),
5193 TOBN(0x6f414abb, 0x4ef18b9b), TOBN(0x9ee9ea42, 0xfaee5268),
5194 TOBN(0x260faa16, 0x37a55a4a), TOBN(0xeb19a514, 0x015f93b9),
5195 TOBN(0x51d7ebd2, 0x9e9c3598), TOBN(0x523fc56d, 0x1932178e),
5196 TOBN(0x501d070c, 0xb98fe684), TOBN(0xd60fbe9a, 0x124a1458),
5197 TOBN(0xa45761c8, 0x92bc6b3f), TOBN(0xf5384858, 0xfe6f27cb),
5198 TOBN(0x4b0271f7, 0xb59e763b), TOBN(0x3d4606a9, 0x5b5a8e5e),
5199 TOBN(0x1eda5d9b, 0x05a48292), TOBN(0xda7731d0, 0xe6fec446),
5200 TOBN(0xa3e33693, 0x90d45871), TOBN(0xe9764040, 0x06166d8d),
5201 TOBN(0xb5c33682, 0x89a90403), TOBN(0x4bd17983, 0x72f1d637),
5202 TOBN(0xa616679e, 0xd5d2c53a), TOBN(0x5ec4bcd8, 0xfdcf3b87),
5203 TOBN(0xae6d7613, 0xb66a694e), TOBN(0x7460fc76, 0xe3fc27e5),
5204 TOBN(0x70469b82, 0x95caabee), TOBN(0xde024ca5, 0x889501e3),
5205 TOBN(0x6bdadc06, 0x076ed265), TOBN(0x0cb1236b, 0x5a0ef8b2),
5206 TOBN(0x4065ddbf, 0x0972ebf9), TOBN(0xf1dd3875, 0x22aca432),
5207 TOBN(0xa88b97cf, 0x744aff76), TOBN(0xd1359afd, 0xfe8e3d24),
5208 TOBN(0x52a3ba2b, 0x91502cf3), TOBN(0x2c3832a8, 0x084db75d),
5209 TOBN(0x04a12ddd, 0xde30b1c9), TOBN(0x7802eabc, 0xe31fd60c),
5210 TOBN(0x33707327, 0xa37fddab), TOBN(0x65d6f2ab, 0xfaafa973),
5211 TOBN(0x3525c5b8, 0x11e6f91a), TOBN(0x76aeb0c9, 0x5f46530b),
5212 TOBN(0xe8815ff6, 0x2f93a675), TOBN(0xa6ec9684, 0x05f48679),
5213 TOBN(0x6dcbb556, 0x358ae884), TOBN(0x0af61472, 0xe19e3873),
5214 TOBN(0x72334372, 0xa5f696be), TOBN(0xc65e57ea, 0x6f22fb70),
5215 TOBN(0x268da30c, 0x946cea90), TOBN(0x136a8a87, 0x65681b2a),
5216 TOBN(0xad5e81dc, 0x0f9f44d4), TOBN(0xf09a6960, 0x2c46585a),
5217 TOBN(0xd1649164, 0xc447d1b1), TOBN(0x3b4b36c8, 0x879dc8b1),
5218 TOBN(0x20d4177b, 0x3b6b234c), TOBN(0x096a2505, 0x1730d9d0),
5219 TOBN(0x0611b9b8, 0xef80531d), TOBN(0xba904b3b, 0x64bb495d),
5220 TOBN(0x1192d9d4, 0x93a3147a), TOBN(0x9f30a5dc, 0x9a565545),
5221 TOBN(0x90b1f9cb, 0x6ef07212), TOBN(0x29958546, 0x0d87fc13),
5222 TOBN(0xd3323eff, 0xc17db9ba), TOBN(0xcb18548c, 0xcb1644a8),
5223 TOBN(0x18a306d4, 0x4f49ffbc), TOBN(0x28d658f1, 0x4c2e8684),
5224 TOBN(0x44ba60cd, 0xa99f8c71), TOBN(0x67b7abdb, 0x4bf742ff),
5225 TOBN(0x66310f9c, 0x914b3f99), TOBN(0xae430a32, 0xf412c161),
5226 TOBN(0x1e6776d3, 0x88ace52f), TOBN(0x4bc0fa24, 0x52d7067d),
5227 TOBN(0x03c286aa, 0x8f07cd1b), TOBN(0x4cb8f38c, 0xa985b2c1),
5228 TOBN(0x83ccbe80, 0x8c3bff36), TOBN(0x005a0bd2, 0x5263e575),
5229 TOBN(0x460d7dda, 0x259bdcd1), TOBN(0x4a1c5642, 0xfa5cab6b),
5230 TOBN(0x2b7bdbb9, 0x9fe4fc88), TOBN(0x09418e28, 0xcc97bbb5),
5231 TOBN(0xd8274fb4, 0xa12321ae), TOBN(0xb137007d, 0x5c87b64e),
5232 TOBN(0x80531fe1, 0xc63c4962), TOBN(0x50541e89, 0x981fdb25),
5233 TOBN(0xdc1291a1, 0xfd4c2b6b), TOBN(0xc0693a17, 0xa6df4fca),
5234 TOBN(0xb2c4604e, 0x0117f203), TOBN(0x245f1963, 0x0a99b8d0),
5235 TOBN(0xaedc20aa, 0xc6212c44), TOBN(0xb1ed4e56, 0x520f52a8),
5236 TOBN(0xfe48f575, 0xf8547be3), TOBN(0x0a7033cd, 0xa9e45f98),
5237 TOBN(0x4b45d3a9, 0x18c50100), TOBN(0xb2a6cd6a, 0xa61d41da),
5238 TOBN(0x60bbb4f5, 0x57933c6b), TOBN(0xa7538ebd, 0x2b0d7ffc),
5239 TOBN(0x9ea3ab8d, 0x8cd626b6), TOBN(0x8273a484, 0x3601625a),
5240 TOBN(0x88859845, 0x0168e508), TOBN(0x8cbc9bb2, 0x99a94abd),
5241 TOBN(0x713ac792, 0xfab0a671), TOBN(0xa3995b19, 0x6c9ebffc),
5242 TOBN(0xe711668e, 0x1239e152), TOBN(0x56892558, 0xbbb8dff4),
5243 TOBN(0x8bfc7dab, 0xdbf17963), TOBN(0x5b59fe5a, 0xb3de1253),
5244 TOBN(0x7e3320eb, 0x34a9f7ae), TOBN(0xe5e8cf72, 0xd751efe4),
5245 TOBN(0x7ea003bc, 0xd9be2f37), TOBN(0xc0f551a0, 0xb6c08ef7),
5246 TOBN(0x56606268, 0x038f6725), TOBN(0x1dd38e35, 0x6d92d3b6),
5247 TOBN(0x07dfce7c, 0xc3cbd686), TOBN(0x4e549e04, 0x651c5da8),
5248 TOBN(0x4058f93b, 0x08b19340), TOBN(0xc2fae6f4, 0xcac6d89d),
5249 TOBN(0x4bad8a8c, 0x8f159cc7), TOBN(0x0ddba4b3, 0xcb0b601c),
5250 TOBN(0xda4fc7b5, 0x1dd95f8c), TOBN(0x1d163cd7, 0xcea5c255),
5251 TOBN(0x30707d06, 0x274a8c4c), TOBN(0x79d9e008, 0x2802e9ce),
5252 TOBN(0x02a29ebf, 0xe6ddd505), TOBN(0x37064e74, 0xb50bed1a),
5253 TOBN(0x3f6bae65, 0xa7327d57), TOBN(0x3846f5f1, 0xf83920bc),
5254 TOBN(0x87c37491, 0x60df1b9b), TOBN(0x4cfb2895, 0x2d1da29f),
5255 TOBN(0x10a478ca, 0x4ed1743c), TOBN(0x390c6030, 0x3edd47c6),
5256 TOBN(0x8f3e5312, 0x8c0a78de), TOBN(0xccd02bda, 0x1e85df70),
5257 TOBN(0xd6c75c03, 0xa61b6582), TOBN(0x0762921c, 0xfc0eebd1),
5258 TOBN(0xd34d0823, 0xd85010c0), TOBN(0xd73aaacb, 0x0044cf1f),
5259 TOBN(0xfb4159bb, 0xa3b5e78a), TOBN(0x2287c7f7, 0xe5826f3f),
5260 TOBN(0x4aeaf742, 0x580b1a01), TOBN(0xf080415d, 0x60423b79),
5261 TOBN(0xe12622cd, 0xa7dea144), TOBN(0x49ea4996, 0x59d62472),
5262 TOBN(0xb42991ef, 0x571f3913), TOBN(0x0610f214, 0xf5b25a8a),
5263 TOBN(0x47adc585, 0x30b79e8f), TOBN(0xf90e3df6, 0x07a065a2),
5264 TOBN(0x5d0a5deb, 0x43e2e034), TOBN(0x53fb5a34, 0x444024aa),
5265 TOBN(0xa8628c68, 0x6b0c9f7f), TOBN(0x9c69c29c, 0xac563656),
5266 TOBN(0x5a231feb, 0xbace47b6), TOBN(0xbdce0289, 0x9ea5a2ec),
5267 TOBN(0x05da1fac, 0x9463853e), TOBN(0x96812c52, 0x509e78aa),
5268 TOBN(0xd3fb5771, 0x57151692), TOBN(0xeb2721f8, 0xd98e1c44),
5269 TOBN(0xc0506087, 0x32399be1), TOBN(0xda5a5511, 0xd979d8b8),
5270 TOBN(0x737ed55d, 0xc6f56780), TOBN(0xe20d3004, 0x0dc7a7f4),
5271 TOBN(0x02ce7301, 0xf5941a03), TOBN(0x91ef5215, 0xed30f83a),
5272 TOBN(0x28727fc1, 0x4092d85f), TOBN(0x72d223c6, 0x5c49e41a),
5273 TOBN(0xa7cf30a2, 0xba6a4d81), TOBN(0x7c086209, 0xb030d87d),
5274 TOBN(0x04844c7d, 0xfc588b09), TOBN(0x728cd499, 0x5874bbb0),
5275 TOBN(0xcc1281ee, 0xe84c0495), TOBN(0x0769b5ba, 0xec31958f),
5276 TOBN(0x665c228b, 0xf99c2471), TOBN(0xf2d8a11b, 0x191eb110),
5277 TOBN(0x4594f494, 0xd36d7024), TOBN(0x482ded8b, 0xcdcb25a1),
5278 TOBN(0xc958a9d8, 0xdadd4885), TOBN(0x7004477e, 0xf1d2b547),
5279 TOBN(0x0a45f6ef, 0x2a0af550), TOBN(0x4fc739d6, 0x2f8d6351),
5280 TOBN(0x75cdaf27, 0x786f08a9), TOBN(0x8700bb26, 0x42c2737f),
5281 TOBN(0x855a7141, 0x1c4e2670), TOBN(0x810188c1, 0x15076fef),
5282 TOBN(0xc251d0c9, 0xabcd3297), TOBN(0xae4c8967, 0xf48108eb),
5283 TOBN(0xbd146de7, 0x18ceed30), TOBN(0xf9d4f07a, 0xc986bced),
5284 TOBN(0x5ad98ed5, 0x83fa1e08), TOBN(0x7780d33e, 0xbeabd1fb),
5285 TOBN(0xe330513c, 0x903b1196), TOBN(0xba11de9e, 0xa47bc8c4),
5286 TOBN(0x684334da, 0x02c2d064), TOBN(0x7ecf360d, 0xa48de23b),
5287 TOBN(0x57a1b474, 0x0a9089d8), TOBN(0xf28fa439, 0xff36734c),
5288 TOBN(0xf2a482cb, 0xea4570b3), TOBN(0xee65d68b, 0xa5ebcee9),
5289 TOBN(0x988d0036, 0xb9694cd5), TOBN(0x53edd0e9, 0x37885d32),
5290 TOBN(0xe37e3307, 0xbeb9bc6d), TOBN(0xe9abb907, 0x9f5c6768),
5291 TOBN(0x4396ccd5, 0x51f2160f), TOBN(0x2500888c, 0x47336da6),
5292 TOBN(0x383f9ed9, 0x926fce43), TOBN(0x809dd1c7, 0x04da2930),
5293 TOBN(0x30f6f596, 0x8a4cb227), TOBN(0x0d700c7f, 0x73a56b38),
5294 TOBN(0x1825ea33, 0xab64a065), TOBN(0xaab9b735, 0x1338df80),
5295 TOBN(0x1516100d, 0x9b63f57f), TOBN(0x2574395a, 0x27a6a634),
5296 TOBN(0xb5560fb6, 0x700a1acd), TOBN(0xe823fd73, 0xfd999681),
5297 TOBN(0xda915d1f, 0x6cb4e1ba), TOBN(0x0d030118, 0x6ebe00a3),
5298 TOBN(0x744fb0c9, 0x89fca8cd), TOBN(0x970d01db, 0xf9da0e0b),
5299 TOBN(0x0ad8c564, 0x7931d76f), TOBN(0xb15737bf, 0xf659b96a),
5300 TOBN(0xdc9933e8, 0xa8b484e7), TOBN(0xb2fdbdf9, 0x7a26dec7),
5301 TOBN(0x2349e9a4, 0x9f1f0136), TOBN(0x7860368e, 0x70fddddb),
5302 TOBN(0xd93d2c1c, 0xf9ad3e18), TOBN(0x6d6c5f17, 0x689f4e79),
5303 TOBN(0x7a544d91, 0xb24ff1b6), TOBN(0x3e12a5eb, 0xfe16cd8c),
5304 TOBN(0x543574e9, 0xa56b872f), TOBN(0xa1ad550c, 0xfcf68ea2),
5305 TOBN(0x689e37d2, 0x3f560ef7), TOBN(0x8c54b9ca, 0xc9d47a8b),
5306 TOBN(0x46d40a4a, 0x088ac342), TOBN(0xec450c7c, 0x1576c6d0),
5307 TOBN(0xb589e31c, 0x1f9689e9), TOBN(0xdacf2602, 0xb8781718),
5308 TOBN(0xa89237c6, 0xc8cb6b42), TOBN(0x1326fc93, 0xb96ef381),
5309 TOBN(0x55d56c6d, 0xb5f07825), TOBN(0xacba2eea, 0x7449e22d),
5310 TOBN(0x74e0887a, 0x633c3000), TOBN(0xcb6cd172, 0xd7cbcf71),
5311 TOBN(0x309e81de, 0xc36cf1be), TOBN(0x07a18a6d, 0x60ae399b),
5312 TOBN(0xb36c2679, 0x9edce57e), TOBN(0x52b892f4, 0xdf001d41),
5313 TOBN(0xd884ae5d, 0x16a1f2c6), TOBN(0x9b329424, 0xefcc370a),
5314 TOBN(0x3120daf2, 0xbd2e21df), TOBN(0x55298d2d, 0x02470a99),
5315 TOBN(0x0b78af6c, 0xa05db32e), TOBN(0x5c76a331, 0x601f5636),
5316 TOBN(0xaae861ff, 0xf8a4f29c), TOBN(0x70dc9240, 0xd68f8d49),
5317 TOBN(0x960e649f, 0x81b1321c), TOBN(0x3d2c801b, 0x8792e4ce),
5318 TOBN(0xf479f772, 0x42521876), TOBN(0x0bed93bc, 0x416c79b1),
5319 TOBN(0xa67fbc05, 0x263e5bc9), TOBN(0x01e8e630, 0x521db049),
5320 TOBN(0x76f26738, 0xc6f3431e), TOBN(0xe609cb02, 0xe3267541),
5321 TOBN(0xb10cff2d, 0x818c877c), TOBN(0x1f0e75ce, 0x786a13cb),
5322 TOBN(0xf4fdca64, 0x1158544d), TOBN(0x5d777e89, 0x6cb71ed0),
5323 TOBN(0x3c233737, 0xa9aa4755), TOBN(0x7b453192, 0xe527ab40),
5324 TOBN(0xdb59f688, 0x39f05ffe), TOBN(0x8f4f4be0, 0x6d82574e),
5325 TOBN(0xcce3450c, 0xee292d1b), TOBN(0xaa448a12, 0x61ccd086),
5326 TOBN(0xabce91b3, 0xf7914967), TOBN(0x4537f09b, 0x1908a5ed),
5327 TOBN(0xa812421e, 0xf51042e7), TOBN(0xfaf5cebc, 0xec0b3a34),
5328 TOBN(0x730ffd87, 0x4ca6b39a), TOBN(0x70fb72ed, 0x02efd342),
5329 TOBN(0xeb4735f9, 0xd75c8edb), TOBN(0xc11f2157, 0xc278aa51),
5330 TOBN(0xc459f635, 0xbf3bfebf), TOBN(0x3a1ff0b4, 0x6bd9601f),
5331 TOBN(0xc9d12823, 0xc420cb73), TOBN(0x3e9af3e2, 0x3c2915a3),
5332 TOBN(0xe0c82c72, 0xb41c3440), TOBN(0x175239e5, 0xe3039a5f),
5333 TOBN(0xe1084b8a, 0x558795a3), TOBN(0x328d0a1d, 0xd01e5c60),
5334 TOBN(0x0a495f2e, 0xd3788a04), TOBN(0x25d8ff16, 0x66c11a9f),
5335 TOBN(0xf5155f05, 0x9ed692d6), TOBN(0x954fa107, 0x4f425fe4),
5336 TOBN(0xd16aabf2, 0xe98aaa99), TOBN(0x90cd8ba0, 0x96b0f88a),
5337 TOBN(0x957f4782, 0xc154026a), TOBN(0x54ee0734, 0x52af56d2),
5338 TOBN(0xbcf89e54, 0x45b4147a), TOBN(0x3d102f21, 0x9a52816c),
5339 TOBN(0x6808517e, 0x39b62e77), TOBN(0x92e25421, 0x69169ad8),
5340 TOBN(0xd721d871, 0xbb608558), TOBN(0x60e4ebae, 0xf6d4ff9b),
5341 TOBN(0x0ba10819, 0x41f2763e), TOBN(0xca2e45be, 0x51ee3247),
5342 TOBN(0x66d172ec, 0x2bfd7a5f), TOBN(0x528a8f2f, 0x74d0b12d),
5343 TOBN(0xe17f1e38, 0xdabe70dc), TOBN(0x1d5d7316, 0x9f93983c),
5344 TOBN(0x51b2184a, 0xdf423e31), TOBN(0xcb417291, 0xaedb1a10),
5345 TOBN(0x2054ca93, 0x625bcab9), TOBN(0x54396860, 0xa98998f0),
5346 TOBN(0x4e53f6c4, 0xa54ae57e), TOBN(0x0ffeb590, 0xee648e9d),
5347 TOBN(0xfbbdaadc, 0x6afaf6bc), TOBN(0xf88ae796, 0xaa3bfb8a),
5348 TOBN(0x209f1d44, 0xd2359ed9), TOBN(0xac68dd03, 0xf3544ce2),
5349 TOBN(0xf378da47, 0xfd51e569), TOBN(0xe1abd860, 0x2cc80097),
5350 TOBN(0x23ca18d9, 0x343b6e3a), TOBN(0x480797e8, 0xb40a1bae),
5351 TOBN(0xd1f0c717, 0x533f3e67), TOBN(0x44896970, 0x06e6cdfc),
5352 TOBN(0x8ca21055, 0x52a82e8d), TOBN(0xb2caf785, 0x78460cdc),
5353 TOBN(0x4c1b7b62, 0xe9037178), TOBN(0xefc09d2c, 0xdb514b58),
5354 TOBN(0x5f2df9ee, 0x9113be5c), TOBN(0x2fbda78f, 0xb3f9271c),
5355 TOBN(0xe09a81af, 0x8f83fc54), TOBN(0x06b13866, 0x8afb5141),
5356 TOBN(0x38f6480f, 0x43e3865d), TOBN(0x72dd77a8, 0x1ddf47d9),
5357 TOBN(0xf2a8e971, 0x4c205ff7), TOBN(0x46d449d8, 0x9d088ad8),
5358 TOBN(0x926619ea, 0x185d706f), TOBN(0xe47e02eb, 0xc7dd7f62),
5359 TOBN(0xe7f120a7, 0x8cbc2031), TOBN(0xc18bef00, 0x998d4ac9),
5360 TOBN(0x18f37a9c, 0x6bdf22da), TOBN(0xefbc432f, 0x90dc82df),
5361 TOBN(0xc52cef8e, 0x5d703651), TOBN(0x82887ba0, 0xd99881a5),
5362 TOBN(0x7cec9dda, 0xb920ec1d), TOBN(0xd0d7e8c3, 0xec3e8d3b),
5363 TOBN(0x445bc395, 0x4ca88747), TOBN(0xedeaa2e0, 0x9fd53535),
5364 TOBN(0x461b1d93, 0x6cc87475), TOBN(0xd92a52e2, 0x6d2383bd),
5365 TOBN(0xfabccb59, 0xd7903546), TOBN(0x6111a761, 0x3d14b112),
5366 TOBN(0x0ae584fe, 0xb3d5f612), TOBN(0x5ea69b8d, 0x60e828ec),
5367 TOBN(0x6c078985, 0x54087030), TOBN(0x649cab04, 0xac4821fe),
5368 TOBN(0x25ecedcf, 0x8bdce214), TOBN(0xb5622f72, 0x86af7361),
5369 TOBN(0x0e1227aa, 0x7038b9e2), TOBN(0xd0efb273, 0xac20fa77),
5370 TOBN(0x817ff88b, 0x79df975b), TOBN(0x856bf286, 0x1999503e),
5371 TOBN(0xb4d5351f, 0x5038ec46), TOBN(0x740a52c5, 0xfc42af6e),
5372 TOBN(0x2e38bb15, 0x2cbb1a3f), TOBN(0xc3eb99fe, 0x17a83429),
5373 TOBN(0xca4fcbf1, 0xdd66bb74), TOBN(0x880784d6, 0xcde5e8fc),
5374 TOBN(0xddc84c1c, 0xb4e7a0be), TOBN(0x8780510d, 0xbd15a72f),
5375 TOBN(0x44bcf1af, 0x81ec30e1), TOBN(0x141e50a8, 0x0a61073e),
5376 TOBN(0x0d955718, 0x47be87ae), TOBN(0x68a61417, 0xf76a4372),
5377 TOBN(0xf57e7e87, 0xc607c3d3), TOBN(0x043afaf8, 0x5252f332),
5378 TOBN(0xcc14e121, 0x1552a4d2), TOBN(0xb6dee692, 0xbb4d4ab4),
5379 TOBN(0xb6ab74c8, 0xa03816a4), TOBN(0x84001ae4, 0x6f394a29),
5380 TOBN(0x5bed8344, 0xd795fb45), TOBN(0x57326e7d, 0xb79f55a5),
5381 TOBN(0xc9533ce0, 0x4accdffc), TOBN(0x53473caf, 0x3993fa04),
5382 TOBN(0x7906eb93, 0xa13df4c8), TOBN(0xa73e51f6, 0x97cbe46f),
5383 TOBN(0xd1ab3ae1, 0x0ae4ccf8), TOBN(0x25614508, 0x8a5b3dbc),
5384 TOBN(0x61eff962, 0x11a71b27), TOBN(0xdf71412b, 0x6bb7fa39),
5385 TOBN(0xb31ba6b8, 0x2bd7f3ef), TOBN(0xb0b9c415, 0x69180d29),
5386 TOBN(0xeec14552, 0x014cdde5), TOBN(0x702c624b, 0x227b4bbb),
5387 TOBN(0x2b15e8c2, 0xd3e988f3), TOBN(0xee3bcc6d, 0xa4f7fd04),
5388 TOBN(0x9d00822a, 0x42ac6c85), TOBN(0x2db0cea6, 0x1df9f2b7),
5389 TOBN(0xd7cad2ab, 0x42de1e58), TOBN(0x346ed526, 0x2d6fbb61),
5390 TOBN(0xb3962995, 0x1a2faf09), TOBN(0x2fa8a580, 0x7c25612e),
5391 TOBN(0x30ae04da, 0x7cf56490), TOBN(0x75662908, 0x0eea3961),
5392 TOBN(0x3609f5c5, 0x3d080847), TOBN(0xcb081d39, 0x5241d4f6),
5393 TOBN(0xb4fb3810, 0x77961a63), TOBN(0xc20c5984, 0x2abb66fc),
5394 TOBN(0x3d40aa7c, 0xf902f245), TOBN(0x9cb12736, 0x4e536b1e),
5395 TOBN(0x5eda24da, 0x99b3134f), TOBN(0xafbd9c69, 0x5cd011af),
5396 TOBN(0x9a16e30a, 0xc7088c7d), TOBN(0x5ab65710, 0x3207389f),
5397 TOBN(0x1b09547f, 0xe7407a53), TOBN(0x2322f9d7, 0x4fdc6eab),
5398 TOBN(0xc0f2f22d, 0x7430de4d), TOBN(0x19382696, 0xe68ca9a9),
5399 TOBN(0x17f1eff1, 0x918e5868), TOBN(0xe3b5b635, 0x586f4204),
5400 TOBN(0x146ef980, 0x3fbc4341), TOBN(0x359f2c80, 0x5b5eed4e),
5401 TOBN(0x9f35744e, 0x7482e41d), TOBN(0x9a9ac3ec, 0xf3b224c2),
5402 TOBN(0x9161a6fe, 0x91fc50ae), TOBN(0x89ccc66b, 0xc613fa7c),
5403 TOBN(0x89268b14, 0xc732f15a), TOBN(0x7cd6f4e2, 0xb467ed03),
5404 TOBN(0xfbf79869, 0xce56b40e), TOBN(0xf93e094c, 0xc02dde98),
5405 TOBN(0xefe0c3a8, 0xedee2cd7), TOBN(0x90f3ffc0, 0xb268fd42),
5406 TOBN(0x81a7fd56, 0x08241aed), TOBN(0x95ab7ad8, 0x00b1afe8),
5407 TOBN(0x40127056, 0x3e310d52), TOBN(0xd3ffdeb1, 0x09d9fc43),
5408 TOBN(0xc8f85c91, 0xd11a8594), TOBN(0x2e74d258, 0x31cf6db8),
5409 TOBN(0x829c7ca3, 0x02b5dfd0), TOBN(0xe389cfbe, 0x69143c86),
5410 TOBN(0xd01b6405, 0x941768d8), TOBN(0x45103995, 0x03bf825d),
5411 TOBN(0xcc4ee166, 0x56cd17e2), TOBN(0xbea3c283, 0xba037e79),
5412 TOBN(0x4e1ac06e, 0xd9a47520), TOBN(0xfbfe18aa, 0xaf852404),
5413 TOBN(0x5615f8e2, 0x8087648a), TOBN(0x7301e47e, 0xb9d150d9),
5414 TOBN(0x79f9f9dd, 0xb299b977), TOBN(0x76697a7b, 0xa5b78314),
5415 TOBN(0x10d67468, 0x7d7c90e7), TOBN(0x7afffe03, 0x937210b5),
5416 TOBN(0x5aef3e4b, 0x28c22cee), TOBN(0xefb0ecd8, 0x09fd55ae),
5417 TOBN(0x4cea7132, 0x0d2a5d6a), TOBN(0x9cfb5fa1, 0x01db6357),
5418 TOBN(0x395e0b57, 0xf36e1ac5), TOBN(0x008fa9ad, 0x36cafb7d),
5419 TOBN(0x8f6cdf70, 0x5308c4db), TOBN(0x51527a37, 0x95ed2477),
5420 TOBN(0xba0dee30, 0x5bd21311), TOBN(0x6ed41b22, 0x909c90d7),
5421 TOBN(0xc5f6b758, 0x7c8696d3), TOBN(0x0db8eaa8, 0x3ce83a80),
5422 TOBN(0xd297fe37, 0xb24b4b6f), TOBN(0xfe58afe8, 0x522d1f0d),
5423 TOBN(0x97358736, 0x8c98dbd9), TOBN(0x6bc226ca, 0x9454a527),
5424 TOBN(0xa12b384e, 0xce53c2d0), TOBN(0x779d897d, 0x5e4606da),
5425 TOBN(0xa53e47b0, 0x73ec12b0), TOBN(0x462dbbba, 0x5756f1ad),
5426 TOBN(0x69fe09f2, 0xcafe37b6), TOBN(0x273d1ebf, 0xecce2e17),
5427 TOBN(0x8ac1d538, 0x3cf607fd), TOBN(0x8035f7ff, 0x12e10c25),
5428 },
5429 {
5430 TOBN(0x854d34c7, 0x7e6c5520), TOBN(0xc27df9ef, 0xdcb9ea58),
5431 TOBN(0x405f2369, 0xd686666d), TOBN(0x29d1febf, 0x0417aa85),
5432 TOBN(0x9846819e, 0x93470afe), TOBN(0x3e6a9669, 0xe2a27f9e),
5433 TOBN(0x24d008a2, 0xe31e6504), TOBN(0xdba7cecf, 0x9cb7680a),
5434 TOBN(0xecaff541, 0x338d6e43), TOBN(0x56f7dd73, 0x4541d5cc),
5435 TOBN(0xb5d426de, 0x96bc88ca), TOBN(0x48d94f6b, 0x9ed3a2c3),
5436 TOBN(0x6354a3bb, 0x2ef8279c), TOBN(0xd575465b, 0x0b1867f2),
5437 TOBN(0xef99b0ff, 0x95225151), TOBN(0xf3e19d88, 0xf94500d8),
5438 TOBN(0x92a83268, 0xe32dd620), TOBN(0x913ec99f, 0x627849a2),
5439 TOBN(0xedd8fdfa, 0x2c378882), TOBN(0xaf96f33e, 0xee6f8cfe),
5440 TOBN(0xc06737e5, 0xdc3fa8a5), TOBN(0x236bb531, 0xb0b03a1d),
5441 TOBN(0x33e59f29, 0x89f037b0), TOBN(0x13f9b5a7, 0xd9a12a53),
5442 TOBN(0x0d0df6ce, 0x51efb310), TOBN(0xcb5b2eb4, 0x958df5be),
5443 TOBN(0xd6459e29, 0x36158e59), TOBN(0x82aae2b9, 0x1466e336),
5444 TOBN(0xfb658a39, 0x411aa636), TOBN(0x7152ecc5, 0xd4c0a933),
5445 TOBN(0xf10c758a, 0x49f026b7), TOBN(0xf4837f97, 0xcb09311f),
5446 TOBN(0xddfb02c4, 0xc753c45f), TOBN(0x18ca81b6, 0xf9c840fe),
5447 TOBN(0x846fd09a, 0xb0f8a3e6), TOBN(0xb1162add, 0xe7733dbc),
5448 TOBN(0x7070ad20, 0x236e3ab6), TOBN(0xf88cdaf5, 0xb2a56326),
5449 TOBN(0x05fc8719, 0x997cbc7a), TOBN(0x442cd452, 0x4b665272),
5450 TOBN(0x7807f364, 0xb71698f5), TOBN(0x6ba418d2, 0x9f7b605e),
5451 TOBN(0xfd20b00f, 0xa03b2cbb), TOBN(0x883eca37, 0xda54386f),
5452 TOBN(0xff0be43f, 0xf3437f24), TOBN(0xe910b432, 0xa48bb33c),
5453 TOBN(0x4963a128, 0x329df765), TOBN(0xac1dd556, 0xbe2fe6f7),
5454 TOBN(0x557610f9, 0x24a0a3fc), TOBN(0x38e17bf4, 0xe881c3f9),
5455 TOBN(0x6ba84faf, 0xed0dac99), TOBN(0xd4a222c3, 0x59eeb918),
5456 TOBN(0xc79c1dbe, 0x13f542b6), TOBN(0x1fc65e0d, 0xe425d457),
5457 TOBN(0xeffb754f, 0x1debb779), TOBN(0x638d8fd0, 0x9e08af60),
5458 TOBN(0x994f523a, 0x626332d5), TOBN(0x7bc38833, 0x5561bb44),
5459 TOBN(0x005ed4b0, 0x3d845ea2), TOBN(0xd39d3ee1, 0xc2a1f08a),
5460 TOBN(0x6561fdd3, 0xe7676b0d), TOBN(0x620e35ff, 0xfb706017),
5461 TOBN(0x36ce424f, 0xf264f9a8), TOBN(0xc4c3419f, 0xda2681f7),
5462 TOBN(0xfb6afd2f, 0x69beb6e8), TOBN(0x3a50b993, 0x6d700d03),
5463 TOBN(0xc840b2ad, 0x0c83a14f), TOBN(0x573207be, 0x54085bef),
5464 TOBN(0x5af882e3, 0x09fe7e5b), TOBN(0x957678a4, 0x3b40a7e1),
5465 TOBN(0x172d4bdd, 0x543056e2), TOBN(0x9c1b26b4, 0x0df13c0a),
5466 TOBN(0x1c30861c, 0xf405ff06), TOBN(0xebac86bd, 0x486e828b),
5467 TOBN(0xe791a971, 0x636933fc), TOBN(0x50e7c2be, 0x7aeee947),
5468 TOBN(0xc3d4a095, 0xfa90d767), TOBN(0xae60eb7b, 0xe670ab7b),
5469 TOBN(0x17633a64, 0x397b056d), TOBN(0x93a21f33, 0x105012aa),
5470 TOBN(0x663c370b, 0xabb88643), TOBN(0x91df36d7, 0x22e21599),
5471 TOBN(0x183ba835, 0x8b761671), TOBN(0x381eea1d, 0x728f3bf1),
5472 TOBN(0xb9b2f1ba, 0x39966e6c), TOBN(0x7c464a28, 0xe7295492),
5473 TOBN(0x0fd5f70a, 0x09b26b7f), TOBN(0xa9aba1f9, 0xfbe009df),
5474 TOBN(0x857c1f22, 0x369b87ad), TOBN(0x3c00e5d9, 0x32fca556),
5475 TOBN(0x1ad74cab, 0x90b06466), TOBN(0xa7112386, 0x550faaf2),
5476 TOBN(0x7435e198, 0x6d9bd5f5), TOBN(0x2dcc7e38, 0x59c3463f),
5477 TOBN(0xdc7df748, 0xca7bd4b2), TOBN(0x13cd4c08, 0x9dec2f31),
5478 TOBN(0x0d3b5df8, 0xe3237710), TOBN(0x0dadb26e, 0xcbd2f7b0),
5479 TOBN(0x9f5966ab, 0xe4aa082b), TOBN(0x666ec8de, 0x350e966e),
5480 TOBN(0x1bfd1ed5, 0xee524216), TOBN(0xcd93c59b, 0x41dab0b6),
5481 TOBN(0x658a8435, 0xd186d6ba), TOBN(0x1b7d34d2, 0x159d1195),
5482 TOBN(0x5936e460, 0x22caf46b), TOBN(0x6a45dd8f, 0x9a96fe4f),
5483 TOBN(0xf7925434, 0xb98f474e), TOBN(0x41410412, 0x0053ef15),
5484 TOBN(0x71cf8d12, 0x41de97bf), TOBN(0xb8547b61, 0xbd80bef4),
5485 TOBN(0xb47d3970, 0xc4db0037), TOBN(0xf1bcd328, 0xfef20dff),
5486 TOBN(0x31a92e09, 0x10caad67), TOBN(0x1f591960, 0x5531a1e1),
5487 TOBN(0x3bb852e0, 0x5f4fc840), TOBN(0x63e297ca, 0x93a72c6c),
5488 TOBN(0x3c2b0b2e, 0x49abad67), TOBN(0x6ec405fc, 0xed3db0d9),
5489 TOBN(0xdc14a530, 0x7fef1d40), TOBN(0xccd19846, 0x280896fc),
5490 TOBN(0x00f83176, 0x9bb81648), TOBN(0xd69eb485, 0x653120d0),
5491 TOBN(0xd17d75f4, 0x4ccabc62), TOBN(0x34a07f82, 0xb749fcb1),
5492 TOBN(0x2c3af787, 0xbbfb5554), TOBN(0xb06ed4d0, 0x62e283f8),
5493 TOBN(0x5722889f, 0xa19213a0), TOBN(0x162b085e, 0xdcf3c7b4),
5494 TOBN(0xbcaecb31, 0xe0dd3eca), TOBN(0xc6237fbc, 0xe52f13a5),
5495 TOBN(0xcc2b6b03, 0x27bac297), TOBN(0x2ae1cac5, 0xb917f54a),
5496 TOBN(0x474807d4, 0x7845ae4f), TOBN(0xfec7dd92, 0xce5972e0),
5497 TOBN(0xc3bd2541, 0x1d7915bb), TOBN(0x66f85dc4, 0xd94907ca),
5498 TOBN(0xd981b888, 0xbdbcf0ca), TOBN(0xd75f5da6, 0xdf279e9f),
5499 TOBN(0x128bbf24, 0x7054e934), TOBN(0x3c6ff6e5, 0x81db134b),
5500 TOBN(0x795b7cf4, 0x047d26e4), TOBN(0xf370f7b8, 0x5049ec37),
5501 TOBN(0xc6712d4d, 0xced945af), TOBN(0xdf30b5ec, 0x095642bc),
5502 TOBN(0x9b034c62, 0x4896246e), TOBN(0x5652c016, 0xee90bbd1),
5503 TOBN(0xeb38636f, 0x87fedb73), TOBN(0x5e32f847, 0x0135a613),
5504 TOBN(0x0703b312, 0xcf933c83), TOBN(0xd05bb76e, 0x1a7f47e6),
5505 TOBN(0x825e4f0c, 0x949c2415), TOBN(0x569e5622, 0x7250d6f8),
5506 TOBN(0xbbe9eb3a, 0x6568013e), TOBN(0x8dbd203f, 0x22f243fc),
5507 TOBN(0x9dbd7694, 0xb342734a), TOBN(0x8f6d12f8, 0x46afa984),
5508 TOBN(0xb98610a2, 0xc9eade29), TOBN(0xbab4f323, 0x47dd0f18),
5509 TOBN(0x5779737b, 0x671c0d46), TOBN(0x10b6a7c6, 0xd3e0a42a),
5510 TOBN(0xfb19ddf3, 0x3035b41c), TOBN(0xd336343f, 0x99c45895),
5511 TOBN(0x61fe4938, 0x54c857e5), TOBN(0xc4d506be, 0xae4e57d5),
5512 TOBN(0x3cd8c8cb, 0xbbc33f75), TOBN(0x7281f08a, 0x9262c77d),
5513 TOBN(0x083f4ea6, 0xf11a2823), TOBN(0x8895041e, 0x9fba2e33),
5514 TOBN(0xfcdfea49, 0x9c438edf), TOBN(0x7678dcc3, 0x91edba44),
5515 TOBN(0xf07b3b87, 0xe2ba50f0), TOBN(0xc13888ef, 0x43948c1b),
5516 TOBN(0xc2135ad4, 0x1140af42), TOBN(0x8e5104f3, 0x926ed1a7),
5517 TOBN(0xf24430cb, 0x88f6695f), TOBN(0x0ce0637b, 0x6d73c120),
5518 TOBN(0xb2db01e6, 0xfe631e8f), TOBN(0x1c5563d7, 0xd7bdd24b),
5519 TOBN(0x8daea3ba, 0x369ad44f), TOBN(0x000c81b6, 0x8187a9f9),
5520 TOBN(0x5f48a951, 0xaae1fd9a), TOBN(0xe35626c7, 0x8d5aed8a),
5521 TOBN(0x20952763, 0x0498c622), TOBN(0x76d17634, 0x773aa504),
5522 TOBN(0x36d90dda, 0xeb300f7a), TOBN(0x9dcf7dfc, 0xedb5e801),
5523 TOBN(0x645cb268, 0x74d5244c), TOBN(0xa127ee79, 0x348e3aa2),
5524 TOBN(0x488acc53, 0x575f1dbb), TOBN(0x95037e85, 0x80e6161e),
5525 TOBN(0x57e59283, 0x292650d0), TOBN(0xabe67d99, 0x14938216),
5526 TOBN(0x3c7f944b, 0x3f8e1065), TOBN(0xed908cb6, 0x330e8924),
5527 TOBN(0x08ee8fd5, 0x6f530136), TOBN(0x2227b7d5, 0xd7ffc169),
5528 TOBN(0x4f55c893, 0xb5cd6dd5), TOBN(0x82225e11, 0xa62796e8),
5529 TOBN(0x5c6cead1, 0xcb18e12c), TOBN(0x4381ae0c, 0x84f5a51a),
5530 TOBN(0x345913d3, 0x7fafa4c8), TOBN(0x3d918082, 0x0491aac0),
5531 TOBN(0x9347871f, 0x3e69264c), TOBN(0xbea9dd3c, 0xb4f4f0cd),
5532 TOBN(0xbda5d067, 0x3eadd3e7), TOBN(0x0033c1b8, 0x0573bcd8),
5533 TOBN(0x25589379, 0x5da2486c), TOBN(0xcb89ee5b, 0x86abbee7),
5534 TOBN(0x8fe0a8f3, 0x22532e5d), TOBN(0xb6410ff0, 0x727dfc4c),
5535 TOBN(0x619b9d58, 0x226726db), TOBN(0x5ec25669, 0x7a2b2dc7),
5536 TOBN(0xaf4d2e06, 0x4c3beb01), TOBN(0x852123d0, 0x7acea556),
5537 TOBN(0x0e9470fa, 0xf783487a), TOBN(0x75a7ea04, 0x5664b3eb),
5538 TOBN(0x4ad78f35, 0x6798e4ba), TOBN(0x9214e6e5, 0xc7d0e091),
5539 TOBN(0xc420b488, 0xb1290403), TOBN(0x64049e0a, 0xfc295749),
5540 TOBN(0x03ef5af1, 0x3ae9841f), TOBN(0xdbe4ca19, 0xb0b662a6),
5541 TOBN(0x46845c5f, 0xfa453458), TOBN(0xf8dabf19, 0x10b66722),
5542 TOBN(0xb650f0aa, 0xcce2793b), TOBN(0x71db851e, 0xc5ec47c1),
5543 TOBN(0x3eb78f3e, 0x3b234fa9), TOBN(0xb0c60f35, 0xfc0106ce),
5544 TOBN(0x05427121, 0x774eadbd), TOBN(0x25367faf, 0xce323863),
5545 TOBN(0x7541b5c9, 0xcd086976), TOBN(0x4ff069e2, 0xdc507ad1),
5546 TOBN(0x74145256, 0x8776e667), TOBN(0x6e76142c, 0xb23c6bb5),
5547 TOBN(0xdbf30712, 0x1b3a8a87), TOBN(0x60e7363e, 0x98450836),
5548 TOBN(0x5741450e, 0xb7366d80), TOBN(0xe4ee14ca, 0x4837dbdf),
5549 TOBN(0xa765eb9b, 0x69d4316f), TOBN(0x04548dca, 0x8ef43825),
5550 TOBN(0x9c9f4e4c, 0x5ae888eb), TOBN(0x733abb51, 0x56e9ac99),
5551 TOBN(0xdaad3c20, 0xba6ac029), TOBN(0x9b8dd3d3, 0x2ba3e38e),
5552 TOBN(0xa9bb4c92, 0x0bc5d11a), TOBN(0xf20127a7, 0x9c5f88a3),
5553 TOBN(0x4f52b06e, 0x161d3cb8), TOBN(0x26c1ff09, 0x6afaf0a6),
5554 TOBN(0x32670d2f, 0x7189e71f), TOBN(0xc6438748, 0x5ecf91e7),
5555 TOBN(0x15758e57, 0xdb757a21), TOBN(0x427d09f8, 0x290a9ce5),
5556 TOBN(0x846a308f, 0x38384a7a), TOBN(0xaac3acb4, 0xb0732b99),
5557 TOBN(0x9e941009, 0x17845819), TOBN(0x95cba111, 0xa7ce5e03),
5558 TOBN(0x6f3d4f7f, 0xb00009c4), TOBN(0xb8396c27, 0x8ff28b5f),
5559 TOBN(0xb1a9ae43, 0x1c97975d), TOBN(0x9d7ba8af, 0xe5d9fed5),
5560 TOBN(0x338cf09f, 0x34f485b6), TOBN(0xbc0ddacc, 0x64122516),
5561 TOBN(0xa450da12, 0x05d471fe), TOBN(0x4c3a6250, 0x628dd8c9),
5562 TOBN(0x69c7d103, 0xd1295837), TOBN(0xa2893e50, 0x3807eb2f),
5563 TOBN(0xd6e1e1de, 0xbdb41491), TOBN(0xc630745b, 0x5e138235),
5564 TOBN(0xc892109e, 0x48661ae1), TOBN(0x8d17e7eb, 0xea2b2674),
5565 TOBN(0x00ec0f87, 0xc328d6b5), TOBN(0x6d858645, 0xf079ff9e),
5566 TOBN(0x6cdf243e, 0x19115ead), TOBN(0x1ce1393e, 0x4bac4fcf),
5567 TOBN(0x2c960ed0, 0x9c29f25b), TOBN(0x59be4d8e, 0x9d388a05),
5568 TOBN(0x0d46e06c, 0xd0def72b), TOBN(0xb923db5d, 0xe0342748),
5569 TOBN(0xf7d3aacd, 0x936d4a3d), TOBN(0x558519cc, 0x0b0b099e),
5570 TOBN(0x3ea8ebf8, 0x827097ef), TOBN(0x259353db, 0xd054f55d),
5571 TOBN(0x84c89abc, 0x6d2ed089), TOBN(0x5c548b69, 0x8e096a7c),
5572 TOBN(0xd587f616, 0x994b995d), TOBN(0x4d1531f6, 0xa5845601),
5573 TOBN(0x792ab31e, 0x451fd9f0), TOBN(0xc8b57bb2, 0x65adf6ca),
5574 TOBN(0x68440fcb, 0x1cd5ad73), TOBN(0xb9c860e6, 0x6144da4f),
5575 TOBN(0x2ab286aa, 0x8462beb8), TOBN(0xcc6b8fff, 0xef46797f),
5576 TOBN(0xac820da4, 0x20c8a471), TOBN(0x69ae05a1, 0x77ff7faf),
5577 TOBN(0xb9163f39, 0xbfb5da77), TOBN(0xbd03e590, 0x2c73ab7a),
5578 TOBN(0x7e862b5e, 0xb2940d9e), TOBN(0x3c663d86, 0x4b9af564),
5579 TOBN(0xd8309031, 0xbde3033d), TOBN(0x298231b2, 0xd42c5bc6),
5580 TOBN(0x42090d2c, 0x552ad093), TOBN(0xa4799d1c, 0xff854695),
5581 TOBN(0x0a88b5d6, 0xd31f0d00), TOBN(0xf8b40825, 0xa2f26b46),
5582 TOBN(0xec29b1ed, 0xf1bd7218), TOBN(0xd491c53b, 0x4b24c86e),
5583 TOBN(0xd2fe588f, 0x3395ea65), TOBN(0x6f3764f7, 0x4456ef15),
5584 TOBN(0xdb43116d, 0xcdc34800), TOBN(0xcdbcd456, 0xc1e33955),
5585 TOBN(0xefdb5540, 0x74ab286b), TOBN(0x948c7a51, 0xd18c5d7c),
5586 TOBN(0xeb81aa37, 0x7378058e), TOBN(0x41c746a1, 0x04411154),
5587 TOBN(0xa10c73bc, 0xfb828ac7), TOBN(0x6439be91, 0x9d972b29),
5588 TOBN(0x4bf3b4b0, 0x43a2fbad), TOBN(0x39e6dadf, 0x82b5e840),
5589 TOBN(0x4f716408, 0x6397bd4c), TOBN(0x0f7de568, 0x7f1eeccb),
5590 TOBN(0x5865c5a1, 0xd2ffbfc1), TOBN(0xf74211fa, 0x4ccb6451),
5591 TOBN(0x66368a88, 0xc0b32558), TOBN(0x5b539dc2, 0x9ad7812e),
5592 TOBN(0x579483d0, 0x2f3af6f6), TOBN(0x52132078, 0x99934ece),
5593 TOBN(0x50b9650f, 0xdcc9e983), TOBN(0xca989ec9, 0xaee42b8a),
5594 TOBN(0x6a44c829, 0xd6f62f99), TOBN(0x8f06a309, 0x4c2a7c0c),
5595 TOBN(0x4ea2b3a0, 0x98a0cb0a), TOBN(0x5c547b70, 0xbeee8364),
5596 TOBN(0x461d40e1, 0x682afe11), TOBN(0x9e0fc77a, 0x7b41c0a8),
5597 TOBN(0x79e4aefd, 0xe20d5d36), TOBN(0x2916e520, 0x32dd9f63),
5598 TOBN(0xf59e52e8, 0x3f883faf), TOBN(0x396f9639, 0x2b868d35),
5599 TOBN(0xc902a9df, 0x4ca19881), TOBN(0x0fc96822, 0xdb2401a6),
5600 TOBN(0x41237587, 0x66f1c68d), TOBN(0x10fc6de3, 0xfb476c0d),
5601 TOBN(0xf8b6b579, 0x841f5d90), TOBN(0x2ba8446c, 0xfa24f44a),
5602 TOBN(0xa237b920, 0xef4a9975), TOBN(0x60bb6004, 0x2330435f),
5603 TOBN(0xd6f4ab5a, 0xcfb7e7b5), TOBN(0xb2ac5097, 0x83435391),
5604 TOBN(0xf036ee2f, 0xb0d1ea67), TOBN(0xae779a6a, 0x74c56230),
5605 TOBN(0x59bff8c8, 0xab838ae6), TOBN(0xcd83ca99, 0x9b38e6f0),
5606 TOBN(0xbb27bef5, 0xe33deed3), TOBN(0xe6356f6f, 0x001892a8),
5607 TOBN(0xbf3be6cc, 0x7adfbd3e), TOBN(0xaecbc81c, 0x33d1ac9d),
5608 TOBN(0xe4feb909, 0xe6e861dc), TOBN(0x90a247a4, 0x53f5f801),
5609 TOBN(0x01c50acb, 0x27346e57), TOBN(0xce29242e, 0x461acc1b),
5610 TOBN(0x04dd214a, 0x2f998a91), TOBN(0x271ee9b1, 0xd4baf27b),
5611 TOBN(0x7e3027d1, 0xe8c26722), TOBN(0x21d1645c, 0x1820dce5),
5612 TOBN(0x086f242c, 0x7501779c), TOBN(0xf0061407, 0xfa0e8009),
5613 TOBN(0xf23ce477, 0x60187129), TOBN(0x05bbdedb, 0x0fde9bd0),
5614 TOBN(0x682f4832, 0x25d98473), TOBN(0xf207fe85, 0x5c658427),
5615 TOBN(0xb6fdd7ba, 0x4166ffa1), TOBN(0x0c314056, 0x9eed799d),
5616 TOBN(0x0db8048f, 0x4107e28f), TOBN(0x74ed3871, 0x41216840),
5617 TOBN(0x74489f8f, 0x56a3c06e), TOBN(0x1e1c005b, 0x12777134),
5618 TOBN(0xdb332a73, 0xf37ec3c3), TOBN(0xc65259bd, 0xdd59eba0),
5619 TOBN(0x2291709c, 0xdb4d3257), TOBN(0x9a793b25, 0xbd389390),
5620 TOBN(0xf39fe34b, 0xe43756f0), TOBN(0x2f76bdce, 0x9afb56c9),
5621 TOBN(0x9f37867a, 0x61208b27), TOBN(0xea1d4307, 0x089972c3),
5622 TOBN(0x8c595330, 0x8bdf623a), TOBN(0x5f5accda, 0x8441fb7d),
5623 TOBN(0xfafa9418, 0x32ddfd95), TOBN(0x6ad40c5a, 0x0fde9be7),
5624 TOBN(0x43faba89, 0xaeca8709), TOBN(0xc64a7cf1, 0x2c248a9d),
5625 TOBN(0x16620252, 0x72637a76), TOBN(0xaee1c791, 0x22b8d1bb),
5626 TOBN(0xf0f798fd, 0x21a843b2), TOBN(0x56e4ed4d, 0x8d005cb1),
5627 TOBN(0x355f7780, 0x1f0d8abe), TOBN(0x197b04cf, 0x34522326),
5628 TOBN(0x41f9b31f, 0xfd42c13f), TOBN(0x5ef7feb2, 0xb40f933d),
5629 TOBN(0x27326f42, 0x5d60bad4), TOBN(0x027ecdb2, 0x8c92cf89),
5630 TOBN(0x04aae4d1, 0x4e3352fe), TOBN(0x08414d2f, 0x73591b90),
5631 TOBN(0x5ed6124e, 0xb7da7d60), TOBN(0xb985b931, 0x4d13d4ec),
5632 TOBN(0xa592d3ab, 0x96bf36f9), TOBN(0x012dbed5, 0xbbdf51df),
5633 TOBN(0xa57963c0, 0xdf6c177d), TOBN(0x010ec869, 0x87ca29cf),
5634 TOBN(0xba1700f6, 0xbf926dff), TOBN(0x7c9fdbd1, 0xf4bf6bc2),
5635 TOBN(0xdc18dc8f, 0x64da11f5), TOBN(0xa6074b7a, 0xd938ae75),
5636 TOBN(0x14270066, 0xe84f44a4), TOBN(0x99998d38, 0xd27b954e),
5637 TOBN(0xc1be8ab2, 0xb4f38e9a), TOBN(0x8bb55bbf, 0x15c01016),
5638 TOBN(0xf73472b4, 0x0ea2ab30), TOBN(0xd365a340, 0xf73d68dd),
5639 TOBN(0xc01a7168, 0x19c2e1eb), TOBN(0x32f49e37, 0x34061719),
5640 TOBN(0xb73c57f1, 0x01d8b4d6), TOBN(0x03c8423c, 0x26b47700),
5641 TOBN(0x321d0bc8, 0xa4d8826a), TOBN(0x6004213c, 0x4bc0e638),
5642 TOBN(0xf78c64a1, 0xc1c06681), TOBN(0x16e0a16f, 0xef018e50),
5643 TOBN(0x31cbdf91, 0xdb42b2b3), TOBN(0xf8f4ffce, 0xe0d36f58),
5644 TOBN(0xcdcc71cd, 0x4cc5e3e0), TOBN(0xd55c7cfa, 0xa129e3e0),
5645 TOBN(0xccdb6ba0, 0x0fb2cbf1), TOBN(0x6aba0005, 0xc4bce3cb),
5646 TOBN(0x501cdb30, 0xd232cfc4), TOBN(0x9ddcf12e, 0xd58a3cef),
5647 TOBN(0x02d2cf9c, 0x87e09149), TOBN(0xdc5d7ec7, 0x2c976257),
5648 TOBN(0x6447986e, 0x0b50d7dd), TOBN(0x88fdbaf7, 0x807f112a),
5649 TOBN(0x58c9822a, 0xb00ae9f6), TOBN(0x6abfb950, 0x6d3d27e0),
5650 TOBN(0xd0a74487, 0x8a429f4f), TOBN(0x0649712b, 0xdb516609),
5651 TOBN(0xb826ba57, 0xe769b5df), TOBN(0x82335df2, 0x1fc7aaf2),
5652 TOBN(0x2389f067, 0x5c93d995), TOBN(0x59ac367a, 0x68677be6),
5653 TOBN(0xa77985ff, 0x21d9951b), TOBN(0x038956fb, 0x85011cce),
5654 TOBN(0x608e48cb, 0xbb734e37), TOBN(0xc08c0bf2, 0x2be5b26f),
5655 TOBN(0x17bbdd3b, 0xf9b1a0d9), TOBN(0xeac7d898, 0x10483319),
5656 TOBN(0xc95c4baf, 0xbc1a6dea), TOBN(0xfdd0e2bf, 0x172aafdb),
5657 TOBN(0x40373cbc, 0x8235c41a), TOBN(0x14303f21, 0xfb6f41d5),
5658 TOBN(0xba063621, 0x0408f237), TOBN(0xcad3b09a, 0xecd2d1ed),
5659 TOBN(0x4667855a, 0x52abb6a2), TOBN(0xba9157dc, 0xaa8b417b),
5660 TOBN(0xfe7f3507, 0x4f013efb), TOBN(0x1b112c4b, 0xaa38c4a2),
5661 TOBN(0xa1406a60, 0x9ba64345), TOBN(0xe53cba33, 0x6993c80b),
5662 TOBN(0x45466063, 0xded40d23), TOBN(0x3d5f1f4d, 0x54908e25),
5663 TOBN(0x9ebefe62, 0x403c3c31), TOBN(0x274ea0b5, 0x0672a624),
5664 TOBN(0xff818d99, 0x451d1b71), TOBN(0x80e82643, 0x8f79cf79),
5665 TOBN(0xa165df13, 0x73ce37f5), TOBN(0xa744ef4f, 0xfe3a21fd),
5666 TOBN(0x73f1e7f5, 0xcf551396), TOBN(0xc616898e, 0x868c676b),
5667 TOBN(0x671c28c7, 0x8c442c36), TOBN(0xcfe5e558, 0x5e0a317d),
5668 TOBN(0x1242d818, 0x7051f476), TOBN(0x56fad2a6, 0x14f03442),
5669 TOBN(0x262068bc, 0x0a44d0f6), TOBN(0xdfa2cd6e, 0xce6edf4e),
5670 TOBN(0x0f43813a, 0xd15d1517), TOBN(0x61214cb2, 0x377d44f5),
5671 TOBN(0xd399aa29, 0xc639b35f), TOBN(0x42136d71, 0x54c51c19),
5672 TOBN(0x9774711b, 0x08417221), TOBN(0x0a5546b3, 0x52545a57),
5673 TOBN(0x80624c41, 0x1150582d), TOBN(0x9ec5c418, 0xfbc555bc),
5674 TOBN(0x2c87dcad, 0x771849f1), TOBN(0xb0c932c5, 0x01d7bf6f),
5675 TOBN(0x6aa5cd3e, 0x89116eb2), TOBN(0xd378c25a, 0x51ca7bd3),
5676 TOBN(0xc612a0da, 0x9e6e3e31), TOBN(0x0417a54d, 0xb68ad5d0),
5677 TOBN(0x00451e4a, 0x22c6edb8), TOBN(0x9fbfe019, 0xb42827ce),
5678 TOBN(0x2fa92505, 0xba9384a2), TOBN(0x21b8596e, 0x64ad69c1),
5679 TOBN(0x8f4fcc49, 0x983b35a6), TOBN(0xde093760, 0x72754672),
5680 TOBN(0x2f14ccc8, 0xf7bffe6d), TOBN(0x27566bff, 0x5d94263d),
5681 TOBN(0xb5b4e9c6, 0x2df3ec30), TOBN(0x94f1d7d5, 0x3e6ea6ba),
5682 TOBN(0x97b7851a, 0xaaca5e9b), TOBN(0x518aa521, 0x56713b97),
5683 TOBN(0x3357e8c7, 0x150a61f6), TOBN(0x7842e7e2, 0xec2c2b69),
5684 TOBN(0x8dffaf65, 0x6868a548), TOBN(0xd963bd82, 0xe068fc81),
5685 TOBN(0x64da5c8b, 0x65917733), TOBN(0x927090ff, 0x7b247328),
5686 },
5687 {
5688 TOBN(0x214bc9a7, 0xd298c241), TOBN(0xe3b697ba, 0x56807cfd),
5689 TOBN(0xef1c7802, 0x4564eadb), TOBN(0xdde8cdcf, 0xb48149c5),
5690 TOBN(0x946bf0a7, 0x5a4d2604), TOBN(0x27154d7f, 0x6c1538af),
5691 TOBN(0x95cc9230, 0xde5b1fcc), TOBN(0xd88519e9, 0x66864f82),
5692 TOBN(0xb828dd1a, 0x7cb1282c), TOBN(0xa08d7626, 0xbe46973a),
5693 TOBN(0x6baf8d40, 0xe708d6b2), TOBN(0x72571fa1, 0x4daeb3f3),
5694 TOBN(0x85b1732f, 0xf22dfd98), TOBN(0x87ab01a7, 0x0087108d),
5695 TOBN(0xaaaafea8, 0x5988207a), TOBN(0xccc832f8, 0x69f00755),
5696 TOBN(0x964d950e, 0x36ff3bf0), TOBN(0x8ad20f6f, 0xf0b34638),
5697 TOBN(0x4d9177b3, 0xb5d7585f), TOBN(0xcf839760, 0xef3f019f),
5698 TOBN(0x582fc5b3, 0x8288c545), TOBN(0x2f8e4e9b, 0x13116bd1),
5699 TOBN(0xf91e1b2f, 0x332120ef), TOBN(0xcf568724, 0x2a17dd23),
5700 TOBN(0x488f1185, 0xca8d9d1a), TOBN(0xadf2c77d, 0xd987ded2),
5701 TOBN(0x5f3039f0, 0x60c46124), TOBN(0xe5d70b75, 0x71e095f4),
5702 TOBN(0x82d58650, 0x6260e70f), TOBN(0x39d75ea7, 0xf750d105),
5703 TOBN(0x8cf3d0b1, 0x75bac364), TOBN(0xf3a7564d, 0x21d01329),
5704 TOBN(0x182f04cd, 0x2f52d2a7), TOBN(0x4fde149a, 0xe2df565a),
5705 TOBN(0xb80c5eec, 0xa79fb2f7), TOBN(0xab491d7b, 0x22ddc897),
5706 TOBN(0x99d76c18, 0xc6312c7f), TOBN(0xca0d5f3d, 0x6aa41a57),
5707 TOBN(0x71207325, 0xd15363a0), TOBN(0xe82aa265, 0xbeb252c2),
5708 TOBN(0x94ab4700, 0xec3128c2), TOBN(0x6c76d862, 0x8e383f49),
5709 TOBN(0xdc36b150, 0xc03024eb), TOBN(0xfb439477, 0x53daac69),
5710 TOBN(0xfc68764a, 0x8dc79623), TOBN(0x5b86995d, 0xb440fbb2),
5711 TOBN(0xd66879bf, 0xccc5ee0d), TOBN(0x05228942, 0x95aa8bd3),
5712 TOBN(0xb51a40a5, 0x1e6a75c1), TOBN(0x24327c76, 0x0ea7d817),
5713 TOBN(0x06630182, 0x07774597), TOBN(0xd6fdbec3, 0x97fa7164),
5714 TOBN(0x20c99dfb, 0x13c90f48), TOBN(0xd6ac5273, 0x686ef263),
5715 TOBN(0xc6a50bdc, 0xfef64eeb), TOBN(0xcd87b281, 0x86fdfc32),
5716 TOBN(0xb24aa43e, 0x3fcd3efc), TOBN(0xdd26c034, 0xb8088e9a),
5717 TOBN(0xa5ef4dc9, 0xbd3d46ea), TOBN(0xa2f99d58, 0x8a4c6a6f),
5718 TOBN(0xddabd355, 0x2f1da46c), TOBN(0x72c3f8ce, 0x1afacdd1),
5719 TOBN(0xd90c4eee, 0x92d40578), TOBN(0xd28bb41f, 0xca623b94),
5720 TOBN(0x50fc0711, 0x745edc11), TOBN(0x9dd9ad7d, 0x3dc87558),
5721 TOBN(0xce6931fb, 0xb49d1e64), TOBN(0x6c77a0a2, 0xc98bd0f9),
5722 TOBN(0x62b9a629, 0x6baf7cb1), TOBN(0xcf065f91, 0xccf72d22),
5723 TOBN(0x7203cce9, 0x79639071), TOBN(0x09ae4885, 0xf9cb732f),
5724 TOBN(0x5e7c3bec, 0xee8314f3), TOBN(0x1c068aed, 0xdbea298f),
5725 TOBN(0x08d381f1, 0x7c80acec), TOBN(0x03b56be8, 0xe330495b),
5726 TOBN(0xaeffb8f2, 0x9222882d), TOBN(0x95ff38f6, 0xc4af8bf7),
5727 TOBN(0x50e32d35, 0x1fc57d8c), TOBN(0x6635be52, 0x17b444f0),
5728 TOBN(0x04d15276, 0xa5177900), TOBN(0x4e1dbb47, 0xf6858752),
5729 TOBN(0x5b475622, 0xc615796c), TOBN(0xa6fa0387, 0x691867bf),
5730 TOBN(0xed7f5d56, 0x2844c6d0), TOBN(0xc633cf9b, 0x03a2477d),
5731 TOBN(0xf6be5c40, 0x2d3721d6), TOBN(0xaf312eb7, 0xe9fd68e6),
5732 TOBN(0x242792d2, 0xe7417ce1), TOBN(0xff42bc71, 0x970ee7f5),
5733 TOBN(0x1ff4dc6d, 0x5c67a41e), TOBN(0x77709b7b, 0x20882a58),
5734 TOBN(0x3554731d, 0xbe217f2c), TOBN(0x2af2a8cd, 0x5bb72177),
5735 TOBN(0x58eee769, 0x591dd059), TOBN(0xbb2930c9, 0x4bba6477),
5736 TOBN(0x863ee047, 0x7d930cfc), TOBN(0x4c262ad1, 0x396fd1f4),
5737 TOBN(0xf4765bc8, 0x039af7e1), TOBN(0x2519834b, 0x5ba104f6),
5738 TOBN(0x7cd61b4c, 0xd105f961), TOBN(0xa5415da5, 0xd63bca54),
5739 TOBN(0x778280a0, 0x88a1f17c), TOBN(0xc4968949, 0x2329512c),
5740 TOBN(0x174a9126, 0xcecdaa7a), TOBN(0xfc8c7e0e, 0x0b13247b),
5741 TOBN(0x29c110d2, 0x3484c1c4), TOBN(0xf8eb8757, 0x831dfc3b),
5742 TOBN(0x022f0212, 0xc0067452), TOBN(0x3f6f69ee, 0x7b9b926c),
5743 TOBN(0x09032da0, 0xef42daf4), TOBN(0x79f00ade, 0x83f80de4),
5744 TOBN(0x6210db71, 0x81236c97), TOBN(0x74f7685b, 0x3ee0781f),
5745 TOBN(0x4df7da7b, 0xa3e41372), TOBN(0x2aae38b1, 0xb1a1553e),
5746 TOBN(0x1688e222, 0xf6dd9d1b), TOBN(0x57695448, 0x5b8b6487),
5747 TOBN(0x478d2127, 0x4b2edeaa), TOBN(0xb2818fa5, 0x1e85956a),
5748 TOBN(0x1e6addda, 0xf176f2c0), TOBN(0x01ca4604, 0xe2572658),
5749 TOBN(0x0a404ded, 0x85342ffb), TOBN(0x8cf60f96, 0x441838d6),
5750 TOBN(0x9bbc691c, 0xc9071c4a), TOBN(0xfd588744, 0x34442803),
5751 TOBN(0x97101c85, 0x809c0d81), TOBN(0xa7fb754c, 0x8c456f7f),
5752 TOBN(0xc95f3c5c, 0xd51805e1), TOBN(0xab4ccd39, 0xb299dca8),
5753 TOBN(0x3e03d20b, 0x47eaf500), TOBN(0xfa3165c1, 0xd7b80893),
5754 TOBN(0x005e8b54, 0xe160e552), TOBN(0xdc4972ba, 0x9019d11f),
5755 TOBN(0x21a6972e, 0x0c9a4a7a), TOBN(0xa52c258f, 0x37840fd7),
5756 TOBN(0xf8559ff4, 0xc1e99d81), TOBN(0x08e1a7d6, 0xa3c617c0),
5757 TOBN(0xb398fd43, 0x248c6ba7), TOBN(0x6ffedd91, 0xd1283794),
5758 TOBN(0x8a6a59d2, 0xd629d208), TOBN(0xa9d141d5, 0x3490530e),
5759 TOBN(0x42f6fc18, 0x38505989), TOBN(0x09bf250d, 0x479d94ee),
5760 TOBN(0x223ad3b1, 0xb3822790), TOBN(0x6c5926c0, 0x93b8971c),
5761 TOBN(0x609efc7e, 0x75f7fa62), TOBN(0x45d66a6d, 0x1ec2d989),
5762 TOBN(0x4422d663, 0x987d2792), TOBN(0x4a73caad, 0x3eb31d2b),
5763 TOBN(0xf06c2ac1, 0xa32cb9e6), TOBN(0xd9445c5f, 0x91aeba84),
5764 TOBN(0x6af7a1d5, 0xaf71013f), TOBN(0xe68216e5, 0x0bedc946),
5765 TOBN(0xf4cba30b, 0xd27370a0), TOBN(0x7981afbf, 0x870421cc),
5766 TOBN(0x02496a67, 0x9449f0e1), TOBN(0x86cfc4be, 0x0a47edae),
5767 TOBN(0x3073c936, 0xb1feca22), TOBN(0xf5694612, 0x03f8f8fb),
5768 TOBN(0xd063b723, 0x901515ea), TOBN(0x4c6c77a5, 0x749cf038),
5769 TOBN(0x6361e360, 0xab9e5059), TOBN(0x596cf171, 0xa76a37c0),
5770 TOBN(0x800f53fa, 0x6530ae7a), TOBN(0x0f5e631e, 0x0792a7a6),
5771 TOBN(0x5cc29c24, 0xefdb81c9), TOBN(0xa269e868, 0x3f9c40ba),
5772 TOBN(0xec14f9e1, 0x2cb7191e), TOBN(0x78ea1bd8, 0xe5b08ea6),
5773 TOBN(0x3c65aa9b, 0x46332bb9), TOBN(0x84cc22b3, 0xbf80ce25),
5774 TOBN(0x0098e9e9, 0xd49d5bf1), TOBN(0xcd4ec1c6, 0x19087da4),
5775 TOBN(0x3c9d07c5, 0xaef6e357), TOBN(0x839a0268, 0x9f8f64b8),
5776 TOBN(0xc5e9eb62, 0xc6d8607f), TOBN(0x759689f5, 0x6aa995e4),
5777 TOBN(0x70464669, 0xbbb48317), TOBN(0x921474bf, 0xe402417d),
5778 TOBN(0xcabe135b, 0x2a354c8c), TOBN(0xd51e52d2, 0x812fa4b5),
5779 TOBN(0xec741096, 0x53311fe8), TOBN(0x4f774535, 0xb864514b),
5780 TOBN(0xbcadd671, 0x5bde48f8), TOBN(0xc9703873, 0x2189bc7d),
5781 TOBN(0x5d45299e, 0xc709ee8a), TOBN(0xd1287ee2, 0x845aaff8),
5782 TOBN(0x7d1f8874, 0xdb1dbf1f), TOBN(0xea46588b, 0x990c88d6),
5783 TOBN(0x60ba649a, 0x84368313), TOBN(0xd5fdcbce, 0x60d543ae),
5784 TOBN(0x90b46d43, 0x810d5ab0), TOBN(0x6739d8f9, 0x04d7e5cc),
5785 TOBN(0x021c1a58, 0x0d337c33), TOBN(0x00a61162, 0x68e67c40),
5786 TOBN(0x95ef413b, 0x379f0a1f), TOBN(0xfe126605, 0xe9e2ab95),
5787 TOBN(0x67578b85, 0x2f5f199c), TOBN(0xf5c00329, 0x2cb84913),
5788 TOBN(0xf7956430, 0x37577dd8), TOBN(0x83b82af4, 0x29c5fe88),
5789 TOBN(0x9c1bea26, 0xcdbdc132), TOBN(0x589fa086, 0x9c04339e),
5790 TOBN(0x033e9538, 0xb13799df), TOBN(0x85fa8b21, 0xd295d034),
5791 TOBN(0xdf17f73f, 0xbd9ddcca), TOBN(0xf32bd122, 0xddb66334),
5792 TOBN(0x55ef88a7, 0x858b044c), TOBN(0x1f0d69c2, 0x5aa9e397),
5793 TOBN(0x55fd9cc3, 0x40d85559), TOBN(0xc774df72, 0x7785ddb2),
5794 TOBN(0x5dcce9f6, 0xd3bd2e1c), TOBN(0xeb30da20, 0xa85dfed0),
5795 TOBN(0x5ed7f5bb, 0xd3ed09c4), TOBN(0x7d42a35c, 0x82a9c1bd),
5796 TOBN(0xcf3de995, 0x9890272d), TOBN(0x75f3432a, 0x3e713a10),
5797 TOBN(0x5e13479f, 0xe28227b8), TOBN(0xb8561ea9, 0xfefacdc8),
5798 TOBN(0xa6a297a0, 0x8332aafd), TOBN(0x9b0d8bb5, 0x73809b62),
5799 TOBN(0xd2fa1cfd, 0x0c63036f), TOBN(0x7a16eb55, 0xbd64bda8),
5800 TOBN(0x3f5cf5f6, 0x78e62ddc), TOBN(0x2267c454, 0x07fd752b),
5801 TOBN(0x5e361b6b, 0x5e437bbe), TOBN(0x95c59501, 0x8354e075),
5802 TOBN(0xec725f85, 0xf2b254d9), TOBN(0x844b617d, 0x2cb52b4e),
5803 TOBN(0xed8554f5, 0xcf425fb5), TOBN(0xab67703e, 0x2af9f312),
5804 TOBN(0x4cc34ec1, 0x3cf48283), TOBN(0xb09daa25, 0x9c8a705e),
5805 TOBN(0xd1e9d0d0, 0x5b7d4f84), TOBN(0x4df6ef64, 0xdb38929d),
5806 TOBN(0xe16b0763, 0xaa21ba46), TOBN(0xc6b1d178, 0xa293f8fb),
5807 TOBN(0x0ff5b602, 0xd520aabf), TOBN(0x94d671bd, 0xc339397a),
5808 TOBN(0x7c7d98cf, 0x4f5792fa), TOBN(0x7c5e0d67, 0x11215261),
5809 TOBN(0x9b19a631, 0xa7c5a6d4), TOBN(0xc8511a62, 0x7a45274d),
5810 TOBN(0x0c16621c, 0xa5a60d99), TOBN(0xf7fbab88, 0xcf5e48cb),
5811 TOBN(0xab1e6ca2, 0xf7ddee08), TOBN(0x83bd08ce, 0xe7867f3c),
5812 TOBN(0xf7e48e8a, 0x2ac13e27), TOBN(0x4494f6df, 0x4eb1a9f5),
5813 TOBN(0xedbf84eb, 0x981f0a62), TOBN(0x49badc32, 0x536438f0),
5814 TOBN(0x50bea541, 0x004f7571), TOBN(0xbac67d10, 0xdf1c94ee),
5815 TOBN(0x253d73a1, 0xb727bc31), TOBN(0xb3d01cf2, 0x30686e28),
5816 TOBN(0x51b77b1b, 0x55fd0b8b), TOBN(0xa099d183, 0xfeec3173),
5817 TOBN(0x202b1fb7, 0x670e72b7), TOBN(0xadc88b33, 0xa8e1635f),
5818 TOBN(0x34e8216a, 0xf989d905), TOBN(0xc2e68d20, 0x29b58d01),
5819 TOBN(0x11f81c92, 0x6fe55a93), TOBN(0x15f1462a, 0x8f296f40),
5820 TOBN(0x1915d375, 0xea3d62f2), TOBN(0xa17765a3, 0x01c8977d),
5821 TOBN(0x7559710a, 0xe47b26f6), TOBN(0xe0bd29c8, 0x535077a5),
5822 TOBN(0x615f976d, 0x08d84858), TOBN(0x370dfe85, 0x69ced5c1),
5823 TOBN(0xbbc7503c, 0xa734fa56), TOBN(0xfbb9f1ec, 0x91ac4574),
5824 TOBN(0x95d7ec53, 0x060dd7ef), TOBN(0xeef2dacd, 0x6e657979),
5825 TOBN(0x54511af3, 0xe2a08235), TOBN(0x1e324aa4, 0x1f4aea3d),
5826 TOBN(0x550e7e71, 0xe6e67671), TOBN(0xbccd5190, 0xbf52faf7),
5827 TOBN(0xf880d316, 0x223cc62a), TOBN(0x0d402c7e, 0x2b32eb5d),
5828 TOBN(0xa40bc039, 0x306a5a3b), TOBN(0x4e0a41fd, 0x96783a1b),
5829 TOBN(0xa1e8d39a, 0x0253cdd4), TOBN(0x6480be26, 0xc7388638),
5830 TOBN(0xee365e1d, 0x2285f382), TOBN(0x188d8d8f, 0xec0b5c36),
5831 TOBN(0x34ef1a48, 0x1f0f4d82), TOBN(0x1a8f43e1, 0xa487d29a),
5832 TOBN(0x8168226d, 0x77aefb3a), TOBN(0xf69a751e, 0x1e72c253),
5833 TOBN(0x8e04359a, 0xe9594df1), TOBN(0x475ffd7d, 0xd14c0467),
5834 TOBN(0xb5a2c2b1, 0x3844e95c), TOBN(0x85caf647, 0xdd12ef94),
5835 TOBN(0x1ecd2a9f, 0xf1063d00), TOBN(0x1dd2e229, 0x23843311),
5836 TOBN(0x38f0e09d, 0x73d17244), TOBN(0x3ede7746, 0x8fc653f1),
5837 TOBN(0xae4459f5, 0xdc20e21c), TOBN(0x00db2ffa, 0x6a8599ea),
5838 TOBN(0x11682c39, 0x30cfd905), TOBN(0x4934d074, 0xa5c112a6),
5839 TOBN(0xbdf063c5, 0x568bfe95), TOBN(0x779a440a, 0x016c441a),
5840 TOBN(0x0c23f218, 0x97d6fbdc), TOBN(0xd3a5cd87, 0xe0776aac),
5841 TOBN(0xcee37f72, 0xd712e8db), TOBN(0xfb28c70d, 0x26f74e8d),
5842 TOBN(0xffe0c728, 0xb61301a0), TOBN(0xa6282168, 0xd3724354),
5843 TOBN(0x7ff4cb00, 0x768ffedc), TOBN(0xc51b3088, 0x03b02de9),
5844 TOBN(0xa5a8147c, 0x3902dda5), TOBN(0x35d2f706, 0xfe6973b4),
5845 TOBN(0x5ac2efcf, 0xc257457e), TOBN(0x933f48d4, 0x8700611b),
5846 TOBN(0xc365af88, 0x4912beb2), TOBN(0x7f5a4de6, 0x162edf94),
5847 TOBN(0xc646ba7c, 0x0c32f34b), TOBN(0x632c6af3, 0xb2091074),
5848 TOBN(0x58d4f2e3, 0x753e43a9), TOBN(0x70e1d217, 0x24d4e23f),
5849 TOBN(0xb24bf729, 0xafede6a6), TOBN(0x7f4a94d8, 0x710c8b60),
5850 TOBN(0xaad90a96, 0x8d4faa6a), TOBN(0xd9ed0b32, 0xb066b690),
5851 TOBN(0x52fcd37b, 0x78b6dbfd), TOBN(0x0b64615e, 0x8bd2b431),
5852 TOBN(0x228e2048, 0xcfb9fad5), TOBN(0xbeaa386d, 0x240b76bd),
5853 TOBN(0x2d6681c8, 0x90dad7bc), TOBN(0x3e553fc3, 0x06d38f5e),
5854 TOBN(0xf27cdb9b, 0x9d5f9750), TOBN(0x3e85c52a, 0xd28c5b0e),
5855 TOBN(0x190795af, 0x5247c39b), TOBN(0x547831eb, 0xbddd6828),
5856 TOBN(0xf327a227, 0x4a82f424), TOBN(0x36919c78, 0x7e47f89d),
5857 TOBN(0xe4783919, 0x43c7392c), TOBN(0xf101b9aa, 0x2316fefe),
5858 TOBN(0xbcdc9e9c, 0x1c5009d2), TOBN(0xfb55ea13, 0x9cd18345),
5859 TOBN(0xf5b5e231, 0xa3ce77c7), TOBN(0xde6b4527, 0xd2f2cb3d),
5860 TOBN(0x10f6a333, 0x9bb26f5f), TOBN(0x1e85db8e, 0x044d85b6),
5861 TOBN(0xc3697a08, 0x94197e54), TOBN(0x65e18cc0, 0xa7cb4ea8),
5862 TOBN(0xa38c4f50, 0xa471fe6e), TOBN(0xf031747a, 0x2f13439c),
5863 TOBN(0x53c4a6ba, 0xc007318b), TOBN(0xa8da3ee5, 0x1deccb3d),
5864 TOBN(0x0555b31c, 0x558216b1), TOBN(0x90c7810c, 0x2f79e6c2),
5865 TOBN(0x9b669f4d, 0xfe8eed3c), TOBN(0x70398ec8, 0xe0fac126),
5866 TOBN(0xa96a449e, 0xf701b235), TOBN(0x0ceecdb3, 0xeb94f395),
5867 TOBN(0x285fc368, 0xd0cb7431), TOBN(0x0d37bb52, 0x16a18c64),
5868 TOBN(0x05110d38, 0xb880d2dd), TOBN(0xa60f177b, 0x65930d57),
5869 TOBN(0x7da34a67, 0xf36235f5), TOBN(0x47f5e17c, 0x183816b9),
5870 TOBN(0xc7664b57, 0xdb394af4), TOBN(0x39ba215d, 0x7036f789),
5871 TOBN(0x46d2ca0e, 0x2f27b472), TOBN(0xc42647ee, 0xf73a84b7),
5872 TOBN(0x44bc7545, 0x64488f1d), TOBN(0xaa922708, 0xf4cf85d5),
5873 TOBN(0x721a01d5, 0x53e4df63), TOBN(0x649c0c51, 0x5db46ced),
5874 TOBN(0x6bf0d64e, 0x3cffcb6c), TOBN(0xe3bf93fe, 0x50f71d96),
5875 TOBN(0x75044558, 0xbcc194a0), TOBN(0x16ae3372, 0x6afdc554),
5876 TOBN(0xbfc01adf, 0x5ca48f3f), TOBN(0x64352f06, 0xe22a9b84),
5877 TOBN(0xcee54da1, 0xc1099e4a), TOBN(0xbbda54e8, 0xfa1b89c0),
5878 TOBN(0x166a3df5, 0x6f6e55fb), TOBN(0x1ca44a24, 0x20176f88),
5879 TOBN(0x936afd88, 0xdfb7b5ff), TOBN(0xe34c2437, 0x8611d4a0),
5880 TOBN(0x7effbb75, 0x86142103), TOBN(0x6704ba1b, 0x1f34fc4d),
5881 TOBN(0x7c2a468f, 0x10c1b122), TOBN(0x36b3a610, 0x8c6aace9),
5882 TOBN(0xabfcc0a7, 0x75a0d050), TOBN(0x066f9197, 0x3ce33e32),
5883 TOBN(0xce905ef4, 0x29fe09be), TOBN(0x89ee25ba, 0xa8376351),
5884 TOBN(0x2a3ede22, 0xfd29dc76), TOBN(0x7fd32ed9, 0x36f17260),
5885 TOBN(0x0cadcf68, 0x284b4126), TOBN(0x63422f08, 0xa7951fc8),
5886 TOBN(0x562b24f4, 0x0807e199), TOBN(0xfe9ce5d1, 0x22ad4490),
5887 TOBN(0xc2f51b10, 0x0db2b1b4), TOBN(0xeb3613ff, 0xe4541d0d),
5888 TOBN(0xbd2c4a05, 0x2680813b), TOBN(0x527aa55d, 0x561b08d6),
5889 TOBN(0xa9f8a40e, 0xa7205558), TOBN(0xe3eea56f, 0x243d0bec),
5890 TOBN(0x7b853817, 0xa0ff58b3), TOBN(0xb67d3f65, 0x1a69e627),
5891 TOBN(0x0b76bbb9, 0xa869b5d6), TOBN(0xa3afeb82, 0x546723ed),
5892 TOBN(0x5f24416d, 0x3e554892), TOBN(0x8413b53d, 0x430e2a45),
5893 TOBN(0x99c56aee, 0x9032a2a0), TOBN(0x09432bf6, 0xeec367b1),
5894 TOBN(0x552850c6, 0xdaf0ecc1), TOBN(0x49ebce55, 0x5bc92048),
5895 TOBN(0xdfb66ba6, 0x54811307), TOBN(0x1b84f797, 0x6f298597),
5896 TOBN(0x79590481, 0x8d1d7a0d), TOBN(0xd9fabe03, 0x3a6fa556),
5897 TOBN(0xa40f9c59, 0xba9e5d35), TOBN(0xcb1771c1, 0xf6247577),
5898 TOBN(0x542a47ca, 0xe9a6312b), TOBN(0xa34b3560, 0x552dd8c5),
5899 TOBN(0xfdf94de0, 0x0d794716), TOBN(0xd46124a9, 0x9c623094),
5900 TOBN(0x56b7435d, 0x68afe8b4), TOBN(0x27f20540, 0x6c0d8ea1),
5901 TOBN(0x12b77e14, 0x73186898), TOBN(0xdbc3dd46, 0x7479490f),
5902 TOBN(0x951a9842, 0xc03b0c05), TOBN(0x8b1b3bb3, 0x7921bc96),
5903 TOBN(0xa573b346, 0x2b202e0a), TOBN(0x77e4665d, 0x47254d56),
5904 TOBN(0x08b70dfc, 0xd23e3984), TOBN(0xab86e8bc, 0xebd14236),
5905 TOBN(0xaa3e07f8, 0x57114ba7), TOBN(0x5ac71689, 0xab0ef4f2),
5906 TOBN(0x88fca384, 0x0139d9af), TOBN(0x72733f88, 0x76644af0),
5907 TOBN(0xf122f72a, 0x65d74f4a), TOBN(0x13931577, 0xa5626c7a),
5908 TOBN(0xd5b5d9eb, 0x70f8d5a4), TOBN(0x375adde7, 0xd7bbb228),
5909 TOBN(0x31e88b86, 0x0c1c0b32), TOBN(0xd1f568c4, 0x173edbaa),
5910 TOBN(0x1592fc83, 0x5459df02), TOBN(0x2beac0fb, 0x0fcd9a7e),
5911 TOBN(0xb0a6fdb8, 0x1b473b0a), TOBN(0xe3224c6f, 0x0fe8fc48),
5912 TOBN(0x680bd00e, 0xe87edf5b), TOBN(0x30385f02, 0x20e77cf5),
5913 TOBN(0xe9ab98c0, 0x4d42d1b2), TOBN(0x72d191d2, 0xd3816d77),
5914 TOBN(0x1564daca, 0x0917d9e5), TOBN(0x394eab59, 0x1f8fed7f),
5915 TOBN(0xa209aa8d, 0x7fbb3896), TOBN(0x5564f3b9, 0xbe6ac98e),
5916 TOBN(0xead21d05, 0xd73654ef), TOBN(0x68d1a9c4, 0x13d78d74),
5917 TOBN(0x61e01708, 0x6d4973a0), TOBN(0x83da3500, 0x46e6d32a),
5918 TOBN(0x6a3dfca4, 0x68ae0118), TOBN(0xa1b9a4c9, 0xd02da069),
5919 TOBN(0x0b2ff9c7, 0xebab8302), TOBN(0x98af07c3, 0x944ba436),
5920 TOBN(0x85997326, 0x995f0f9f), TOBN(0x467fade0, 0x71b58bc6),
5921 TOBN(0x47e4495a, 0xbd625a2b), TOBN(0xfdd2d01d, 0x33c3b8cd),
5922 TOBN(0x2c38ae28, 0xc693f9fa), TOBN(0x48622329, 0x348f7999),
5923 TOBN(0x97bf738e, 0x2161f583), TOBN(0x15ee2fa7, 0x565e8cc9),
5924 TOBN(0xa1a5c845, 0x5777e189), TOBN(0xcc10bee0, 0x456f2829),
5925 TOBN(0x8ad95c56, 0xda762bd5), TOBN(0x152e2214, 0xe9d91da8),
5926 TOBN(0x975b0e72, 0x7cb23c74), TOBN(0xfd5d7670, 0xa90c66df),
5927 TOBN(0xb5b5b8ad, 0x225ffc53), TOBN(0xab6dff73, 0xfaded2ae),
5928 TOBN(0xebd56781, 0x6f4cbe9d), TOBN(0x0ed8b249, 0x6a574bd7),
5929 TOBN(0x41c246fe, 0x81a881fa), TOBN(0x91564805, 0xc3db9c70),
5930 TOBN(0xd7c12b08, 0x5b862809), TOBN(0x1facd1f1, 0x55858d7b),
5931 TOBN(0x7693747c, 0xaf09e92a), TOBN(0x3b69dcba, 0x189a425f),
5932 TOBN(0x0be28e9f, 0x967365ef), TOBN(0x57300eb2, 0xe801f5c9),
5933 TOBN(0x93b8ac6a, 0xd583352f), TOBN(0xa2cf1f89, 0xcd05b2b7),
5934 TOBN(0x7c0c9b74, 0x4dcc40cc), TOBN(0xfee38c45, 0xada523fb),
5935 TOBN(0xb49a4dec, 0x1099cc4d), TOBN(0x325c377f, 0x69f069c6),
5936 TOBN(0xe12458ce, 0x476cc9ff), TOBN(0x580e0b6c, 0xc6d4cb63),
5937 TOBN(0xd561c8b7, 0x9072289b), TOBN(0x0377f264, 0xa619e6da),
5938 TOBN(0x26685362, 0x88e591a5), TOBN(0xa453a7bd, 0x7523ca2b),
5939 TOBN(0x8a9536d2, 0xc1df4533), TOBN(0xc8e50f2f, 0xbe972f79),
5940 TOBN(0xd433e50f, 0x6d3549cf), TOBN(0x6f33696f, 0xfacd665e),
5941 TOBN(0x695bfdac, 0xce11fcb4), TOBN(0x810ee252, 0xaf7c9860),
5942 TOBN(0x65450fe1, 0x7159bb2c), TOBN(0xf7dfbebe, 0x758b357b),
5943 TOBN(0x2b057e74, 0xd69fea72), TOBN(0xd485717a, 0x92731745),
5944 },
5945 {
5946 TOBN(0x896c42e8, 0xee36860c), TOBN(0xdaf04dfd, 0x4113c22d),
5947 TOBN(0x1adbb7b7, 0x44104213), TOBN(0xe5fd5fa1, 0x1fd394ea),
5948 TOBN(0x68235d94, 0x1a4e0551), TOBN(0x6772cfbe, 0x18d10151),
5949 TOBN(0x276071e3, 0x09984523), TOBN(0xe4e879de, 0x5a56ba98),
5950 TOBN(0xaaafafb0, 0x285b9491), TOBN(0x01a0be88, 0x1e4c705e),
5951 TOBN(0xff1d4f5d, 0x2ad9caab), TOBN(0x6e349a4a, 0xc37a233f),
5952 TOBN(0xcf1c1246, 0x4a1c6a16), TOBN(0xd99e6b66, 0x29383260),
5953 TOBN(0xea3d4366, 0x5f6d5471), TOBN(0x36974d04, 0xff8cc89b),
5954 TOBN(0xc26c49a1, 0xcfe89d80), TOBN(0xb42c026d, 0xda9c8371),
5955 TOBN(0xca6c013a, 0xdad066d2), TOBN(0xfb8f7228, 0x56a4f3ee),
5956 TOBN(0x08b579ec, 0xd850935b), TOBN(0x34c1a74c, 0xd631e1b3),
5957 TOBN(0xcb5fe596, 0xac198534), TOBN(0x39ff21f6, 0xe1f24f25),
5958 TOBN(0x27f29e14, 0x8f929057), TOBN(0x7a64ae06, 0xc0c853df),
5959 TOBN(0x256cd183, 0x58e9c5ce), TOBN(0x9d9cce82, 0xded092a5),
5960 TOBN(0xcc6e5979, 0x6e93b7c7), TOBN(0xe1e47092, 0x31bb9e27),
5961 TOBN(0xb70b3083, 0xaa9e29a0), TOBN(0xbf181a75, 0x3785e644),
5962 TOBN(0xf53f2c65, 0x8ead09f7), TOBN(0x1335e1d5, 0x9780d14d),
5963 TOBN(0x69cc20e0, 0xcd1b66bc), TOBN(0x9b670a37, 0xbbe0bfc8),
5964 TOBN(0xce53dc81, 0x28efbeed), TOBN(0x0c74e77c, 0x8326a6e5),
5965 TOBN(0x3604e0d2, 0xb88e9a63), TOBN(0xbab38fca, 0x13dc2248),
5966 TOBN(0x8ed6e8c8, 0x5c0a3f1e), TOBN(0xbcad2492, 0x7c87c37f),
5967 TOBN(0xfdfb62bb, 0x9ee3b78d), TOBN(0xeba8e477, 0xcbceba46),
5968 TOBN(0x37d38cb0, 0xeeaede4b), TOBN(0x0bc498e8, 0x7976deb6),
5969 TOBN(0xb2944c04, 0x6b6147fb), TOBN(0x8b123f35, 0xf71f9609),
5970 TOBN(0xa155dcc7, 0xde79dc24), TOBN(0xf1168a32, 0x558f69cd),
5971 TOBN(0xbac21595, 0x0d1850df), TOBN(0x15c8295b, 0xb204c848),
5972 TOBN(0xf661aa36, 0x7d8184ff), TOBN(0xc396228e, 0x30447bdb),
5973 TOBN(0x11cd5143, 0xbde4a59e), TOBN(0xe3a26e3b, 0x6beab5e6),
5974 TOBN(0xd3b3a13f, 0x1402b9d0), TOBN(0x573441c3, 0x2c7bc863),
5975 TOBN(0x4b301ec4, 0x578c3e6e), TOBN(0xc26fc9c4, 0x0adaf57e),
5976 TOBN(0x96e71bfd, 0x7493cea3), TOBN(0xd05d4b3f, 0x1af81456),
5977 TOBN(0xdaca2a8a, 0x6a8c608f), TOBN(0x53ef07f6, 0x0725b276),
5978 TOBN(0x07a5fbd2, 0x7824fc56), TOBN(0x34675218, 0x13289077),
5979 TOBN(0x5bf69fd5, 0xe0c48349), TOBN(0xa613ddd3, 0xb6aa7875),
5980 TOBN(0x7f78c19c, 0x5450d866), TOBN(0x46f4409c, 0x8f84a481),
5981 TOBN(0x9f1d1928, 0x90fce239), TOBN(0x016c4168, 0xb2ce44b9),
5982 TOBN(0xbae023f0, 0xc7435978), TOBN(0xb152c888, 0x20e30e19),
5983 TOBN(0x9c241645, 0xe3fa6faf), TOBN(0x735d95c1, 0x84823e60),
5984 TOBN(0x03197573, 0x03955317), TOBN(0x0b4b02a9, 0xf03b4995),
5985 TOBN(0x076bf559, 0x70274600), TOBN(0x32c5cc53, 0xaaf57508),
5986 TOBN(0xe8af6d1f, 0x60624129), TOBN(0xb7bc5d64, 0x9a5e2b5e),
5987 TOBN(0x3814b048, 0x5f082d72), TOBN(0x76f267f2, 0xce19677a),
5988 TOBN(0x626c630f, 0xb36eed93), TOBN(0x55230cd7, 0x3bf56803),
5989 TOBN(0x78837949, 0xce2736a0), TOBN(0x0d792d60, 0xaa6c55f1),
5990 TOBN(0x0318dbfd, 0xd5c7c5d2), TOBN(0xb38f8da7, 0x072b342d),
5991 TOBN(0x3569bddc, 0x7b8de38a), TOBN(0xf25b5887, 0xa1c94842),
5992 TOBN(0xb2d5b284, 0x2946ad60), TOBN(0x854f29ad, 0xe9d1707e),
5993 TOBN(0xaa5159dc, 0x2c6a4509), TOBN(0x899f94c0, 0x57189837),
5994 TOBN(0xcf6adc51, 0xf4a55b03), TOBN(0x261762de, 0x35e3b2d5),
5995 TOBN(0x4cc43012, 0x04827b51), TOBN(0xcd22a113, 0xc6021442),
5996 TOBN(0xce2fd61a, 0x247c9569), TOBN(0x59a50973, 0xd152beca),
5997 TOBN(0x6c835a11, 0x63a716d4), TOBN(0xc26455ed, 0x187dedcf),
5998 TOBN(0x27f536e0, 0x49ce89e7), TOBN(0x18908539, 0xcc890cb5),
5999 TOBN(0x308909ab, 0xd83c2aa1), TOBN(0xecd3142b, 0x1ab73bd3),
6000 TOBN(0x6a85bf59, 0xb3f5ab84), TOBN(0x3c320a68, 0xf2bea4c6),
6001 TOBN(0xad8dc538, 0x6da4541f), TOBN(0xeaf34eb0, 0xb7c41186),
6002 TOBN(0x1c780129, 0x977c97c4), TOBN(0x5ff9beeb, 0xc57eb9fa),
6003 TOBN(0xa24d0524, 0xc822c478), TOBN(0xfd8eec2a, 0x461cd415),
6004 TOBN(0xfbde194e, 0xf027458c), TOBN(0xb4ff5319, 0x1d1be115),
6005 TOBN(0x63f874d9, 0x4866d6f4), TOBN(0x35c75015, 0xb21ad0c9),
6006 TOBN(0xa6b5c9d6, 0x46ac49d2), TOBN(0x42c77c0b, 0x83137aa9),
6007 TOBN(0x24d000fc, 0x68225a38), TOBN(0x0f63cfc8, 0x2fe1e907),
6008 TOBN(0x22d1b01b, 0xc6441f95), TOBN(0x7d38f719, 0xec8e448f),
6009 TOBN(0x9b33fa5f, 0x787fb1ba), TOBN(0x94dcfda1, 0x190158df),
6010 TOBN(0xc47cb339, 0x5f6d4a09), TOBN(0x6b4f355c, 0xee52b826),
6011 TOBN(0x3d100f5d, 0xf51b930a), TOBN(0xf4512fac, 0x9f668f69),
6012 TOBN(0x546781d5, 0x206c4c74), TOBN(0xd021d4d4, 0xcb4d2e48),
6013 TOBN(0x494a54c2, 0xca085c2d), TOBN(0xf1dbaca4, 0x520850a8),
6014 TOBN(0x63c79326, 0x490a1aca), TOBN(0xcb64dd9c, 0x41526b02),
6015 TOBN(0xbb772591, 0xa2979258), TOBN(0x3f582970, 0x48d97846),
6016 TOBN(0xd66b70d1, 0x7c213ba7), TOBN(0xc28febb5, 0xe8a0ced4),
6017 TOBN(0x6b911831, 0xc10338c1), TOBN(0x0d54e389, 0xbf0126f3),
6018 TOBN(0x7048d460, 0x4af206ee), TOBN(0x786c88f6, 0x77e97cb9),
6019 TOBN(0xd4375ae1, 0xac64802e), TOBN(0x469bcfe1, 0xd53ec11c),
6020 TOBN(0xfc9b340d, 0x47062230), TOBN(0xe743bb57, 0xc5b4a3ac),
6021 TOBN(0xfe00b4aa, 0x59ef45ac), TOBN(0x29a4ef23, 0x59edf188),
6022 TOBN(0x40242efe, 0xb483689b), TOBN(0x2575d3f6, 0x513ac262),
6023 TOBN(0xf30037c8, 0x0ca6db72), TOBN(0xc9fcce82, 0x98864be2),
6024 TOBN(0x84a112ff, 0x0149362d), TOBN(0x95e57582, 0x1c4ae971),
6025 TOBN(0x1fa4b1a8, 0x945cf86c), TOBN(0x4525a734, 0x0b024a2f),
6026 TOBN(0xe76c8b62, 0x8f338360), TOBN(0x483ff593, 0x28edf32b),
6027 TOBN(0x67e8e90a, 0x298b1aec), TOBN(0x9caab338, 0x736d9a21),
6028 TOBN(0x5c09d2fd, 0x66892709), TOBN(0x2496b4dc, 0xb55a1d41),
6029 TOBN(0x93f5fb1a, 0xe24a4394), TOBN(0x08c75049, 0x6fa8f6c1),
6030 TOBN(0xcaead1c2, 0xc905d85f), TOBN(0xe9d7f790, 0x0733ae57),
6031 TOBN(0x24c9a65c, 0xf07cdd94), TOBN(0x7389359c, 0xa4b55931),
6032 TOBN(0xf58709b7, 0x367e45f7), TOBN(0x1f203067, 0xcb7e7adc),
6033 TOBN(0x82444bff, 0xc7b72818), TOBN(0x07303b35, 0xbaac8033),
6034 TOBN(0x1e1ee4e4, 0xd13b7ea1), TOBN(0xe6489b24, 0xe0e74180),
6035 TOBN(0xa5f2c610, 0x7e70ef70), TOBN(0xa1655412, 0xbdd10894),
6036 TOBN(0x555ebefb, 0x7af4194e), TOBN(0x533c1c3c, 0x8e89bd9c),
6037 TOBN(0x735b9b57, 0x89895856), TOBN(0x15fb3cd2, 0x567f5c15),
6038 TOBN(0x057fed45, 0x526f09fd), TOBN(0xe8a4f10c, 0x8128240a),
6039 TOBN(0x9332efc4, 0xff2bfd8d), TOBN(0x214e77a0, 0xbd35aa31),
6040 TOBN(0x32896d73, 0x14faa40e), TOBN(0x767867ec, 0x01e5f186),
6041 TOBN(0xc9adf8f1, 0x17a1813e), TOBN(0xcb6cda78, 0x54741795),
6042 TOBN(0xb7521b6d, 0x349d51aa), TOBN(0xf56b5a9e, 0xe3c7b8e9),
6043 TOBN(0xc6f1e5c9, 0x32a096df), TOBN(0x083667c4, 0xa3635024),
6044 TOBN(0x365ea135, 0x18087f2f), TOBN(0xf1b8eaac, 0xd136e45d),
6045 TOBN(0xc8a0e484, 0x73aec989), TOBN(0xd75a324b, 0x142c9259),
6046 TOBN(0xb7b4d001, 0x01dae185), TOBN(0x45434e0b, 0x9b7a94bc),
6047 TOBN(0xf54339af, 0xfbd8cb0b), TOBN(0xdcc4569e, 0xe98ef49e),
6048 TOBN(0x7789318a, 0x09a51299), TOBN(0x81b4d206, 0xb2b025d8),
6049 TOBN(0xf64aa418, 0xfae85792), TOBN(0x3e50258f, 0xacd7baf7),
6050 TOBN(0xdce84cdb, 0x2996864b), TOBN(0xa2e67089, 0x1f485fa4),
6051 TOBN(0xb28b2bb6, 0x534c6a5a), TOBN(0x31a7ec6b, 0xc94b9d39),
6052 TOBN(0x1d217766, 0xd6bc20da), TOBN(0x4acdb5ec, 0x86761190),
6053 TOBN(0x68726328, 0x73701063), TOBN(0x4d24ee7c, 0x2128c29b),
6054 TOBN(0xc072ebd3, 0xa19fd868), TOBN(0x612e481c, 0xdb8ddd3b),
6055 TOBN(0xb4e1d754, 0x1a64d852), TOBN(0x00ef95ac, 0xc4c6c4ab),
6056 TOBN(0x1536d2ed, 0xaa0a6c46), TOBN(0x61294086, 0x43774790),
6057 TOBN(0x54af25e8, 0x343fda10), TOBN(0x9ff9d98d, 0xfd25d6f2),
6058 TOBN(0x0746af7c, 0x468b8835), TOBN(0x977a31cb, 0x730ecea7),
6059 TOBN(0xa5096b80, 0xc2cf4a81), TOBN(0xaa986833, 0x6458c37a),
6060 TOBN(0x6af29bf3, 0xa6bd9d34), TOBN(0x6a62fe9b, 0x33c5d854),
6061 TOBN(0x50e6c304, 0xb7133b5e), TOBN(0x04b60159, 0x7d6e6848),
6062 TOBN(0x4cd296df, 0x5579bea4), TOBN(0x10e35ac8, 0x5ceedaf1),
6063 TOBN(0x04c4c5fd, 0xe3bcc5b1), TOBN(0x95f9ee8a, 0x89412cf9),
6064 TOBN(0x2c9459ee, 0x82b6eb0f), TOBN(0x2e845765, 0x95c2aadd),
6065 TOBN(0x774a84ae, 0xd327fcfe), TOBN(0xd8c93722, 0x0368d476),
6066 TOBN(0x0dbd5748, 0xf83e8a3b), TOBN(0xa579aa96, 0x8d2495f3),
6067 TOBN(0x535996a0, 0xae496e9b), TOBN(0x07afbfe9, 0xb7f9bcc2),
6068 TOBN(0x3ac1dc6d, 0x5b7bd293), TOBN(0x3b592cff, 0x7022323d),
6069 TOBN(0xba0deb98, 0x9c0a3e76), TOBN(0x18e78e9f, 0x4b197acb),
6070 TOBN(0x211cde10, 0x296c36ef), TOBN(0x7ee89672, 0x82c4da77),
6071 TOBN(0xb617d270, 0xa57836da), TOBN(0xf0cd9c31, 0x9cb7560b),
6072 TOBN(0x01fdcbf7, 0xe455fe90), TOBN(0x3fb53cbb, 0x7e7334f3),
6073 TOBN(0x781e2ea4, 0x4e7de4ec), TOBN(0x8adab3ad, 0x0b384fd0),
6074 TOBN(0x129eee2f, 0x53d64829), TOBN(0x7a471e17, 0xa261492b),
6075 TOBN(0xe4f9adb9, 0xe4cb4a2c), TOBN(0x3d359f6f, 0x97ba2c2d),
6076 TOBN(0x346c6786, 0x0aacd697), TOBN(0x92b444c3, 0x75c2f8a8),
6077 TOBN(0xc79fa117, 0xd85df44e), TOBN(0x56782372, 0x398ddf31),
6078 TOBN(0x60e690f2, 0xbbbab3b8), TOBN(0x4851f8ae, 0x8b04816b),
6079 TOBN(0xc72046ab, 0x9c92e4d2), TOBN(0x518c74a1, 0x7cf3136b),
6080 TOBN(0xff4eb50a, 0xf9877d4c), TOBN(0x14578d90, 0xa919cabb),
6081 TOBN(0x8218f8c4, 0xac5eb2b6), TOBN(0xa3ccc547, 0x542016e4),
6082 TOBN(0x025bf48e, 0x327f8349), TOBN(0xf3e97346, 0xf43cb641),
6083 TOBN(0xdc2bafdf, 0x500f1085), TOBN(0x57167876, 0x2f063055),
6084 TOBN(0x5bd914b9, 0x411925a6), TOBN(0x7c078d48, 0xa1123de5),
6085 TOBN(0xee6bf835, 0x182b165d), TOBN(0xb11b5e5b, 0xba519727),
6086 TOBN(0xe33ea76c, 0x1eea7b85), TOBN(0x2352b461, 0x92d4f85e),
6087 TOBN(0xf101d334, 0xafe115bb), TOBN(0xfabc1294, 0x889175a3),
6088 TOBN(0x7f6bcdc0, 0x5233f925), TOBN(0xe0a802db, 0xe77fec55),
6089 TOBN(0xbdb47b75, 0x8069b659), TOBN(0x1c5e12de, 0xf98fbd74),
6090 TOBN(0x869c58c6, 0x4b8457ee), TOBN(0xa5360f69, 0x4f7ea9f7),
6091 TOBN(0xe576c09f, 0xf460b38f), TOBN(0x6b70d548, 0x22b7fb36),
6092 TOBN(0x3fd237f1, 0x3bfae315), TOBN(0x33797852, 0xcbdff369),
6093 TOBN(0x97df25f5, 0x25b516f9), TOBN(0x46f388f2, 0xba38ad2d),
6094 TOBN(0x656c4658, 0x89d8ddbb), TOBN(0x8830b26e, 0x70f38ee8),
6095 TOBN(0x4320fd5c, 0xde1212b0), TOBN(0xc34f30cf, 0xe4a2edb2),
6096 TOBN(0xabb131a3, 0x56ab64b8), TOBN(0x7f77f0cc, 0xd99c5d26),
6097 TOBN(0x66856a37, 0xbf981d94), TOBN(0x19e76d09, 0x738bd76e),
6098 TOBN(0xe76c8ac3, 0x96238f39), TOBN(0xc0a482be, 0xa830b366),
6099 TOBN(0xb7b8eaff, 0x0b4eb499), TOBN(0x8ecd83bc, 0x4bfb4865),
6100 TOBN(0x971b2cb7, 0xa2f3776f), TOBN(0xb42176a4, 0xf4b88adf),
6101 TOBN(0xb9617df5, 0xbe1fa446), TOBN(0x8b32d508, 0xcd031bd2),
6102 TOBN(0x1c6bd47d, 0x53b618c0), TOBN(0xc424f46c, 0x6a227923),
6103 TOBN(0x7303ffde, 0xdd92d964), TOBN(0xe9712878, 0x71b5abf2),
6104 TOBN(0x8f48a632, 0xf815561d), TOBN(0x85f48ff5, 0xd3c055d1),
6105 TOBN(0x222a1427, 0x7525684f), TOBN(0xd0d841a0, 0x67360cc3),
6106 TOBN(0x4245a926, 0x0b9267c6), TOBN(0xc78913f1, 0xcf07f863),
6107 TOBN(0xaa844c8e, 0x4d0d9e24), TOBN(0xa42ad522, 0x3d5f9017),
6108 TOBN(0xbd371749, 0xa2c989d5), TOBN(0x928292df, 0xe1f5e78e),
6109 TOBN(0x493b383e, 0x0a1ea6da), TOBN(0x5136fd8d, 0x13aee529),
6110 TOBN(0x860c44b1, 0xf2c34a99), TOBN(0x3b00aca4, 0xbf5855ac),
6111 TOBN(0xabf6aaa0, 0xfaaf37be), TOBN(0x65f43682, 0x2a53ec08),
6112 TOBN(0x1d9a5801, 0xa11b12e1), TOBN(0x78a7ab2c, 0xe20ed475),
6113 TOBN(0x0de1067e, 0x9a41e0d5), TOBN(0x30473f5f, 0x305023ea),
6114 TOBN(0xdd3ae09d, 0x169c7d97), TOBN(0x5cd5baa4, 0xcfaef9cd),
6115 TOBN(0x5cd7440b, 0x65a44803), TOBN(0xdc13966a, 0x47f364de),
6116 TOBN(0x077b2be8, 0x2b8357c1), TOBN(0x0cb1b4c5, 0xe9d57c2a),
6117 TOBN(0x7a4ceb32, 0x05ff363e), TOBN(0xf310fa4d, 0xca35a9ef),
6118 TOBN(0xdbb7b352, 0xf97f68c6), TOBN(0x0c773b50, 0x0b02cf58),
6119 TOBN(0xea2e4821, 0x3c1f96d9), TOBN(0xffb357b0, 0xeee01815),
6120 TOBN(0xb9c924cd, 0xe0f28039), TOBN(0x0b36c95a, 0x46a3fbe4),
6121 TOBN(0x1faaaea4, 0x5e46db6c), TOBN(0xcae575c3, 0x1928aaff),
6122 TOBN(0x7f671302, 0xa70dab86), TOBN(0xfcbd12a9, 0x71c58cfc),
6123 TOBN(0xcbef9acf, 0xbee0cb92), TOBN(0x573da0b9, 0xf8c1b583),
6124 TOBN(0x4752fcfe, 0x0d41d550), TOBN(0xe7eec0e3, 0x2155cffe),
6125 TOBN(0x0fc39fcb, 0x545ae248), TOBN(0x522cb8d1, 0x8065f44e),
6126 TOBN(0x263c962a, 0x70cbb96c), TOBN(0xe034362a, 0xbcd124a9),
6127 TOBN(0xf120db28, 0x3c2ae58d), TOBN(0xb9a38d49, 0xfef6d507),
6128 TOBN(0xb1fd2a82, 0x1ff140fd), TOBN(0xbd162f30, 0x20aee7e0),
6129 TOBN(0x4e17a5d4, 0xcb251949), TOBN(0x2aebcb83, 0x4f7e1c3d),
6130 TOBN(0x608eb25f, 0x937b0527), TOBN(0xf42e1e47, 0xeb7d9997),
6131 TOBN(0xeba699c4, 0xb8a53a29), TOBN(0x1f921c71, 0xe091b536),
6132 TOBN(0xcce29e7b, 0x5b26bbd5), TOBN(0x7a8ef5ed, 0x3b61a680),
6133 TOBN(0xe5ef8043, 0xba1f1c7e), TOBN(0x16ea8217, 0x18158dda),
6134 TOBN(0x01778a2b, 0x599ff0f9), TOBN(0x68a923d7, 0x8104fc6b),
6135 TOBN(0x5bfa44df, 0xda694ff3), TOBN(0x4f7199db, 0xf7667f12),
6136 TOBN(0xc06d8ff6, 0xe46f2a79), TOBN(0x08b5dead, 0xe9f8131d),
6137 TOBN(0x02519a59, 0xabb4ce7c), TOBN(0xc4f710bc, 0xb42aec3e),
6138 TOBN(0x3d77b057, 0x78bde41a), TOBN(0x6474bf80, 0xb4186b5a),
6139 TOBN(0x048b3f67, 0x88c65741), TOBN(0xc64519de, 0x03c7c154),
6140 TOBN(0xdf073846, 0x0edfcc4f), TOBN(0x319aa737, 0x48f1aa6b),
6141 TOBN(0x8b9f8a02, 0xca909f77), TOBN(0x90258139, 0x7580bfef),
6142 TOBN(0xd8bfd3ca, 0xc0c22719), TOBN(0xc60209e4, 0xc9ca151e),
6143 TOBN(0x7a744ab5, 0xd9a1a69c), TOBN(0x6de5048b, 0x14937f8f),
6144 TOBN(0x171938d8, 0xe115ac04), TOBN(0x7df70940, 0x1c6b16d2),
6145 TOBN(0xa6aeb663, 0x7f8e94e7), TOBN(0xc130388e, 0x2a2cf094),
6146 TOBN(0x1850be84, 0x77f54e6e), TOBN(0x9f258a72, 0x65d60fe5),
6147 TOBN(0xff7ff0c0, 0x6c9146d6), TOBN(0x039aaf90, 0xe63a830b),
6148 TOBN(0x38f27a73, 0x9460342f), TOBN(0x4703148c, 0x3f795f8a),
6149 TOBN(0x1bb5467b, 0x9681a97e), TOBN(0x00931ba5, 0xecaeb594),
6150 TOBN(0xcdb6719d, 0x786f337c), TOBN(0xd9c01cd2, 0xe704397d),
6151 TOBN(0x0f4a3f20, 0x555c2fef), TOBN(0x00452509, 0x7c0af223),
6152 TOBN(0x54a58047, 0x84db8e76), TOBN(0x3bacf1aa, 0x93c8aa06),
6153 TOBN(0x11ca957c, 0xf7919422), TOBN(0x50641053, 0x78cdaa40),
6154 TOBN(0x7a303874, 0x9f7144ae), TOBN(0x170c963f, 0x43d4acfd),
6155 TOBN(0x5e148149, 0x58ddd3ef), TOBN(0xa7bde582, 0x9e72dba8),
6156 TOBN(0x0769da8b, 0x6fa68750), TOBN(0xfa64e532, 0x572e0249),
6157 TOBN(0xfcaadf9d, 0x2619ad31), TOBN(0x87882daa, 0xa7b349cd),
6158 TOBN(0x9f6eb731, 0x6c67a775), TOBN(0xcb10471a, 0xefc5d0b1),
6159 TOBN(0xb433750c, 0xe1b806b2), TOBN(0x19c5714d, 0x57b1ae7e),
6160 TOBN(0xc0dc8b7b, 0xed03fd3f), TOBN(0xdd03344f, 0x31bc194e),
6161 TOBN(0xa66c52a7, 0x8c6320b5), TOBN(0x8bc82ce3, 0xd0b6fd93),
6162 TOBN(0xf8e13501, 0xb35f1341), TOBN(0xe53156dd, 0x25a43e42),
6163 TOBN(0xd3adf27e, 0x4daeb85c), TOBN(0xb81d8379, 0xbbeddeb5),
6164 TOBN(0x1b0b546e, 0x2e435867), TOBN(0x9020eb94, 0xeba5dd60),
6165 TOBN(0x37d91161, 0x8210cb9d), TOBN(0x4c596b31, 0x5c91f1cf),
6166 TOBN(0xb228a90f, 0x0e0b040d), TOBN(0xbaf02d82, 0x45ff897f),
6167 TOBN(0x2aac79e6, 0x00fa6122), TOBN(0x24828817, 0x8e36f557),
6168 TOBN(0xb9521d31, 0x113ec356), TOBN(0x9e48861e, 0x15eff1f8),
6169 TOBN(0x2aa1d412, 0xe0d41715), TOBN(0x71f86203, 0x53f131b8),
6170 TOBN(0xf60da8da, 0x3fd19408), TOBN(0x4aa716dc, 0x278d9d99),
6171 TOBN(0x394531f7, 0xa8c51c90), TOBN(0xb560b0e8, 0xf59db51c),
6172 TOBN(0xa28fc992, 0xfa34bdad), TOBN(0xf024fa14, 0x9cd4f8bd),
6173 TOBN(0x5cf530f7, 0x23a9d0d3), TOBN(0x615ca193, 0xe28c9b56),
6174 TOBN(0x6d2a483d, 0x6f73c51e), TOBN(0xa4cb2412, 0xea0dc2dd),
6175 TOBN(0x50663c41, 0x1eb917ff), TOBN(0x3d3a74cf, 0xeade299e),
6176 TOBN(0x29b3990f, 0x4a7a9202), TOBN(0xa9bccf59, 0xa7b15c3d),
6177 TOBN(0x66a3ccdc, 0xa5df9208), TOBN(0x48027c14, 0x43f2f929),
6178 TOBN(0xd385377c, 0x40b557f0), TOBN(0xe001c366, 0xcd684660),
6179 TOBN(0x1b18ed6b, 0xe2183a27), TOBN(0x879738d8, 0x63210329),
6180 TOBN(0xa687c74b, 0xbda94882), TOBN(0xd1bbcc48, 0xa684b299),
6181 TOBN(0xaf6f1112, 0x863b3724), TOBN(0x6943d1b4, 0x2c8ce9f8),
6182 TOBN(0xe044a3bb, 0x098cafb4), TOBN(0x27ed2310, 0x60d48caf),
6183 TOBN(0x542b5675, 0x3a31b84d), TOBN(0xcbf3dd50, 0xfcddbed7),
6184 TOBN(0x25031f16, 0x41b1d830), TOBN(0xa7ec851d, 0xcb0c1e27),
6185 TOBN(0xac1c8fe0, 0xb5ae75db), TOBN(0xb24c7557, 0x08c52120),
6186 TOBN(0x57f811dc, 0x1d4636c3), TOBN(0xf8436526, 0x681a9939),
6187 TOBN(0x1f6bc6d9, 0x9c81adb3), TOBN(0x840f8ac3, 0x5b7d80d4),
6188 TOBN(0x731a9811, 0xf4387f1a), TOBN(0x7c501cd3, 0xb5156880),
6189 TOBN(0xa5ca4a07, 0xdfe68867), TOBN(0xf123d8f0, 0x5fcea120),
6190 TOBN(0x1fbb0e71, 0xd607039e), TOBN(0x2b70e215, 0xcd3a4546),
6191 TOBN(0x32d2f01d, 0x53324091), TOBN(0xb796ff08, 0x180ab19b),
6192 TOBN(0x32d87a86, 0x3c57c4aa), TOBN(0x2aed9caf, 0xb7c49a27),
6193 TOBN(0x9fb35eac, 0x31630d98), TOBN(0x338e8cdf, 0x5c3e20a3),
6194 TOBN(0x80f16182, 0x66cde8db), TOBN(0x4e159980, 0x2d72fd36),
6195 TOBN(0xd7b8f13b, 0x9b6e5072), TOBN(0xf5213907, 0x3b7b5dc1),
6196 TOBN(0x4d431f1d, 0x8ce4396e), TOBN(0x37a1a680, 0xa7ed2142),
6197 TOBN(0xbf375696, 0xd01aaf6b), TOBN(0xaa1c0c54, 0xe63aab66),
6198 TOBN(0x3014368b, 0x4ed80940), TOBN(0x67e6d056, 0x7a6fcedd),
6199 TOBN(0x7c208c49, 0xca97579f), TOBN(0xfe3d7a81, 0xa23597f6),
6200 TOBN(0x5e203202, 0x7e096ae2), TOBN(0xb1f3e1e7, 0x24b39366),
6201 TOBN(0x26da26f3, 0x2fdcdffc), TOBN(0x79422f1d, 0x6097be83),
6202 },
6203 {
6204 TOBN(0x263a2cfb, 0x9db3b381), TOBN(0x9c3a2dee, 0xd4df0a4b),
6205 TOBN(0x728d06e9, 0x7d04e61f), TOBN(0x8b1adfbc, 0x42449325),
6206 TOBN(0x6ec1d939, 0x7e053a1b), TOBN(0xee2be5c7, 0x66daf707),
6207 TOBN(0x80ba1e14, 0x810ac7ab), TOBN(0xdd2ae778, 0xf530f174),
6208 TOBN(0x0435d97a, 0x205b9d8b), TOBN(0x6eb8f064, 0x056756d4),
6209 TOBN(0xd5e88a8b, 0xb6f8210e), TOBN(0x070ef12d, 0xec9fd9ea),
6210 TOBN(0x4d849505, 0x3bcc876a), TOBN(0x12a75338, 0xa7404ce3),
6211 TOBN(0xd22b49e1, 0xb8a1db5e), TOBN(0xec1f2051, 0x14bfa5ad),
6212 TOBN(0xadbaeb79, 0xb6828f36), TOBN(0x9d7a0258, 0x01bd5b9e),
6213 TOBN(0xeda01e0d, 0x1e844b0c), TOBN(0x4b625175, 0x887edfc9),
6214 TOBN(0x14109fdd, 0x9669b621), TOBN(0x88a2ca56, 0xf6f87b98),
6215 TOBN(0xfe2eb788, 0x170df6bc), TOBN(0x0cea06f4, 0xffa473f9),
6216 TOBN(0x43ed81b5, 0xc4e83d33), TOBN(0xd9f35879, 0x5efd488b),
6217 TOBN(0x164a620f, 0x9deb4d0f), TOBN(0xc6927bdb, 0xac6a7394),
6218 TOBN(0x45c28df7, 0x9f9e0f03), TOBN(0x2868661e, 0xfcd7e1a9),
6219 TOBN(0x7cf4e8d0, 0xffa348f1), TOBN(0x6bd4c284, 0x398538e0),
6220 TOBN(0x2618a091, 0x289a8619), TOBN(0xef796e60, 0x6671b173),
6221 TOBN(0x664e46e5, 0x9090c632), TOBN(0xa38062d4, 0x1e66f8fb),
6222 TOBN(0x6c744a20, 0x0573274e), TOBN(0xd07b67e4, 0xa9271394),
6223 TOBN(0x391223b2, 0x6bdc0e20), TOBN(0xbe2d93f1, 0xeb0a05a7),
6224 TOBN(0xf23e2e53, 0x3f36d141), TOBN(0xe84bb3d4, 0x4dfca442),
6225 TOBN(0xb804a48d, 0x6b7c023a), TOBN(0x1e16a8fa, 0x76431c3b),
6226 TOBN(0x1b5452ad, 0xddd472e0), TOBN(0x7d405ee7, 0x0d1ee127),
6227 TOBN(0x50fc6f1d, 0xffa27599), TOBN(0x351ac53c, 0xbf391b35),
6228 TOBN(0x7efa14b8, 0x4444896b), TOBN(0x64974d2f, 0xf94027fb),
6229 TOBN(0xefdcd0e8, 0xde84487d), TOBN(0x8c45b260, 0x2b48989b),
6230 TOBN(0xa8fcbbc2, 0xd8463487), TOBN(0xd1b2b3f7, 0x3fbc476c),
6231 TOBN(0x21d005b7, 0xc8f443c0), TOBN(0x518f2e67, 0x40c0139c),
6232 TOBN(0x56036e8c, 0x06d75fc1), TOBN(0x2dcf7bb7, 0x3249a89f),
6233 TOBN(0x81dd1d3d, 0xe245e7dd), TOBN(0xf578dc4b, 0xebd6e2a7),
6234 TOBN(0x4c028903, 0xdf2ce7a0), TOBN(0xaee36288, 0x9c39afac),
6235 TOBN(0xdc847c31, 0x146404ab), TOBN(0x6304c0d8, 0xa4e97818),
6236 TOBN(0xae51dca2, 0xa91f6791), TOBN(0x2abe4190, 0x9baa9efc),
6237 TOBN(0xd9d2e2f4, 0x559c7ac1), TOBN(0xe82f4b51, 0xfc9f773a),
6238 TOBN(0xa7713027, 0x4073e81c), TOBN(0xc0276fac, 0xfbb596fc),
6239 TOBN(0x1d819fc9, 0xa684f70c), TOBN(0x29b47fdd, 0xc9f7b1e0),
6240 TOBN(0x358de103, 0x459b1940), TOBN(0xec881c59, 0x5b013e93),
6241 TOBN(0x51574c93, 0x49532ad3), TOBN(0x2db1d445, 0xb37b46de),
6242 TOBN(0xc6445b87, 0xdf239fd8), TOBN(0xc718af75, 0x151d24ee),
6243 TOBN(0xaea1c4a4, 0xf43c6259), TOBN(0x40c0e5d7, 0x70be02f7),
6244 TOBN(0x6a4590f4, 0x721b33f2), TOBN(0x2124f1fb, 0xfedf04ea),
6245 TOBN(0xf8e53cde, 0x9745efe7), TOBN(0xe7e10432, 0x65f046d9),
6246 TOBN(0xc3fca28e, 0xe4d0c7e6), TOBN(0x847e339a, 0x87253b1b),
6247 TOBN(0x9b595348, 0x3743e643), TOBN(0xcb6a0a0b, 0x4fd12fc5),
6248 TOBN(0xfb6836c3, 0x27d02dcc), TOBN(0x5ad00982, 0x7a68bcc2),
6249 TOBN(0x1b24b44c, 0x005e912d), TOBN(0xcc83d20f, 0x811fdcfe),
6250 TOBN(0x36527ec1, 0x666fba0c), TOBN(0x69948197, 0x14754635),
6251 TOBN(0xfcdcb1a8, 0x556da9c2), TOBN(0xa5934267, 0x81a732b2),
6252 TOBN(0xec1214ed, 0xa714181d), TOBN(0x609ac13b, 0x6067b341),
6253 TOBN(0xff4b4c97, 0xa545df1f), TOBN(0xa1240501, 0x34d2076b),
6254 TOBN(0x6efa0c23, 0x1409ca97), TOBN(0x254cc1a8, 0x20638c43),
6255 TOBN(0xd4e363af, 0xdcfb46cd), TOBN(0x62c2adc3, 0x03942a27),
6256 TOBN(0xc67b9df0, 0x56e46483), TOBN(0xa55abb20, 0x63736356),
6257 TOBN(0xab93c098, 0xc551bc52), TOBN(0x382b49f9, 0xb15fe64b),
6258 TOBN(0x9ec221ad, 0x4dff8d47), TOBN(0x79caf615, 0x437df4d6),
6259 TOBN(0x5f13dc64, 0xbb456509), TOBN(0xe4c589d9, 0x191f0714),
6260 TOBN(0x27b6a8ab, 0x3fd40e09), TOBN(0xe455842e, 0x77313ea9),
6261 TOBN(0x8b51d1e2, 0x1f55988b), TOBN(0x5716dd73, 0x062bbbfc),
6262 TOBN(0x633c11e5, 0x4e8bf3de), TOBN(0x9a0e77b6, 0x1b85be3b),
6263 TOBN(0x56510729, 0x0911cca6), TOBN(0x27e76495, 0xefa6590f),
6264 TOBN(0xe4ac8b33, 0x070d3aab), TOBN(0x2643672b, 0x9a2cd5e5),
6265 TOBN(0x52eff79b, 0x1cfc9173), TOBN(0x665ca49b, 0x90a7c13f),
6266 TOBN(0x5a8dda59, 0xb3efb998), TOBN(0x8a5b922d, 0x052f1341),
6267 TOBN(0xae9ebbab, 0x3cf9a530), TOBN(0x35986e7b, 0xf56da4d7),
6268 TOBN(0x3a636b5c, 0xff3513cc), TOBN(0xbb0cf8ba, 0x3198f7dd),
6269 TOBN(0xb8d40522, 0x41f16f86), TOBN(0x760575d8, 0xde13a7bf),
6270 TOBN(0x36f74e16, 0x9f7aa181), TOBN(0x163a3ecf, 0xf509ed1c),
6271 TOBN(0x6aead61f, 0x3c40a491), TOBN(0x158c95fc, 0xdfe8fcaa),
6272 TOBN(0xa3991b6e, 0x13cda46f), TOBN(0x79482415, 0x342faed0),
6273 TOBN(0xf3ba5bde, 0x666b5970), TOBN(0x1d52e6bc, 0xb26ab6dd),
6274 TOBN(0x768ba1e7, 0x8608dd3d), TOBN(0x4930db2a, 0xea076586),
6275 TOBN(0xd9575714, 0xe7dc1afa), TOBN(0x1fc7bf7d, 0xf7c58817),
6276 TOBN(0x6b47accd, 0xd9eee96c), TOBN(0x0ca277fb, 0xe58cec37),
6277 TOBN(0x113fe413, 0xe702c42a), TOBN(0xdd1764ee, 0xc47cbe51),
6278 TOBN(0x041e7cde, 0x7b3ed739), TOBN(0x50cb7459, 0x5ce9e1c0),
6279 TOBN(0x35568513, 0x2925b212), TOBN(0x7cff95c4, 0x001b081c),
6280 TOBN(0x63ee4cbd, 0x8088b454), TOBN(0xdb7f32f7, 0x9a9e0c8a),
6281 TOBN(0xb377d418, 0x6b2447cb), TOBN(0xe3e982aa, 0xd370219b),
6282 TOBN(0x06ccc1e4, 0xc2a2a593), TOBN(0x72c36865, 0x0773f24f),
6283 TOBN(0xa13b4da7, 0x95859423), TOBN(0x8bbf1d33, 0x75040c8f),
6284 TOBN(0x726f0973, 0xda50c991), TOBN(0x48afcd5b, 0x822d6ee2),
6285 TOBN(0xe5fc718b, 0x20fd7771), TOBN(0xb9e8e77d, 0xfd0807a1),
6286 TOBN(0x7f5e0f44, 0x99a7703d), TOBN(0x6972930e, 0x618e36f3),
6287 TOBN(0x2b7c77b8, 0x23807bbe), TOBN(0xe5b82405, 0xcb27ff50),
6288 TOBN(0xba8b8be3, 0xbd379062), TOBN(0xd64b7a1d, 0x2dce4a92),
6289 TOBN(0x040a73c5, 0xb2952e37), TOBN(0x0a9e252e, 0xd438aeca),
6290 TOBN(0xdd43956b, 0xc39d3bcb), TOBN(0x1a31ca00, 0xb32b2d63),
6291 TOBN(0xd67133b8, 0x5c417a18), TOBN(0xd08e4790, 0x2ef442c8),
6292 TOBN(0x98cb1ae9, 0x255c0980), TOBN(0x4bd86381, 0x2b4a739f),
6293 TOBN(0x5a5c31e1, 0x1e4a45a1), TOBN(0x1e5d55fe, 0x9cb0db2f),
6294 TOBN(0x74661b06, 0x8ff5cc29), TOBN(0x026b389f, 0x0eb8a4f4),
6295 TOBN(0x536b21a4, 0x58848c24), TOBN(0x2e5bf8ec, 0x81dc72b0),
6296 TOBN(0x03c187d0, 0xad886aac), TOBN(0x5c16878a, 0xb771b645),
6297 TOBN(0xb07dfc6f, 0xc74045ab), TOBN(0x2c6360bf, 0x7800caed),
6298 TOBN(0x24295bb5, 0xb9c972a3), TOBN(0xc9e6f88e, 0x7c9a6dba),
6299 TOBN(0x90ffbf24, 0x92a79aa6), TOBN(0xde29d50a, 0x41c26ac2),
6300 TOBN(0x9f0af483, 0xd309cbe6), TOBN(0x5b020d8a, 0xe0bced4f),
6301 TOBN(0x606e986d, 0xb38023e3), TOBN(0xad8f2c9d, 0x1abc6933),
6302 TOBN(0x19292e1d, 0xe7400e93), TOBN(0xfe3e18a9, 0x52be5e4d),
6303 TOBN(0xe8e9771d, 0x2e0680bf), TOBN(0x8c5bec98, 0xc54db063),
6304 TOBN(0x2af9662a, 0x74a55d1f), TOBN(0xe3fbf28f, 0x046f66d8),
6305 TOBN(0xa3a72ab4, 0xd4dc4794), TOBN(0x09779f45, 0x5c7c2dd8),
6306 TOBN(0xd893bdaf, 0xc3d19d8d), TOBN(0xd5a75094, 0x57d6a6df),
6307 TOBN(0x8cf8fef9, 0x952e6255), TOBN(0x3da67cfb, 0xda9a8aff),
6308 TOBN(0x4c23f62a, 0x2c160dcd), TOBN(0x34e6c5e3, 0x8f90eaef),
6309 TOBN(0x35865519, 0xa9a65d5a), TOBN(0x07c48aae, 0x8fd38a3d),
6310 TOBN(0xb7e7aeda, 0x50068527), TOBN(0x2c09ef23, 0x1c90936a),
6311 TOBN(0x31ecfeb6, 0xe879324c), TOBN(0xa0871f6b, 0xfb0ec938),
6312 TOBN(0xb1f0fb68, 0xd84d835d), TOBN(0xc90caf39, 0x861dc1e6),
6313 TOBN(0x12e5b046, 0x7594f8d7), TOBN(0x26897ae2, 0x65012b92),
6314 TOBN(0xbcf68a08, 0xa4d6755d), TOBN(0x403ee41c, 0x0991fbda),
6315 TOBN(0x733e343e, 0x3bbf17e8), TOBN(0xd2c7980d, 0x679b3d65),
6316 TOBN(0x33056232, 0xd2e11305), TOBN(0x966be492, 0xf3c07a6f),
6317 TOBN(0x6a8878ff, 0xbb15509d), TOBN(0xff221101, 0x0a9b59a4),
6318 TOBN(0x6c9f564a, 0xabe30129), TOBN(0xc6f2c940, 0x336e64cf),
6319 TOBN(0x0fe75262, 0x8b0c8022), TOBN(0xbe0267e9, 0x6ae8db87),
6320 TOBN(0x22e192f1, 0x93bc042b), TOBN(0xf085b534, 0xb237c458),
6321 TOBN(0xa0d192bd, 0x832c4168), TOBN(0x7a76e9e3, 0xbdf6271d),
6322 TOBN(0x52a882fa, 0xb88911b5), TOBN(0xc85345e4, 0xb4db0eb5),
6323 TOBN(0xa3be02a6, 0x81a7c3ff), TOBN(0x51889c8c, 0xf0ec0469),
6324 TOBN(0x9d031369, 0xa5e829e5), TOBN(0xcbb4c6fc, 0x1607aa41),
6325 TOBN(0x75ac59a6, 0x241d84c1), TOBN(0xc043f2bf, 0x8829e0ee),
6326 TOBN(0x82a38f75, 0x8ea5e185), TOBN(0x8bda40b9, 0xd87cbd9f),
6327 TOBN(0x9e65e75e, 0x2d8fc601), TOBN(0x3d515f74, 0xa35690b3),
6328 TOBN(0x534acf4f, 0xda79e5ac), TOBN(0x68b83b3a, 0x8630215f),
6329 TOBN(0x5c748b2e, 0xd085756e), TOBN(0xb0317258, 0xe5d37cb2),
6330 TOBN(0x6735841a, 0xc5ccc2c4), TOBN(0x7d7dc96b, 0x3d9d5069),
6331 TOBN(0xa147e410, 0xfd1754bd), TOBN(0x65296e94, 0xd399ddd5),
6332 TOBN(0xf6b5b2d0, 0xbc8fa5bc), TOBN(0x8a5ead67, 0x500c277b),
6333 TOBN(0x214625e6, 0xdfa08a5d), TOBN(0x51fdfedc, 0x959cf047),
6334 TOBN(0x6bc9430b, 0x289fca32), TOBN(0xe36ff0cf, 0x9d9bdc3f),
6335 TOBN(0x2fe187cb, 0x58ea0ede), TOBN(0xed66af20, 0x5a900b3f),
6336 TOBN(0x00e0968b, 0x5fa9f4d6), TOBN(0x2d4066ce, 0x37a362e7),
6337 TOBN(0xa99a9748, 0xbd07e772), TOBN(0x710989c0, 0x06a4f1d0),
6338 TOBN(0xd5dedf35, 0xce40cbd8), TOBN(0xab55c5f0, 0x1743293d),
6339 TOBN(0x766f1144, 0x8aa24e2c), TOBN(0x94d874f8, 0x605fbcb4),
6340 TOBN(0xa365f0e8, 0xa518001b), TOBN(0xee605eb6, 0x9d04ef0f),
6341 TOBN(0x5a3915cd, 0xba8d4d25), TOBN(0x44c0e1b8, 0xb5113472),
6342 TOBN(0xcbb024e8, 0x8b6740dc), TOBN(0x89087a53, 0xee1d4f0c),
6343 TOBN(0xa88fa05c, 0x1fc4e372), TOBN(0x8bf395cb, 0xaf8b3af2),
6344 TOBN(0x1e71c9a1, 0xdeb8568b), TOBN(0xa35daea0, 0x80fb3d32),
6345 TOBN(0xe8b6f266, 0x2cf8fb81), TOBN(0x6d51afe8, 0x9490696a),
6346 TOBN(0x81beac6e, 0x51803a19), TOBN(0xe3d24b7f, 0x86219080),
6347 TOBN(0x727cfd9d, 0xdf6f463c), TOBN(0x8c6865ca, 0x72284ee8),
6348 TOBN(0x32c88b7d, 0xb743f4ef), TOBN(0x3793909b, 0xe7d11dce),
6349 TOBN(0xd398f922, 0x2ff2ebe8), TOBN(0x2c70ca44, 0xe5e49796),
6350 TOBN(0xdf4d9929, 0xcb1131b1), TOBN(0x7826f298, 0x25888e79),
6351 TOBN(0x4d3a112c, 0xf1d8740a), TOBN(0x00384cb6, 0x270afa8b),
6352 TOBN(0xcb64125b, 0x3ab48095), TOBN(0x3451c256, 0x62d05106),
6353 TOBN(0xd73d577d, 0xa4955845), TOBN(0x39570c16, 0xbf9f4433),
6354 TOBN(0xd7dfaad3, 0xadecf263), TOBN(0xf1c3d8d1, 0xdc76e102),
6355 TOBN(0x5e774a58, 0x54c6a836), TOBN(0xdad4b672, 0x3e92d47b),
6356 TOBN(0xbe7e990f, 0xf0d796a0), TOBN(0x5fc62478, 0xdf0e8b02),
6357 TOBN(0x8aae8bf4, 0x030c00ad), TOBN(0x3d2db93b, 0x9004ba0f),
6358 TOBN(0xe48c8a79, 0xd85d5ddc), TOBN(0xe907caa7, 0x6bb07f34),
6359 TOBN(0x58db343a, 0xa39eaed5), TOBN(0x0ea6e007, 0xadaf5724),
6360 TOBN(0xe00df169, 0xd23233f3), TOBN(0x3e322796, 0x77cb637f),
6361 TOBN(0x1f897c0e, 0x1da0cf6c), TOBN(0xa651f5d8, 0x31d6bbdd),
6362 TOBN(0xdd61af19, 0x1a230c76), TOBN(0xbd527272, 0xcdaa5e4a),
6363 TOBN(0xca753636, 0xd0abcd7e), TOBN(0x78bdd37c, 0x370bd8dc),
6364 TOBN(0xc23916c2, 0x17cd93fe), TOBN(0x65b97a4d, 0xdadce6e2),
6365 TOBN(0xe04ed4eb, 0x174e42f8), TOBN(0x1491ccaa, 0xbb21480a),
6366 TOBN(0x145a8280, 0x23196332), TOBN(0x3c3862d7, 0x587b479a),
6367 TOBN(0x9f4a88a3, 0x01dcd0ed), TOBN(0x4da2b7ef, 0x3ea12f1f),
6368 TOBN(0xf8e7ae33, 0xb126e48e), TOBN(0x404a0b32, 0xf494e237),
6369 TOBN(0x9beac474, 0xc55acadb), TOBN(0x4ee5cf3b, 0xcbec9fd9),
6370 TOBN(0x336b33b9, 0x7df3c8c3), TOBN(0xbd905fe3, 0xb76808fd),
6371 TOBN(0x8f436981, 0xaa45c16a), TOBN(0x255c5bfa, 0x3dd27b62),
6372 TOBN(0x71965cbf, 0xc3dd9b4d), TOBN(0xce23edbf, 0xfc068a87),
6373 TOBN(0xb78d4725, 0x745b029b), TOBN(0x74610713, 0xcefdd9bd),
6374 TOBN(0x7116f75f, 0x1266bf52), TOBN(0x02046722, 0x18e49bb6),
6375 TOBN(0xdf43df9f, 0x3d6f19e3), TOBN(0xef1bc7d0, 0xe685cb2f),
6376 TOBN(0xcddb27c1, 0x7078c432), TOBN(0xe1961b9c, 0xb77fedb7),
6377 TOBN(0x1edc2f5c, 0xc2290570), TOBN(0x2c3fefca, 0x19cbd886),
6378 TOBN(0xcf880a36, 0xc2af389a), TOBN(0x96c610fd, 0xbda71cea),
6379 TOBN(0xf03977a9, 0x32aa8463), TOBN(0x8eb7763f, 0x8586d90a),
6380 TOBN(0x3f342454, 0x2a296e77), TOBN(0xc8718683, 0x42837a35),
6381 TOBN(0x7dc71090, 0x6a09c731), TOBN(0x54778ffb, 0x51b816db),
6382 TOBN(0x6b33bfec, 0xaf06defd), TOBN(0xfe3c105f, 0x8592b70b),
6383 TOBN(0xf937fda4, 0x61da6114), TOBN(0x3c13e651, 0x4c266ad7),
6384 TOBN(0xe363a829, 0x855938e8), TOBN(0x2eeb5d9e, 0x9de54b72),
6385 TOBN(0xbeb93b0e, 0x20ccfab9), TOBN(0x3dffbb5f, 0x25e61a25),
6386 TOBN(0x7f655e43, 0x1acc093d), TOBN(0x0cb6cc3d, 0x3964ce61),
6387 TOBN(0x6ab283a1, 0xe5e9b460), TOBN(0x55d787c5, 0xa1c7e72d),
6388 TOBN(0x4d2efd47, 0xdeadbf02), TOBN(0x11e80219, 0xac459068),
6389 TOBN(0x810c7626, 0x71f311f0), TOBN(0xfa17ef8d, 0x4ab6ef53),
6390 TOBN(0xaf47fd25, 0x93e43bff), TOBN(0x5cb5ff3f, 0x0be40632),
6391 TOBN(0x54687106, 0x8ee61da3), TOBN(0x7764196e, 0xb08afd0f),
6392 TOBN(0x831ab3ed, 0xf0290a8f), TOBN(0xcae81966, 0xcb47c387),
6393 TOBN(0xaad7dece, 0x184efb4f), TOBN(0xdcfc53b3, 0x4749110e),
6394 TOBN(0x6698f23c, 0x4cb632f9), TOBN(0xc42a1ad6, 0xb91f8067),
6395 TOBN(0xb116a81d, 0x6284180a), TOBN(0xebedf5f8, 0xe901326f),
6396 TOBN(0xf2274c9f, 0x97e3e044), TOBN(0x42018520, 0x11d09fc9),
6397 TOBN(0x56a65f17, 0xd18e6e23), TOBN(0x2ea61e2a, 0x352b683c),
6398 TOBN(0x27d291bc, 0x575eaa94), TOBN(0x9e7bc721, 0xb8ff522d),
6399 TOBN(0x5f7268bf, 0xa7f04d6f), TOBN(0x5868c73f, 0xaba41748),
6400 TOBN(0x9f85c2db, 0x7be0eead), TOBN(0x511e7842, 0xff719135),
6401 TOBN(0x5a06b1e9, 0xc5ea90d7), TOBN(0x0c19e283, 0x26fab631),
6402 TOBN(0x8af8f0cf, 0xe9206c55), TOBN(0x89389cb4, 0x3553c06a),
6403 TOBN(0x39dbed97, 0xf65f8004), TOBN(0x0621b037, 0xc508991d),
6404 TOBN(0x1c52e635, 0x96e78cc4), TOBN(0x5385c8b2, 0x0c06b4a8),
6405 TOBN(0xd84ddfdb, 0xb0e87d03), TOBN(0xc49dfb66, 0x934bafad),
6406 TOBN(0x7071e170, 0x59f70772), TOBN(0x3a073a84, 0x3a1db56b),
6407 TOBN(0x03494903, 0x3b8af190), TOBN(0x7d882de3, 0xd32920f0),
6408 TOBN(0x91633f0a, 0xb2cf8940), TOBN(0x72b0b178, 0x6f948f51),
6409 TOBN(0x2d28dc30, 0x782653c8), TOBN(0x88829849, 0xdb903a05),
6410 TOBN(0xb8095d0c, 0x6a19d2bb), TOBN(0x4b9e7f0c, 0x86f782cb),
6411 TOBN(0x7af73988, 0x2d907064), TOBN(0xd12be0fe, 0x8b32643c),
6412 TOBN(0x358ed23d, 0x0e165dc3), TOBN(0x3d47ce62, 0x4e2378ce),
6413 TOBN(0x7e2bb0b9, 0xfeb8a087), TOBN(0x3246e8ae, 0xe29e10b9),
6414 TOBN(0x459f4ec7, 0x03ce2b4d), TOBN(0xe9b4ca1b, 0xbbc077cf),
6415 TOBN(0x2613b4f2, 0x0e9940c1), TOBN(0xfc598bb9, 0x047d1eb1),
6416 TOBN(0x9744c62b, 0x45036099), TOBN(0xa9dee742, 0x167c65d8),
6417 TOBN(0x0c511525, 0xdabe1943), TOBN(0xda110554, 0x93c6c624),
6418 TOBN(0xae00a52c, 0x651a3be2), TOBN(0xcda5111d, 0x884449a6),
6419 TOBN(0x063c06f4, 0xff33bed1), TOBN(0x73baaf9a, 0x0d3d76b4),
6420 TOBN(0x52fb0c9d, 0x7fc63668), TOBN(0x6886c9dd, 0x0c039cde),
6421 TOBN(0x602bd599, 0x55b22351), TOBN(0xb00cab02, 0x360c7c13),
6422 TOBN(0x8cb616bc, 0x81b69442), TOBN(0x41486700, 0xb55c3cee),
6423 TOBN(0x71093281, 0xf49ba278), TOBN(0xad956d9c, 0x64a50710),
6424 TOBN(0x9561f28b, 0x638a7e81), TOBN(0x54155cdf, 0x5980ddc3),
6425 TOBN(0xb2db4a96, 0xd26f247a), TOBN(0x9d774e4e, 0x4787d100),
6426 TOBN(0x1a9e6e2e, 0x078637d2), TOBN(0x1c363e2d, 0x5e0ae06a),
6427 TOBN(0x7493483e, 0xe9cfa354), TOBN(0x76843cb3, 0x7f74b98d),
6428 TOBN(0xbaca6591, 0xd4b66947), TOBN(0xb452ce98, 0x04460a8c),
6429 TOBN(0x6830d246, 0x43768f55), TOBN(0xf4197ed8, 0x7dff12df),
6430 TOBN(0x6521b472, 0x400dd0f7), TOBN(0x59f5ca8f, 0x4b1e7093),
6431 TOBN(0x6feff11b, 0x080338ae), TOBN(0x0ada31f6, 0xa29ca3c6),
6432 TOBN(0x24794eb6, 0x94a2c215), TOBN(0xd83a43ab, 0x05a57ab4),
6433 TOBN(0x264a543a, 0x2a6f89fe), TOBN(0x2c2a3868, 0xdd5ec7c2),
6434 TOBN(0xd3373940, 0x8439d9b2), TOBN(0x715ea672, 0x0acd1f11),
6435 TOBN(0x42c1d235, 0xe7e6cc19), TOBN(0x81ce6e96, 0xb990585c),
6436 TOBN(0x04e5dfe0, 0xd809c7bd), TOBN(0xd7b2580c, 0x8f1050ab),
6437 TOBN(0x6d91ad78, 0xd8a4176f), TOBN(0x0af556ee, 0x4e2e897c),
6438 TOBN(0x162a8b73, 0x921de0ac), TOBN(0x52ac9c22, 0x7ea78400),
6439 TOBN(0xee2a4eea, 0xefce2174), TOBN(0xbe61844e, 0x6d637f79),
6440 TOBN(0x0491f1bc, 0x789a283b), TOBN(0x72d3ac3d, 0x880836f4),
6441 TOBN(0xaa1c5ea3, 0x88e5402d), TOBN(0x1b192421, 0xd5cc473d),
6442 TOBN(0x5c0b9998, 0x9dc84cac), TOBN(0xb0a8482d, 0x9c6e75b8),
6443 TOBN(0x639961d0, 0x3a191ce2), TOBN(0xda3bc865, 0x6d837930),
6444 TOBN(0xca990653, 0x056e6f8f), TOBN(0x84861c41, 0x64d133a7),
6445 TOBN(0x8b403276, 0x746abe40), TOBN(0xb7b4d51a, 0xebf8e303),
6446 TOBN(0x05b43211, 0x220a255d), TOBN(0xc997152c, 0x02419e6e),
6447 TOBN(0x76ff47b6, 0x630c2fea), TOBN(0x50518677, 0x281fdade),
6448 TOBN(0x3283b8ba, 0xcf902b0b), TOBN(0x8d4b4eb5, 0x37db303b),
6449 TOBN(0xcc89f42d, 0x755011bc), TOBN(0xb43d74bb, 0xdd09d19b),
6450 TOBN(0x65746bc9, 0x8adba350), TOBN(0x364eaf8c, 0xb51c1927),
6451 TOBN(0x13c76596, 0x10ad72ec), TOBN(0x30045121, 0xf8d40c20),
6452 TOBN(0x6d2d99b7, 0xea7b979b), TOBN(0xcd78cd74, 0xe6fb3bcd),
6453 TOBN(0x11e45a9e, 0x86cffbfe), TOBN(0x78a61cf4, 0x637024f6),
6454 TOBN(0xd06bc872, 0x3d502295), TOBN(0xf1376854, 0x458cb288),
6455 TOBN(0xb9db26a1, 0x342f8586), TOBN(0xf33effcf, 0x4beee09e),
6456 TOBN(0xd7e0c4cd, 0xb30cfb3a), TOBN(0x6d09b8c1, 0x6c9db4c8),
6457 TOBN(0x40ba1a42, 0x07c8d9df), TOBN(0x6fd495f7, 0x1c52c66d),
6458 TOBN(0xfb0e169f, 0x275264da), TOBN(0x80c2b746, 0xe57d8362),
6459 TOBN(0xedd987f7, 0x49ad7222), TOBN(0xfdc229af, 0x4398ec7b),
6460 },
6461 {
6462 TOBN(0xb0d1ed84, 0x52666a58), TOBN(0x4bcb6e00, 0xe6a9c3c2),
6463 TOBN(0x3c57411c, 0x26906408), TOBN(0xcfc20755, 0x13556400),
6464 TOBN(0xa08b1c50, 0x5294dba3), TOBN(0xa30ba286, 0x8b7dd31e),
6465 TOBN(0xd70ba90e, 0x991eca74), TOBN(0x094e142c, 0xe762c2b9),
6466 TOBN(0xb81d783e, 0x979f3925), TOBN(0x1efd130a, 0xaf4c89a7),
6467 TOBN(0x525c2144, 0xfd1bf7fa), TOBN(0x4b296904, 0x1b265a9e),
6468 TOBN(0xed8e9634, 0xb9db65b6), TOBN(0x35c82e32, 0x03599d8a),
6469 TOBN(0xdaa7a54f, 0x403563f3), TOBN(0x9df088ad, 0x022c38ab),
6470 TOBN(0xe5cfb066, 0xbb3fd30a), TOBN(0x429169da, 0xeff0354e),
6471 TOBN(0x809cf852, 0x3524e36c), TOBN(0x136f4fb3, 0x0155be1d),
6472 TOBN(0x4826af01, 0x1fbba712), TOBN(0x6ef0f0b4, 0x506ba1a1),
6473 TOBN(0xd9928b31, 0x77aea73e), TOBN(0xe2bf6af2, 0x5eaa244e),
6474 TOBN(0x8d084f12, 0x4237b64b), TOBN(0x688ebe99, 0xe3ecfd07),
6475 TOBN(0x57b8a70c, 0xf6845dd8), TOBN(0x808fc59c, 0x5da4a325),
6476 TOBN(0xa9032b2b, 0xa3585862), TOBN(0xb66825d5, 0xedf29386),
6477 TOBN(0xb5a5a8db, 0x431ec29b), TOBN(0xbb143a98, 0x3a1e8dc8),
6478 TOBN(0x35ee94ce, 0x12ae381b), TOBN(0x3a7f176c, 0x86ccda90),
6479 TOBN(0xc63a657e, 0x4606eaca), TOBN(0x9ae5a380, 0x43cd04df),
6480 TOBN(0x9bec8d15, 0xed251b46), TOBN(0x1f5d6d30, 0xcaca5e64),
6481 TOBN(0x347b3b35, 0x9ff20f07), TOBN(0x4d65f034, 0xf7e4b286),
6482 TOBN(0x9e93ba24, 0xf111661e), TOBN(0xedced484, 0xb105eb04),
6483 TOBN(0x96dc9ba1, 0xf424b578), TOBN(0xbf8f66b7, 0xe83e9069),
6484 TOBN(0x872d4df4, 0xd7ed8216), TOBN(0xbf07f377, 0x8e2cbecf),
6485 TOBN(0x4281d899, 0x98e73754), TOBN(0xfec85fbb, 0x8aab8708),
6486 TOBN(0x9a3c0dee, 0xa5ba5b0b), TOBN(0xe6a116ce, 0x42d05299),
6487 TOBN(0xae9775fe, 0xe9b02d42), TOBN(0x72b05200, 0xa1545cb6),
6488 TOBN(0xbc506f7d, 0x31a3b4ea), TOBN(0xe5893078, 0x8bbd9b32),
6489 TOBN(0xc8bc5f37, 0xe4b12a97), TOBN(0x6b000c06, 0x4a73b671),
6490 TOBN(0x13b5bf22, 0x765fa7d0), TOBN(0x59805bf0, 0x1d6a5370),
6491 TOBN(0x67a5e29d, 0x4280db98), TOBN(0x4f53916f, 0x776b1ce3),
6492 TOBN(0x714ff61f, 0x33ddf626), TOBN(0x4206238e, 0xa085d103),
6493 TOBN(0x1c50d4b7, 0xe5809ee3), TOBN(0x999f450d, 0x85f8eb1d),
6494 TOBN(0x658a6051, 0xe4c79e9b), TOBN(0x1394cb73, 0xc66a9fea),
6495 TOBN(0x27f31ed5, 0xc6be7b23), TOBN(0xf4c88f36, 0x5aa6f8fe),
6496 TOBN(0x0fb0721f, 0x4aaa499e), TOBN(0x68b3a7d5, 0xe3fb2a6b),
6497 TOBN(0xa788097d, 0x3a92851d), TOBN(0x060e7f8a, 0xe96f4913),
6498 TOBN(0x82eebe73, 0x1a3a93bc), TOBN(0x42bbf465, 0xa21adc1a),
6499 TOBN(0xc10b6fa4, 0xef030efd), TOBN(0x247aa4c7, 0x87b097bb),
6500 TOBN(0x8b8dc632, 0xf60c77da), TOBN(0x6ffbc26a, 0xc223523e),
6501 TOBN(0xa4f6ff11, 0x344579cf), TOBN(0x5825653c, 0x980250f6),
6502 TOBN(0xb2dd097e, 0xbc1aa2b9), TOBN(0x07889393, 0x37a0333a),
6503 TOBN(0x1cf55e71, 0x37a0db38), TOBN(0x2648487f, 0x792c1613),
6504 TOBN(0xdad01336, 0x3fcef261), TOBN(0x6239c81d, 0x0eabf129),
6505 TOBN(0x8ee761de, 0x9d276be2), TOBN(0x406a7a34, 0x1eda6ad3),
6506 TOBN(0x4bf367ba, 0x4a493b31), TOBN(0x54f20a52, 0x9bf7f026),
6507 TOBN(0xb696e062, 0x9795914b), TOBN(0xcddab96d, 0x8bf236ac),
6508 TOBN(0x4ff2c70a, 0xed25ea13), TOBN(0xfa1d09eb, 0x81cbbbe7),
6509 TOBN(0x88fc8c87, 0x468544c5), TOBN(0x847a670d, 0x696b3317),
6510 TOBN(0xf133421e, 0x64bcb626), TOBN(0xaea638c8, 0x26dee0b5),
6511 TOBN(0xd6e7680b, 0xb310346c), TOBN(0xe06f4097, 0xd5d4ced3),
6512 TOBN(0x09961452, 0x7512a30b), TOBN(0xf3d867fd, 0xe589a59a),
6513 TOBN(0x2e73254f, 0x52d0c180), TOBN(0x9063d8a3, 0x333c74ac),
6514 TOBN(0xeda6c595, 0xd314e7bc), TOBN(0x2ee7464b, 0x467899ed),
6515 TOBN(0x1cef423c, 0x0a1ed5d3), TOBN(0x217e76ea, 0x69cc7613),
6516 TOBN(0x27ccce1f, 0xe7cda917), TOBN(0x12d8016b, 0x8a893f16),
6517 TOBN(0xbcd6de84, 0x9fc74f6b), TOBN(0xfa5817e2, 0xf3144e61),
6518 TOBN(0x1f354164, 0x0821ee4c), TOBN(0x1583eab4, 0x0bc61992),
6519 TOBN(0x7490caf6, 0x1d72879f), TOBN(0x998ad9f3, 0xf76ae7b2),
6520 TOBN(0x1e181950, 0xa41157f7), TOBN(0xa9d7e1e6, 0xe8da3a7e),
6521 TOBN(0x963784eb, 0x8426b95f), TOBN(0x0ee4ed6e, 0x542e2a10),
6522 TOBN(0xb79d4cc5, 0xac751e7b), TOBN(0x93f96472, 0xfd4211bd),
6523 TOBN(0x8c72d3d2, 0xc8de4fc6), TOBN(0x7b69cbf5, 0xdf44f064),
6524 TOBN(0x3da90ca2, 0xf4bf94e1), TOBN(0x1a5325f8, 0xf12894e2),
6525 TOBN(0x0a437f6c, 0x7917d60b), TOBN(0x9be70486, 0x96c9cb5d),
6526 TOBN(0xb4d880bf, 0xe1dc5c05), TOBN(0xd738adda, 0xeebeeb57),
6527 TOBN(0x6f0119d3, 0xdf0fe6a3), TOBN(0x5c686e55, 0x66eaaf5a),
6528 TOBN(0x9cb10b50, 0xdfd0b7ec), TOBN(0xbdd0264b, 0x6a497c21),
6529 TOBN(0xfc093514, 0x8c546c96), TOBN(0x58a947fa, 0x79dbf42a),
6530 TOBN(0xc0b48d4e, 0x49ccd6d7), TOBN(0xff8fb02c, 0x88bd5580),
6531 TOBN(0xc75235e9, 0x07d473b2), TOBN(0x4fab1ac5, 0xa2188af3),
6532 TOBN(0x030fa3bc, 0x97576ec0), TOBN(0xe8c946e8, 0x0b7e7d2f),
6533 TOBN(0x40a5c9cc, 0x70305600), TOBN(0x6d8260a9, 0xc8b013b4),
6534 TOBN(0x0368304f, 0x70bba85c), TOBN(0xad090da1, 0xa4a0d311),
6535 TOBN(0x7170e870, 0x2415eec1), TOBN(0xbfba35fe, 0x8461ea47),
6536 TOBN(0x6279019a, 0xc1e91938), TOBN(0xa47638f3, 0x1afc415f),
6537 TOBN(0x36c65cbb, 0xbcba0e0f), TOBN(0x02160efb, 0x034e2c48),
6538 TOBN(0xe6c51073, 0x615cd9e4), TOBN(0x498ec047, 0xf1243c06),
6539 TOBN(0x3e5a8809, 0xb17b3d8c), TOBN(0x5cd99e61, 0x0cc565f1),
6540 TOBN(0x81e312df, 0x7851dafe), TOBN(0xf156f5ba, 0xa79061e2),
6541 TOBN(0x80d62b71, 0x880c590e), TOBN(0xbec9746f, 0x0a39faa1),
6542 TOBN(0x1d98a9c1, 0xc8ed1f7a), TOBN(0x09e43bb5, 0xa81d5ff2),
6543 TOBN(0xd5f00f68, 0x0da0794a), TOBN(0x412050d9, 0x661aa836),
6544 TOBN(0xa89f7c4e, 0x90747e40), TOBN(0x6dc05ebb, 0xb62a3686),
6545 TOBN(0xdf4de847, 0x308e3353), TOBN(0x53868fbb, 0x9fb53bb9),
6546 TOBN(0x2b09d2c3, 0xcfdcf7dd), TOBN(0x41a9fce3, 0x723fcab4),
6547 TOBN(0x73d905f7, 0x07f57ca3), TOBN(0x080f9fb1, 0xac8e1555),
6548 TOBN(0x7c088e84, 0x9ba7a531), TOBN(0x07d35586, 0xed9a147f),
6549 TOBN(0x602846ab, 0xaf48c336), TOBN(0x7320fd32, 0x0ccf0e79),
6550 TOBN(0xaa780798, 0xb18bd1ff), TOBN(0x52c2e300, 0xafdd2905),
6551 TOBN(0xf27ea3d6, 0x434267cd), TOBN(0x8b96d16d, 0x15605b5f),
6552 TOBN(0x7bb31049, 0x4b45706b), TOBN(0xe7f58b8e, 0x743d25f8),
6553 TOBN(0xe9b5e45b, 0x87f30076), TOBN(0xd19448d6, 0x5d053d5a),
6554 TOBN(0x1ecc8cb9, 0xd3210a04), TOBN(0x6bc7d463, 0xdafb5269),
6555 TOBN(0x3e59b10a, 0x67c3489f), TOBN(0x1769788c, 0x65641e1b),
6556 TOBN(0x8a53b82d, 0xbd6cb838), TOBN(0x7066d6e6, 0x236d5f22),
6557 TOBN(0x03aa1c61, 0x6908536e), TOBN(0xc971da0d, 0x66ae9809),
6558 TOBN(0x01b3a86b, 0xc49a2fac), TOBN(0x3b8420c0, 0x3092e77a),
6559 TOBN(0x02057300, 0x7d6fb556), TOBN(0x6941b2a1, 0xbff40a87),
6560 TOBN(0x140b6308, 0x0658ff2a), TOBN(0x87804363, 0x3424ab36),
6561 TOBN(0x0253bd51, 0x5751e299), TOBN(0xc75bcd76, 0x449c3e3a),
6562 TOBN(0x92eb4090, 0x7f8f875d), TOBN(0x9c9d754e, 0x56c26bbf),
6563 TOBN(0x158cea61, 0x8110bbe7), TOBN(0x62a6b802, 0x745f91ea),
6564 TOBN(0xa79c41aa, 0xc6e7394b), TOBN(0x445b6a83, 0xad57ef10),
6565 TOBN(0x0c5277eb, 0x6ea6f40c), TOBN(0x319fe96b, 0x88633365),
6566 TOBN(0x0b0fc61f, 0x385f63cb), TOBN(0x41250c84, 0x22bdd127),
6567 TOBN(0x67d153f1, 0x09e942c2), TOBN(0x60920d08, 0xc021ad5d),
6568 TOBN(0x229f5746, 0x724d81a5), TOBN(0xb7ffb892, 0x5bba3299),
6569 TOBN(0x518c51a1, 0xde413032), TOBN(0x2a9bfe77, 0x3c2fd94c),
6570 TOBN(0xcbcde239, 0x3191f4fd), TOBN(0x43093e16, 0xd3d6ada1),
6571 TOBN(0x184579f3, 0x58769606), TOBN(0x2c94a8b3, 0xd236625c),
6572 TOBN(0x6922b9c0, 0x5c437d8e), TOBN(0x3d4ae423, 0xd8d9f3c8),
6573 TOBN(0xf72c31c1, 0x2e7090a2), TOBN(0x4ac3f5f3, 0xd76a55bd),
6574 TOBN(0x342508fc, 0x6b6af991), TOBN(0x0d527100, 0x1b5cebbd),
6575 TOBN(0xb84740d0, 0xdd440dd7), TOBN(0x748ef841, 0x780162fd),
6576 TOBN(0xa8dbfe0e, 0xdfc6fafb), TOBN(0xeadfdf05, 0xf7300f27),
6577 TOBN(0x7d06555f, 0xfeba4ec9), TOBN(0x12c56f83, 0x9e25fa97),
6578 TOBN(0x77f84203, 0xd39b8c34), TOBN(0xed8b1be6, 0x3125eddb),
6579 TOBN(0x5bbf2441, 0xf6e39dc5), TOBN(0xb00f6ee6, 0x6a5d678a),
6580 TOBN(0xba456ecf, 0x57d0ea99), TOBN(0xdcae0f58, 0x17e06c43),
6581 TOBN(0x01643de4, 0x0f5b4baa), TOBN(0x2c324341, 0xd161b9be),
6582 TOBN(0x80177f55, 0xe126d468), TOBN(0xed325f1f, 0x76748e09),
6583 TOBN(0x6116004a, 0xcfa9bdc2), TOBN(0x2d8607e6, 0x3a9fb468),
6584 TOBN(0x0e573e27, 0x6009d660), TOBN(0x3a525d2e, 0x8d10c5a1),
6585 TOBN(0xd26cb45c, 0x3b9009a0), TOBN(0xb6b0cdc0, 0xde9d7448),
6586 TOBN(0x949c9976, 0xe1337c26), TOBN(0x6faadebd, 0xd73d68e5),
6587 TOBN(0x9e158614, 0xf1b768d9), TOBN(0x22dfa557, 0x9cc4f069),
6588 TOBN(0xccd6da17, 0xbe93c6d6), TOBN(0x24866c61, 0xa504f5b9),
6589 TOBN(0x2121353c, 0x8d694da1), TOBN(0x1c6ca580, 0x0140b8c6),
6590 TOBN(0xc245ad8c, 0xe964021e), TOBN(0xb83bffba, 0x032b82b3),
6591 TOBN(0xfaa220c6, 0x47ef9898), TOBN(0x7e8d3ac6, 0x982c948a),
6592 TOBN(0x1faa2091, 0xbc2d124a), TOBN(0xbd54c3dd, 0x05b15ff4),
6593 TOBN(0x386bf3ab, 0xc87c6fb7), TOBN(0xfb2b0563, 0xfdeb6f66),
6594 TOBN(0x4e77c557, 0x5b45afb4), TOBN(0xe9ded649, 0xefb8912d),
6595 TOBN(0x7ec9bbf5, 0x42f6e557), TOBN(0x2570dfff, 0x62671f00),
6596 TOBN(0x2b3bfb78, 0x88e084bd), TOBN(0xa024b238, 0xf37fe5b4),
6597 TOBN(0x44e7dc04, 0x95649aee), TOBN(0x498ca255, 0x5e7ec1d8),
6598 TOBN(0x3bc766ea, 0xaaa07e86), TOBN(0x0db6facb, 0xf3608586),
6599 TOBN(0xbadd2549, 0xbdc259c8), TOBN(0x95af3c6e, 0x041c649f),
6600 TOBN(0xb36a928c, 0x02e30afb), TOBN(0x9b5356ad, 0x008a88b8),
6601 TOBN(0x4b67a5f1, 0xcf1d9e9d), TOBN(0xc6542e47, 0xa5d8d8ce),
6602 TOBN(0x73061fe8, 0x7adfb6cc), TOBN(0xcc826fd3, 0x98678141),
6603 TOBN(0x00e758b1, 0x3c80515a), TOBN(0x6afe3247, 0x41485083),
6604 TOBN(0x0fcb08b9, 0xb6ae8a75), TOBN(0xb8cf388d, 0x4acf51e1),
6605 TOBN(0x344a5560, 0x6961b9d6), TOBN(0x1a6778b8, 0x6a97fd0c),
6606 TOBN(0xd840fdc1, 0xecc4c7e3), TOBN(0xde9fe47d, 0x16db68cc),
6607 TOBN(0xe95f89de, 0xa3e216aa), TOBN(0x84f1a6a4, 0x9594a8be),
6608 TOBN(0x7ddc7d72, 0x5a7b162b), TOBN(0xc5cfda19, 0xadc817a3),
6609 TOBN(0x80a5d350, 0x78b58d46), TOBN(0x93365b13, 0x82978f19),
6610 TOBN(0x2e44d225, 0x26a1fc90), TOBN(0x0d6d10d2, 0x4d70705d),
6611 TOBN(0xd94b6b10, 0xd70c45f4), TOBN(0x0f201022, 0xb216c079),
6612 TOBN(0xcec966c5, 0x658fde41), TOBN(0xa8d2bc7d, 0x7e27601d),
6613 TOBN(0xbfcce3e1, 0xff230be7), TOBN(0x3394ff6b, 0x0033ffb5),
6614 TOBN(0xd890c509, 0x8132c9af), TOBN(0xaac4b0eb, 0x361e7868),
6615 TOBN(0x5194ded3, 0xe82d15aa), TOBN(0x4550bd2e, 0x23ae6b7d),
6616 TOBN(0x3fda318e, 0xea5399d4), TOBN(0xd989bffa, 0x91638b80),
6617 TOBN(0x5ea124d0, 0xa14aa12d), TOBN(0x1fb1b899, 0x3667b944),
6618 TOBN(0x95ec7969, 0x44c44d6a), TOBN(0x91df144a, 0x57e86137),
6619 TOBN(0x915fd620, 0x73adac44), TOBN(0x8f01732d, 0x59a83801),
6620 TOBN(0xec579d25, 0x3aa0a633), TOBN(0x06de5e7c, 0xc9d6d59c),
6621 TOBN(0xc132f958, 0xb1ef8010), TOBN(0x29476f96, 0xe65c1a02),
6622 TOBN(0x336a77c0, 0xd34c3565), TOBN(0xef1105b2, 0x1b9f1e9e),
6623 TOBN(0x63e6d08b, 0xf9e08002), TOBN(0x9aff2f21, 0xc613809e),
6624 TOBN(0xb5754f85, 0x3a80e75d), TOBN(0xde71853e, 0x6bbda681),
6625 TOBN(0x86f041df, 0x8197fd7a), TOBN(0x8b332e08, 0x127817fa),
6626 TOBN(0x05d99be8, 0xb9c20cda), TOBN(0x89f7aad5, 0xd5cd0c98),
6627 TOBN(0x7ef936fe, 0x5bb94183), TOBN(0x92ca0753, 0xb05cd7f2),
6628 TOBN(0x9d65db11, 0x74a1e035), TOBN(0x02628cc8, 0x13eaea92),
6629 TOBN(0xf2d9e242, 0x49e4fbf2), TOBN(0x94fdfd9b, 0xe384f8b7),
6630 TOBN(0x65f56054, 0x63428c6b), TOBN(0x2f7205b2, 0x90b409a5),
6631 TOBN(0xf778bb78, 0xff45ae11), TOBN(0xa13045be, 0xc5ee53b2),
6632 TOBN(0xe00a14ff, 0x03ef77fe), TOBN(0x689cd59f, 0xffef8bef),
6633 TOBN(0x3578f0ed, 0x1e9ade22), TOBN(0xe99f3ec0, 0x6268b6a8),
6634 TOBN(0xa2057d91, 0xea1b3c3e), TOBN(0x2d1a7053, 0xb8823a4a),
6635 TOBN(0xabbb336a, 0x2cca451e), TOBN(0xcd2466e3, 0x2218bb5d),
6636 TOBN(0x3ac1f42f, 0xc8cb762d), TOBN(0x7e312aae, 0x7690211f),
6637 TOBN(0xebb9bd73, 0x45d07450), TOBN(0x207c4b82, 0x46c2213f),
6638 TOBN(0x99d425c1, 0x375913ec), TOBN(0x94e45e96, 0x67908220),
6639 TOBN(0xc08f3087, 0xcd67dbf6), TOBN(0xa5670fbe, 0xc0887056),
6640 TOBN(0x6717b64a, 0x66f5b8fc), TOBN(0xd5a56aea, 0x786fec28),
6641 TOBN(0xa8c3f55f, 0xc0ff4952), TOBN(0xa77fefae, 0x457ac49b),
6642 TOBN(0x29882d7c, 0x98379d44), TOBN(0xd000bdfb, 0x509edc8a),
6643 TOBN(0xc6f95979, 0xe66fe464), TOBN(0x504a6115, 0xfa61bde0),
6644 TOBN(0x56b3b871, 0xeffea31a), TOBN(0x2d3de26d, 0xf0c21a54),
6645 TOBN(0x21dbff31, 0x834753bf), TOBN(0xe67ecf49, 0x69269d86),
6646 TOBN(0x7a176952, 0x151fe690), TOBN(0x03515804, 0x7f2adb5f),
6647 TOBN(0xee794b15, 0xd1b62a8d), TOBN(0xf004ceec, 0xaae454e6),
6648 TOBN(0x0897ea7c, 0xf0386fac), TOBN(0x3b62ff12, 0xd1fca751),
6649 TOBN(0x154181df, 0x1b7a04ec), TOBN(0x2008e04a, 0xfb5847ec),
6650 TOBN(0xd147148e, 0x41dbd772), TOBN(0x2b419f73, 0x22942654),
6651 TOBN(0x669f30d3, 0xe9c544f7), TOBN(0x52a2c223, 0xc8540149),
6652 TOBN(0x5da9ee14, 0x634dfb02), TOBN(0x5f074ff0, 0xf47869f3),
6653 TOBN(0x74ee878d, 0xa3933acc), TOBN(0xe6510651, 0x4fe35ed1),
6654 TOBN(0xb3eb9482, 0xf1012e7a), TOBN(0x51013cc0, 0xa8a566ae),
6655 TOBN(0xdd5e9243, 0x47c00d3b), TOBN(0x7fde089d, 0x946bb0e5),
6656 TOBN(0x030754fe, 0xc731b4b3), TOBN(0x12a136a4, 0x99fda062),
6657 TOBN(0x7c1064b8, 0x5a1a35bc), TOBN(0xbf1f5763, 0x446c84ef),
6658 TOBN(0xed29a56d, 0xa16d4b34), TOBN(0x7fba9d09, 0xdca21c4f),
6659 TOBN(0x66d7ac00, 0x6d8de486), TOBN(0x60061987, 0x73a2a5e1),
6660 TOBN(0x8b400f86, 0x9da28ff0), TOBN(0x3133f708, 0x43c4599c),
6661 TOBN(0x9911c9b8, 0xee28cb0d), TOBN(0xcd7e2874, 0x8e0af61d),
6662 TOBN(0x5a85f0f2, 0x72ed91fc), TOBN(0x85214f31, 0x9cd4a373),
6663 TOBN(0x881fe5be, 0x1925253c), TOBN(0xd8dc98e0, 0x91e8bc76),
6664 TOBN(0x7120affe, 0x585cc3a2), TOBN(0x724952ed, 0x735bf97a),
6665 TOBN(0x5581e7dc, 0x3eb34581), TOBN(0x5cbff4f2, 0xe52ee57d),
6666 TOBN(0x8d320a0e, 0x87d8cc7b), TOBN(0x9beaa7f3, 0xf1d280d0),
6667 TOBN(0x7a0b9571, 0x9beec704), TOBN(0x9126332e, 0x5b7f0057),
6668 TOBN(0x01fbc1b4, 0x8ed3bd6d), TOBN(0x35bb2c12, 0xd945eb24),
6669 TOBN(0x6404694e, 0x9a8ae255), TOBN(0xb6092eec, 0x8d6abfb3),
6670 TOBN(0x4d76143f, 0xcc058865), TOBN(0x7b0a5af2, 0x6e249922),
6671 TOBN(0x8aef9440, 0x6a50d353), TOBN(0xe11e4bcc, 0x64f0e07a),
6672 TOBN(0x4472993a, 0xa14a90fa), TOBN(0x7706e20c, 0xba0c51d4),
6673 TOBN(0xf403292f, 0x1532672d), TOBN(0x52573bfa, 0x21829382),
6674 TOBN(0x6a7bb6a9, 0x3b5bdb83), TOBN(0x08da65c0, 0xa4a72318),
6675 TOBN(0xc58d22aa, 0x63eb065f), TOBN(0x1717596c, 0x1b15d685),
6676 TOBN(0x112df0d0, 0xb266d88b), TOBN(0xf688ae97, 0x5941945a),
6677 TOBN(0x487386e3, 0x7c292cac), TOBN(0x42f3b50d, 0x57d6985c),
6678 TOBN(0x6da4f998, 0x6a90fc34), TOBN(0xc8f257d3, 0x65ca8a8d),
6679 TOBN(0xc2feabca, 0x6951f762), TOBN(0xe1bc81d0, 0x74c323ac),
6680 TOBN(0x1bc68f67, 0x251a2a12), TOBN(0x10d86587, 0xbe8a70dc),
6681 TOBN(0xd648af7f, 0xf0f84d2e), TOBN(0xf0aa9ebc, 0x6a43ac92),
6682 TOBN(0x69e3be04, 0x27596893), TOBN(0xb6bb02a6, 0x45bf452b),
6683 TOBN(0x0875c11a, 0xf4c698c8), TOBN(0x6652b5c7, 0xbece3794),
6684 TOBN(0x7b3755fd, 0x4f5c0499), TOBN(0x6ea16558, 0xb5532b38),
6685 TOBN(0xd1c69889, 0xa2e96ef7), TOBN(0x9c773c3a, 0x61ed8f48),
6686 TOBN(0x2b653a40, 0x9b323abc), TOBN(0xe26605e1, 0xf0e1d791),
6687 TOBN(0x45d41064, 0x4a87157a), TOBN(0x8f9a78b7, 0xcbbce616),
6688 TOBN(0xcf1e44aa, 0xc407eddd), TOBN(0x81ddd1d8, 0xa35b964f),
6689 TOBN(0x473e339e, 0xfd083999), TOBN(0x6c94bdde, 0x8e796802),
6690 TOBN(0x5a304ada, 0x8545d185), TOBN(0x82ae44ea, 0x738bb8cb),
6691 TOBN(0x628a35e3, 0xdf87e10e), TOBN(0xd3624f3d, 0xa15b9fe3),
6692 TOBN(0xcc44209b, 0x14be4254), TOBN(0x7d0efcbc, 0xbdbc2ea5),
6693 TOBN(0x1f603362, 0x04c37bbe), TOBN(0x21f363f5, 0x56a5852c),
6694 TOBN(0xa1503d1c, 0xa8501550), TOBN(0x2251e0e1, 0xd8ab10bb),
6695 TOBN(0xde129c96, 0x6961c51c), TOBN(0x1f7246a4, 0x81910f68),
6696 TOBN(0x2eb744ee, 0x5f2591f2), TOBN(0x3c47d33f, 0x5e627157),
6697 TOBN(0x4d6d62c9, 0x22f3bd68), TOBN(0x6120a64b, 0xcb8df856),
6698 TOBN(0x3a9ac6c0, 0x7b5d07df), TOBN(0xa92b9558, 0x7ef39783),
6699 TOBN(0xe128a134, 0xab3a9b4f), TOBN(0x41c18807, 0xb1252f05),
6700 TOBN(0xfc7ed089, 0x80ba9b1c), TOBN(0xac8dc6de, 0xc532a9dd),
6701 TOBN(0xbf829cef, 0x55246809), TOBN(0x101b784f, 0x5b4ee80f),
6702 TOBN(0xc09945bb, 0xb6f11603), TOBN(0x57b09dbe, 0x41d2801e),
6703 TOBN(0xfba5202f, 0xa97534a8), TOBN(0x7fd8ae5f, 0xc17b9614),
6704 TOBN(0xa50ba666, 0x78308435), TOBN(0x9572f77c, 0xd3868c4d),
6705 TOBN(0x0cef7bfd, 0x2dd7aab0), TOBN(0xe7958e08, 0x2c7c79ff),
6706 TOBN(0x81262e42, 0x25346689), TOBN(0x716da290, 0xb07c7004),
6707 TOBN(0x35f911ea, 0xb7950ee3), TOBN(0x6fd72969, 0x261d21b5),
6708 TOBN(0x52389803, 0x08b640d3), TOBN(0x5b0026ee, 0x887f12a1),
6709 TOBN(0x20e21660, 0x742e9311), TOBN(0x0ef6d541, 0x5ff77ff7),
6710 TOBN(0x969127f0, 0xf9c41135), TOBN(0xf21d60c9, 0x68a64993),
6711 TOBN(0x656e5d0c, 0xe541875c), TOBN(0xf1e0f84e, 0xa1d3c233),
6712 TOBN(0x9bcca359, 0x06002d60), TOBN(0xbe2da60c, 0x06191552),
6713 TOBN(0x5da8bbae, 0x61181ec3), TOBN(0x9f04b823, 0x65806f19),
6714 TOBN(0xf1604a7d, 0xd4b79bb8), TOBN(0xaee806fb, 0x52c878c8),
6715 TOBN(0x34144f11, 0x8d47b8e8), TOBN(0x72edf52b, 0x949f9054),
6716 TOBN(0xebfca84e, 0x2127015a), TOBN(0x9051d0c0, 0x9cb7cef3),
6717 TOBN(0x86e8fe58, 0x296deec8), TOBN(0x33b28188, 0x41010d74),
6718 },
6719 {
6720 TOBN(0x01079383, 0x171b445f), TOBN(0x9bcf21e3, 0x8131ad4c),
6721 TOBN(0x8cdfe205, 0xc93987e8), TOBN(0xe63f4152, 0xc92e8c8f),
6722 TOBN(0x729462a9, 0x30add43d), TOBN(0x62ebb143, 0xc980f05a),
6723 TOBN(0x4f3954e5, 0x3b06e968), TOBN(0xfe1d75ad, 0x242cf6b1),
6724 TOBN(0x5f95c6c7, 0xaf8685c8), TOBN(0xd4c1c8ce, 0x2f8f01aa),
6725 TOBN(0xc44bbe32, 0x2574692a), TOBN(0xb8003478, 0xd4a4a068),
6726 TOBN(0x7c8fc6e5, 0x2eca3cdb), TOBN(0xea1db16b, 0xec04d399),
6727 TOBN(0xb05bc82e, 0x8f2bc5cf), TOBN(0x763d517f, 0xf44793d2),
6728 TOBN(0x4451c1b8, 0x08bd98d0), TOBN(0x644b1cd4, 0x6575f240),
6729 TOBN(0x6907eb33, 0x7375d270), TOBN(0x56c8bebd, 0xfa2286bd),
6730 TOBN(0xc713d2ac, 0xc4632b46), TOBN(0x17da427a, 0xafd60242),
6731 TOBN(0x313065b7, 0xc95c7546), TOBN(0xf8239898, 0xbf17a3de),
6732 TOBN(0xf3b7963f, 0x4c830320), TOBN(0x842c7aa0, 0x903203e3),
6733 TOBN(0xaf22ca0a, 0xe7327afb), TOBN(0x38e13092, 0x967609b6),
6734 TOBN(0x73b8fb62, 0x757558f1), TOBN(0x3cc3e831, 0xf7eca8c1),
6735 TOBN(0xe4174474, 0xf6331627), TOBN(0xa77989ca, 0xc3c40234),
6736 TOBN(0xe5fd17a1, 0x44a081e0), TOBN(0xd797fb7d, 0xb70e296a),
6737 TOBN(0x2b472b30, 0x481f719c), TOBN(0x0e632a98, 0xfe6f8c52),
6738 TOBN(0x89ccd116, 0xc5f0c284), TOBN(0xf51088af, 0x2d987c62),
6739 TOBN(0x2a2bccda, 0x4c2de6cf), TOBN(0x810f9efe, 0xf679f0f9),
6740 TOBN(0xb0f394b9, 0x7ffe4b3e), TOBN(0x0b691d21, 0xe5fa5d21),
6741 TOBN(0xb0bd7747, 0x9dfbbc75), TOBN(0xd2830fda, 0xfaf78b00),
6742 TOBN(0xf78c249c, 0x52434f57), TOBN(0x4b1f7545, 0x98096dab),
6743 TOBN(0x73bf6f94, 0x8ff8c0b3), TOBN(0x34aef03d, 0x454e134c),
6744 TOBN(0xf8d151f4, 0xb7ac7ec5), TOBN(0xd6ceb95a, 0xe50da7d5),
6745 TOBN(0xa1b492b0, 0xdc3a0eb8), TOBN(0x75157b69, 0xb3dd2863),
6746 TOBN(0xe2c4c74e, 0xc5413d62), TOBN(0xbe329ff7, 0xbc5fc4c7),
6747 TOBN(0x835a2aea, 0x60fa9dda), TOBN(0xf117f5ad, 0x7445cb87),
6748 TOBN(0xae8317f4, 0xb0166f7a), TOBN(0xfbd3e3f7, 0xceec74e6),
6749 TOBN(0xfdb516ac, 0xe0874bfd), TOBN(0x3d846019, 0xc681f3a3),
6750 TOBN(0x0b12ee5c, 0x7c1620b0), TOBN(0xba68b4dd, 0x2b63c501),
6751 TOBN(0xac03cd32, 0x6668c51e), TOBN(0x2a6279f7, 0x4e0bcb5b),
6752 TOBN(0x17bd69b0, 0x6ae85c10), TOBN(0x72946979, 0x1dfdd3a6),
6753 TOBN(0xd9a03268, 0x2c078bec), TOBN(0x41c6a658, 0xbfd68a52),
6754 TOBN(0xcdea1024, 0x0e023900), TOBN(0xbaeec121, 0xb10d144d),
6755 TOBN(0x5a600e74, 0x058ab8dc), TOBN(0x1333af21, 0xbb89ccdd),
6756 TOBN(0xdf25eae0, 0x3aaba1f1), TOBN(0x2cada16e, 0x3b7144cf),
6757 TOBN(0x657ee27d, 0x71ab98bc), TOBN(0x99088b4c, 0x7a6fc96e),
6758 TOBN(0x05d5c0a0, 0x3549dbd4), TOBN(0x42cbdf8f, 0xf158c3ac),
6759 TOBN(0x3fb6b3b0, 0x87edd685), TOBN(0x22071cf6, 0x86f064d0),
6760 TOBN(0xd2d6721f, 0xff2811e5), TOBN(0xdb81b703, 0xfe7fae8c),
6761 TOBN(0x3cfb74ef, 0xd3f1f7bb), TOBN(0x0cdbcd76, 0x16cdeb5d),
6762 TOBN(0x4f39642a, 0x566a808c), TOBN(0x02b74454, 0x340064d6),
6763 TOBN(0xfabbadca, 0x0528fa6f), TOBN(0xe4c3074c, 0xd3fc0bb6),
6764 TOBN(0xb32cb8b0, 0xb796d219), TOBN(0xc3e95f4f, 0x34741dd9),
6765 TOBN(0x87212125, 0x68edf6f5), TOBN(0x7a03aee4, 0xa2b9cb8e),
6766 TOBN(0x0cd3c376, 0xf53a89aa), TOBN(0x0d8af9b1, 0x948a28dc),
6767 TOBN(0xcf86a3f4, 0x902ab04f), TOBN(0x8aacb62a, 0x7f42002d),
6768 TOBN(0x106985eb, 0xf62ffd52), TOBN(0xe670b54e, 0x5797bf10),
6769 TOBN(0x4b405209, 0xc5e30aef), TOBN(0x12c97a20, 0x4365b5e9),
6770 TOBN(0x104646ce, 0x1fe32093), TOBN(0x13cb4ff6, 0x3907a8c9),
6771 TOBN(0x8b9f30d1, 0xd46e726b), TOBN(0xe1985e21, 0xaba0f499),
6772 TOBN(0xc573dea9, 0x10a230cd), TOBN(0x24f46a93, 0xcd30f947),
6773 TOBN(0xf2623fcf, 0xabe2010a), TOBN(0x3f278cb2, 0x73f00e4f),
6774 TOBN(0xed55c67d, 0x50b920eb), TOBN(0xf1cb9a2d, 0x8e760571),
6775 TOBN(0x7c50d109, 0x0895b709), TOBN(0x4207cf07, 0x190d4369),
6776 TOBN(0x3b027e81, 0xc4127fe1), TOBN(0xa9f8b9ad, 0x3ae9c566),
6777 TOBN(0x5ab10851, 0xacbfbba5), TOBN(0xa747d648, 0x569556f5),
6778 TOBN(0xcc172b5c, 0x2ba97bf7), TOBN(0x15e0f77d, 0xbcfa3324),
6779 TOBN(0xa345b797, 0x7686279d), TOBN(0x5a723480, 0xe38003d3),
6780 TOBN(0xfd8e139f, 0x8f5fcda8), TOBN(0xf3e558c4, 0xbdee5bfd),
6781 TOBN(0xd76cbaf4, 0xe33f9f77), TOBN(0x3a4c97a4, 0x71771969),
6782 TOBN(0xda27e84b, 0xf6dce6a7), TOBN(0xff373d96, 0x13e6c2d1),
6783 TOBN(0xf115193c, 0xd759a6e9), TOBN(0x3f9b7025, 0x63d2262c),
6784 TOBN(0xd9764a31, 0x317cd062), TOBN(0x30779d8e, 0x199f8332),
6785 TOBN(0xd8074106, 0x16b11b0b), TOBN(0x7917ab9f, 0x78aeaed8),
6786 TOBN(0xb67a9cbe, 0x28fb1d8e), TOBN(0x2e313563, 0x136eda33),
6787 TOBN(0x010b7069, 0xa371a86c), TOBN(0x44d90fa2, 0x6744e6b7),
6788 TOBN(0x68190867, 0xd6b3e243), TOBN(0x9fe6cd9d, 0x59048c48),
6789 TOBN(0xb900b028, 0x95731538), TOBN(0xa012062f, 0x32cae04f),
6790 TOBN(0x8107c8bc, 0x9399d082), TOBN(0x47e8c54a, 0x41df12e2),
6791 TOBN(0x14ba5117, 0xb6ef3f73), TOBN(0x22260bea, 0x81362f0b),
6792 TOBN(0x90ea261e, 0x1a18cc20), TOBN(0x2192999f, 0x2321d636),
6793 TOBN(0xef64d314, 0xe311b6a0), TOBN(0xd7401e4c, 0x3b54a1f5),
6794 TOBN(0x19019983, 0x6fbca2ba), TOBN(0x46ad3293, 0x8fbffc4b),
6795 TOBN(0xa142d3f6, 0x3786bf40), TOBN(0xeb5cbc26, 0xb67039fc),
6796 TOBN(0x9cb0ae6c, 0x252bd479), TOBN(0x05e0f88a, 0x12b5848f),
6797 TOBN(0x78f6d2b2, 0xa5c97663), TOBN(0x6f6e149b, 0xc162225c),
6798 TOBN(0xe602235c, 0xde601a89), TOBN(0xd17bbe98, 0xf373be1f),
6799 TOBN(0xcaf49a5b, 0xa8471827), TOBN(0x7e1a0a85, 0x18aaa116),
6800 TOBN(0x6c833196, 0x270580c3), TOBN(0x1e233839, 0xf1c98a14),
6801 TOBN(0x67b2f7b4, 0xae34e0a5), TOBN(0x47ac8745, 0xd8ce7289),
6802 TOBN(0x2b74779a, 0x100dd467), TOBN(0x274a4337, 0x4ee50d09),
6803 TOBN(0x603dcf13, 0x83608bc9), TOBN(0xcd9da6c3, 0xc89e8388),
6804 TOBN(0x2660199f, 0x355116ac), TOBN(0xcc38bb59, 0xb6d18eed),
6805 TOBN(0x3075f31f, 0x2f4bc071), TOBN(0x9774457f, 0x265dc57e),
6806 TOBN(0x06a6a9c8, 0xc6db88bb), TOBN(0x6429d07f, 0x4ec98e04),
6807 TOBN(0x8d05e57b, 0x05ecaa8b), TOBN(0x20f140b1, 0x7872ea7b),
6808 TOBN(0xdf8c0f09, 0xca494693), TOBN(0x48d3a020, 0xf252e909),
6809 TOBN(0x4c5c29af, 0x57b14b12), TOBN(0x7e6fa37d, 0xbf47ad1c),
6810 TOBN(0x66e7b506, 0x49a0c938), TOBN(0xb72c0d48, 0x6be5f41f),
6811 TOBN(0x6a6242b8, 0xb2359412), TOBN(0xcd35c774, 0x8e859480),
6812 TOBN(0x12536fea, 0x87baa627), TOBN(0x58c1fec1, 0xf72aa680),
6813 TOBN(0x6c29b637, 0x601e5dc9), TOBN(0x9e3c3c1c, 0xde9e01b9),
6814 TOBN(0xefc8127b, 0x2bcfe0b0), TOBN(0x35107102, 0x2a12f50d),
6815 TOBN(0x6ccd6cb1, 0x4879b397), TOBN(0xf792f804, 0xf8a82f21),
6816 TOBN(0x509d4804, 0xa9b46402), TOBN(0xedddf85d, 0xc10f0850),
6817 TOBN(0x928410dc, 0x4b6208aa), TOBN(0xf6229c46, 0x391012dc),
6818 TOBN(0xc5a7c41e, 0x7727b9b6), TOBN(0x289e4e4b, 0xaa444842),
6819 TOBN(0x049ba1d9, 0xe9a947ea), TOBN(0x44f9e47f, 0x83c8debc),
6820 TOBN(0xfa77a1fe, 0x611f8b8e), TOBN(0xfd2e416a, 0xf518f427),
6821 TOBN(0xc5fffa70, 0x114ebac3), TOBN(0xfe57c4e9, 0x5d89697b),
6822 TOBN(0xfdd053ac, 0xb1aaf613), TOBN(0x31df210f, 0xea585a45),
6823 TOBN(0x318cc10e, 0x24985034), TOBN(0x1a38efd1, 0x5f1d6130),
6824 TOBN(0xbf86f237, 0x0b1e9e21), TOBN(0xb258514d, 0x1dbe88aa),
6825 TOBN(0x1e38a588, 0x90c1baf9), TOBN(0x2936a01e, 0xbdb9b692),
6826 TOBN(0xd576de98, 0x6dd5b20c), TOBN(0xb586bf71, 0x70f98ecf),
6827 TOBN(0xcccf0f12, 0xc42d2fd7), TOBN(0x8717e61c, 0xfb35bd7b),
6828 TOBN(0x8b1e5722, 0x35e6fc06), TOBN(0x3477728f, 0x0b3e13d5),
6829 TOBN(0x150c294d, 0xaa8a7372), TOBN(0xc0291d43, 0x3bfa528a),
6830 TOBN(0xc6c8bc67, 0xcec5a196), TOBN(0xdeeb31e4, 0x5c2e8a7c),
6831 TOBN(0xba93e244, 0xfb6e1c51), TOBN(0xb9f8b71b, 0x2e28e156),
6832 TOBN(0xce65a287, 0x968a2ab9), TOBN(0xe3c5ce69, 0x46bbcb1f),
6833 TOBN(0xf8c835b9, 0xe7ae3f30), TOBN(0x16bbee26, 0xff72b82b),
6834 TOBN(0x665e2017, 0xfd42cd22), TOBN(0x1e139970, 0xf8b1d2a0),
6835 TOBN(0x125cda29, 0x79204932), TOBN(0x7aee94a5, 0x49c3bee5),
6836 TOBN(0x68c70160, 0x89821a66), TOBN(0xf7c37678, 0x8f981669),
6837 TOBN(0xd90829fc, 0x48cc3645), TOBN(0x346af049, 0xd70addfc),
6838 TOBN(0x2057b232, 0x370bf29c), TOBN(0xf90c73ce, 0x42e650ee),
6839 TOBN(0xe03386ea, 0xa126ab90), TOBN(0x0e266e7e, 0x975a087b),
6840 TOBN(0x80578eb9, 0x0fca65d9), TOBN(0x7e2989ea, 0x16af45b8),
6841 TOBN(0x7438212d, 0xcac75a4e), TOBN(0x38c7ca39, 0x4fef36b8),
6842 TOBN(0x8650c494, 0xd402676a), TOBN(0x26ab5a66, 0xf72c7c48),
6843 TOBN(0x4e6cb426, 0xce3a464e), TOBN(0xf8f99896, 0x2b72f841),
6844 TOBN(0x8c318491, 0x1a335cc8), TOBN(0x563459ba, 0x6a5913e4),
6845 TOBN(0x1b920d61, 0xc7b32919), TOBN(0x805ab8b6, 0xa02425ad),
6846 TOBN(0x2ac512da, 0x8d006086), TOBN(0x6ca4846a, 0xbcf5c0fd),
6847 TOBN(0xafea51d8, 0xac2138d7), TOBN(0xcb647545, 0x344cd443),
6848 TOBN(0x0429ee8f, 0xbd7d9040), TOBN(0xee66a2de, 0x819b9c96),
6849 TOBN(0x54f9ec25, 0xdea7d744), TOBN(0x2ffea642, 0x671721bb),
6850 TOBN(0x4f19dbd1, 0x114344ea), TOBN(0x04304536, 0xfd0dbc8b),
6851 TOBN(0x014b50aa, 0x29ec7f91), TOBN(0xb5fc22fe, 0xbb06014d),
6852 TOBN(0x60d963a9, 0x1ee682e0), TOBN(0xdf48abc0, 0xfe85c727),
6853 TOBN(0x0cadba13, 0x2e707c2d), TOBN(0xde608d3a, 0xa645aeff),
6854 TOBN(0x05f1c28b, 0xedafd883), TOBN(0x3c362ede, 0xbd94de1f),
6855 TOBN(0x8dd0629d, 0x13593e41), TOBN(0x0a5e736f, 0x766d6eaf),
6856 TOBN(0xbfa92311, 0xf68cf9d1), TOBN(0xa4f9ef87, 0xc1797556),
6857 TOBN(0x10d75a1f, 0x5601c209), TOBN(0x651c374c, 0x09b07361),
6858 TOBN(0x49950b58, 0x88b5cead), TOBN(0x0ef00058, 0x6fa9dbaa),
6859 TOBN(0xf51ddc26, 0x4e15f33a), TOBN(0x1f8b5ca6, 0x2ef46140),
6860 TOBN(0x343ac0a3, 0xee9523f0), TOBN(0xbb75eab2, 0x975ea978),
6861 TOBN(0x1bccf332, 0x107387f4), TOBN(0x790f9259, 0x9ab0062e),
6862 TOBN(0xf1a363ad, 0x1e4f6a5f), TOBN(0x06e08b84, 0x62519a50),
6863 TOBN(0x60915187, 0x7265f1ee), TOBN(0x6a80ca34, 0x93ae985e),
6864 TOBN(0x81b29768, 0xaaba4864), TOBN(0xb13cabf2, 0x8d52a7d6),
6865 TOBN(0xb5c36348, 0x8ead03f1), TOBN(0xc932ad95, 0x81c7c1c0),
6866 TOBN(0x5452708e, 0xcae1e27b), TOBN(0x9dac4269, 0x1b0df648),
6867 TOBN(0x233e3f0c, 0xdfcdb8bc), TOBN(0xe6ceccdf, 0xec540174),
6868 TOBN(0xbd0d845e, 0x95081181), TOBN(0xcc8a7920, 0x699355d5),
6869 TOBN(0x111c0f6d, 0xc3b375a8), TOBN(0xfd95bc6b, 0xfd51e0dc),
6870 TOBN(0x4a106a26, 0x6888523a), TOBN(0x4d142bd6, 0xcb01a06d),
6871 TOBN(0x79bfd289, 0xadb9b397), TOBN(0x0bdbfb94, 0xe9863914),
6872 TOBN(0x29d8a229, 0x1660f6a6), TOBN(0x7f6abcd6, 0x551c042d),
6873 TOBN(0x13039deb, 0x0ac3ffe8), TOBN(0xa01be628, 0xec8523fb),
6874 TOBN(0x6ea34103, 0x0ca1c328), TOBN(0xc74114bd, 0xb903928e),
6875 TOBN(0x8aa4ff4e, 0x9e9144b0), TOBN(0x7064091f, 0x7f9a4b17),
6876 TOBN(0xa3f4f521, 0xe447f2c4), TOBN(0x81b8da7a, 0x604291f0),
6877 TOBN(0xd680bc46, 0x7d5926de), TOBN(0x84f21fd5, 0x34a1202f),
6878 TOBN(0x1d1e3181, 0x4e9df3d8), TOBN(0x1ca4861a, 0x39ab8d34),
6879 TOBN(0x809ddeec, 0x5b19aa4a), TOBN(0x59f72f7e, 0x4d329366),
6880 TOBN(0xa2f93f41, 0x386d5087), TOBN(0x40bf739c, 0xdd67d64f),
6881 TOBN(0xb4494205, 0x66702158), TOBN(0xc33c65be, 0x73b1e178),
6882 TOBN(0xcdcd657c, 0x38ca6153), TOBN(0x97f4519a, 0xdc791976),
6883 TOBN(0xcc7c7f29, 0xcd6e1f39), TOBN(0x38de9cfb, 0x7e3c3932),
6884 TOBN(0xe448eba3, 0x7b793f85), TOBN(0xe9f8dbf9, 0xf067e914),
6885 TOBN(0xc0390266, 0xf114ae87), TOBN(0x39ed75a7, 0xcd6a8e2a),
6886 TOBN(0xadb14848, 0x7ffba390), TOBN(0x67f8cb8b, 0x6af9bc09),
6887 TOBN(0x322c3848, 0x9c7476db), TOBN(0xa320fecf, 0x52a538d6),
6888 TOBN(0xe0493002, 0xb2aced2b), TOBN(0xdfba1809, 0x616bd430),
6889 TOBN(0x531c4644, 0xc331be70), TOBN(0xbc04d32e, 0x90d2e450),
6890 TOBN(0x1805a0d1, 0x0f9f142d), TOBN(0x2c44a0c5, 0x47ee5a23),
6891 TOBN(0x31875a43, 0x3989b4e3), TOBN(0x6b1949fd, 0x0c063481),
6892 TOBN(0x2dfb9e08, 0xbe0f4492), TOBN(0x3ff0da03, 0xe9d5e517),
6893 TOBN(0x03dbe9a1, 0xf79466a8), TOBN(0x0b87bcd0, 0x15ea9932),
6894 TOBN(0xeb64fc83, 0xab1f58ab), TOBN(0x6d9598da, 0x817edc8a),
6895 TOBN(0x699cff66, 0x1d3b67e5), TOBN(0x645c0f29, 0x92635853),
6896 TOBN(0x253cdd82, 0xeabaf21c), TOBN(0x82b9602a, 0x2241659e),
6897 TOBN(0x2cae07ec, 0x2d9f7091), TOBN(0xbe4c720c, 0x8b48cd9b),
6898 TOBN(0x6ce5bc03, 0x6f08d6c9), TOBN(0x36e8a997, 0xaf10bf40),
6899 TOBN(0x83422d21, 0x3e10ff12), TOBN(0x7b26d3eb, 0xbcc12494),
6900 TOBN(0xb240d2d0, 0xc9469ad6), TOBN(0xc4a11b4d, 0x30afa05b),
6901 TOBN(0x4b604ace, 0xdd6ba286), TOBN(0x18486600, 0x3ee2864c),
6902 TOBN(0x5869d6ba, 0x8d9ce5be), TOBN(0x0d8f68c5, 0xff4bfb0d),
6903 TOBN(0xb69f210b, 0x5700cf73), TOBN(0x61f6653a, 0x6d37c135),
6904 TOBN(0xff3d432b, 0x5aff5a48), TOBN(0x0d81c4b9, 0x72ba3a69),
6905 TOBN(0xee879ae9, 0xfa1899ef), TOBN(0xbac7e2a0, 0x2d6acafd),
6906 TOBN(0xd6d93f6c, 0x1c664399), TOBN(0x4c288de1, 0x5bcb135d),
6907 TOBN(0x83031dab, 0x9dab7cbf), TOBN(0xfe23feb0, 0x3abbf5f0),
6908 TOBN(0x9f1b2466, 0xcdedca85), TOBN(0x140bb710, 0x1a09538c),
6909 TOBN(0xac8ae851, 0x5e11115d), TOBN(0x0d63ff67, 0x6f03f59e),
6910 TOBN(0x755e5551, 0x7d234afb), TOBN(0x61c2db4e, 0x7e208fc1),
6911 TOBN(0xaa9859ce, 0xf28a4b5d), TOBN(0xbdd6d4fc, 0x34af030f),
6912 TOBN(0xd1c4a26d, 0x3be01cb1), TOBN(0x9ba14ffc, 0x243aa07c),
6913 TOBN(0xf95cd3a9, 0xb2503502), TOBN(0xe379bc06, 0x7d2a93ab),
6914 TOBN(0x3efc18e9, 0xd4ca8d68), TOBN(0x083558ec, 0x80bb412a),
6915 TOBN(0xd903b940, 0x9645a968), TOBN(0xa499f0b6, 0x9ba6054f),
6916 TOBN(0x208b573c, 0xb8349abe), TOBN(0x3baab3e5, 0x30b4fc1c),
6917 TOBN(0x87e978ba, 0xcb524990), TOBN(0x3524194e, 0xccdf0e80),
6918 TOBN(0x62711725, 0x7d4bcc42), TOBN(0xe90a3d9b, 0xb90109ba),
6919 TOBN(0x3b1bdd57, 0x1323e1e0), TOBN(0xb78e9bd5, 0x5eae1599),
6920 TOBN(0x0794b746, 0x9e03d278), TOBN(0x80178605, 0xd70e6297),
6921 TOBN(0x171792f8, 0x99c97855), TOBN(0x11b393ee, 0xf5a86b5c),
6922 TOBN(0x48ef6582, 0xd8884f27), TOBN(0xbd44737a, 0xbf19ba5f),
6923 TOBN(0x8698de4c, 0xa42062c6), TOBN(0x8975eb80, 0x61ce9c54),
6924 TOBN(0xd50e57c7, 0xd7fe71f3), TOBN(0x15342190, 0xbc97ce38),
6925 TOBN(0x51bda2de, 0x4df07b63), TOBN(0xba12aeae, 0x200eb87d),
6926 TOBN(0xabe135d2, 0xa9b4f8f6), TOBN(0x04619d65, 0xfad6d99c),
6927 TOBN(0x4a6683a7, 0x7994937c), TOBN(0x7a778c8b, 0x6f94f09a),
6928 TOBN(0x8c508623, 0x20a71b89), TOBN(0x241a2aed, 0x1c229165),
6929 TOBN(0x352be595, 0xaaf83a99), TOBN(0x9fbfee7f, 0x1562bac8),
6930 TOBN(0xeaf658b9, 0x5c4017e3), TOBN(0x1dc7f9e0, 0x15120b86),
6931 TOBN(0xd84f13dd, 0x4c034d6f), TOBN(0x283dd737, 0xeaea3038),
6932 TOBN(0x197f2609, 0xcd85d6a2), TOBN(0x6ebbc345, 0xfae60177),
6933 TOBN(0xb80f031b, 0x4e12fede), TOBN(0xde55d0c2, 0x07a2186b),
6934 TOBN(0x1fb3e37f, 0x24dcdd5a), TOBN(0x8d602da5, 0x7ed191fb),
6935 TOBN(0x108fb056, 0x76023e0d), TOBN(0x70178c71, 0x459c20c0),
6936 TOBN(0xfad5a386, 0x3fe54cf0), TOBN(0xa4a3ec4f, 0x02bbb475),
6937 TOBN(0x1aa5ec20, 0x919d94d7), TOBN(0x5d3b63b5, 0xa81e4ab3),
6938 TOBN(0x7fa733d8, 0x5ad3d2af), TOBN(0xfbc586dd, 0xd1ac7a37),
6939 TOBN(0x282925de, 0x40779614), TOBN(0xfe0ffffb, 0xe74a242a),
6940 TOBN(0x3f39e67f, 0x906151e5), TOBN(0xcea27f5f, 0x55e10649),
6941 TOBN(0xdca1d4e1, 0xc17cf7b7), TOBN(0x0c326d12, 0x2fe2362d),
6942 TOBN(0x05f7ac33, 0x7dd35df3), TOBN(0x0c3b7639, 0xc396dbdf),
6943 TOBN(0x0912f5ac, 0x03b7db1c), TOBN(0x9dea4b70, 0x5c9ed4a9),
6944 TOBN(0x475e6e53, 0xaae3f639), TOBN(0xfaba0e7c, 0xfc278bac),
6945 TOBN(0x16f9e221, 0x9490375f), TOBN(0xaebf9746, 0xa5a7ed0a),
6946 TOBN(0x45f9af3f, 0xf41ad5d6), TOBN(0x03c4623c, 0xb2e99224),
6947 TOBN(0x82c5bb5c, 0xb3cf56aa), TOBN(0x64311819, 0x34567ed3),
6948 TOBN(0xec57f211, 0x8be489ac), TOBN(0x2821895d, 0xb9a1104b),
6949 TOBN(0x610dc875, 0x6064e007), TOBN(0x8e526f3f, 0x5b20d0fe),
6950 TOBN(0x6e71ca77, 0x5b645aee), TOBN(0x3d1dcb9f, 0x800e10ff),
6951 TOBN(0x36b51162, 0x189cf6de), TOBN(0x2c5a3e30, 0x6bb17353),
6952 TOBN(0xc186cd3e, 0x2a6c6fbf), TOBN(0xa74516fa, 0x4bf97906),
6953 TOBN(0x5b4b8f4b, 0x279d6901), TOBN(0x0c4e57b4, 0x2b573743),
6954 TOBN(0x75fdb229, 0xb6e386b6), TOBN(0xb46793fd, 0x99deac27),
6955 TOBN(0xeeec47ea, 0xcf712629), TOBN(0xe965f3c4, 0xcbc3b2dd),
6956 TOBN(0x8dd1fb83, 0x425c6559), TOBN(0x7fc00ee6, 0x0af06fda),
6957 TOBN(0xe98c9225, 0x33d956df), TOBN(0x0f1ef335, 0x4fbdc8a2),
6958 TOBN(0x2abb5145, 0xb79b8ea2), TOBN(0x40fd2945, 0xbdbff288),
6959 TOBN(0x6a814ac4, 0xd7185db7), TOBN(0xc4329d6f, 0xc084609a),
6960 TOBN(0xc9ba7b52, 0xed1be45d), TOBN(0x891dd20d, 0xe4cd2c74),
6961 TOBN(0x5a4d4a7f, 0x824139b1), TOBN(0x66c17716, 0xb873c710),
6962 TOBN(0x5e5bc141, 0x2843c4e0), TOBN(0xd5ac4817, 0xb97eb5bf),
6963 TOBN(0xc0f8af54, 0x450c95c7), TOBN(0xc91b3fa0, 0x318406c5),
6964 TOBN(0x360c340a, 0xab9d97f8), TOBN(0xfb57bd07, 0x90a2d611),
6965 TOBN(0x4339ae3c, 0xa6a6f7e5), TOBN(0x9c1fcd2a, 0x2feb8a10),
6966 TOBN(0x972bcca9, 0xc7ea7432), TOBN(0x1b0b924c, 0x308076f6),
6967 TOBN(0x80b2814a, 0x2a5b4ca5), TOBN(0x2f78f55b, 0x61ef3b29),
6968 TOBN(0xf838744a, 0xc18a414f), TOBN(0xc611eaae, 0x903d0a86),
6969 TOBN(0x94dabc16, 0x2a453f55), TOBN(0xe6f2e3da, 0x14efb279),
6970 TOBN(0x5b7a6017, 0x9320dc3c), TOBN(0x692e382f, 0x8df6b5a4),
6971 TOBN(0x3f5e15e0, 0x2d40fa90), TOBN(0xc87883ae, 0x643dd318),
6972 TOBN(0x511053e4, 0x53544774), TOBN(0x834d0ecc, 0x3adba2bc),
6973 TOBN(0x4215d7f7, 0xbae371f5), TOBN(0xfcfd57bf, 0x6c8663bc),
6974 TOBN(0xded2383d, 0xd6901b1d), TOBN(0x3b49fbb4, 0xb5587dc3),
6975 TOBN(0xfd44a08d, 0x07625f62), TOBN(0x3ee4d65b, 0x9de9b762),
6976 },
6977 {
6978 TOBN(0x64e5137d, 0x0d63d1fa), TOBN(0x658fc052, 0x02a9d89f),
6979 TOBN(0x48894874, 0x50436309), TOBN(0xe9ae30f8, 0xd598da61),
6980 TOBN(0x2ed710d1, 0x818baf91), TOBN(0xe27e9e06, 0x8b6a0c20),
6981 TOBN(0x1e28dcfb, 0x1c1a6b44), TOBN(0x883acb64, 0xd6ac57dc),
6982 TOBN(0x8735728d, 0xc2c6ff70), TOBN(0x79d6122f, 0xc5dc2235),
6983 TOBN(0x23f5d003, 0x19e277f9), TOBN(0x7ee84e25, 0xdded8cc7),
6984 TOBN(0x91a8afb0, 0x63cd880a), TOBN(0x3f3ea7c6, 0x3574af60),
6985 TOBN(0x0cfcdc84, 0x02de7f42), TOBN(0x62d0792f, 0xb31aa152),
6986 TOBN(0x8e1b4e43, 0x8a5807ce), TOBN(0xad283893, 0xe4109a7e),
6987 TOBN(0xc30cc9cb, 0xafd59dda), TOBN(0xf65f36c6, 0x3d8d8093),
6988 TOBN(0xdf31469e, 0xa60d32b2), TOBN(0xee93df4b, 0x3e8191c8),
6989 TOBN(0x9c1017c5, 0x355bdeb5), TOBN(0xd2623185, 0x8616aa28),
6990 TOBN(0xb02c83f9, 0xdec31a21), TOBN(0x988c8b23, 0x6ad9d573),
6991 TOBN(0x53e983ae, 0xa57be365), TOBN(0xe968734d, 0x646f834e),
6992 TOBN(0x9137ea8f, 0x5da6309b), TOBN(0x10f3a624, 0xc1f1ce16),
6993 TOBN(0x782a9ea2, 0xca440921), TOBN(0xdf94739e, 0x5b46f1b5),
6994 TOBN(0x9f9be006, 0xcce85c9b), TOBN(0x360e70d6, 0xa4c7c2d3),
6995 TOBN(0x2cd5beea, 0xaefa1e60), TOBN(0x64cf63c0, 0x8c3d2b6d),
6996 TOBN(0xfb107fa3, 0xe1cf6f90), TOBN(0xb7e937c6, 0xd5e044e6),
6997 TOBN(0x74e8ca78, 0xce34db9f), TOBN(0x4f8b36c1, 0x3e210bd0),
6998 TOBN(0x1df165a4, 0x34a35ea8), TOBN(0x3418e0f7, 0x4d4412f6),
6999 TOBN(0x5af1f8af, 0x518836c3), TOBN(0x42ceef4d, 0x130e1965),
7000 TOBN(0x5560ca0b, 0x543a1957), TOBN(0xc33761e5, 0x886cb123),
7001 TOBN(0x66624b1f, 0xfe98ed30), TOBN(0xf772f4bf, 0x1090997d),
7002 TOBN(0xf4e540bb, 0x4885d410), TOBN(0x7287f810, 0x9ba5f8d7),
7003 TOBN(0x22d0d865, 0xde98dfb1), TOBN(0x49ff51a1, 0xbcfbb8a3),
7004 TOBN(0xb6b6fa53, 0x6bc3012e), TOBN(0x3d31fd72, 0x170d541d),
7005 TOBN(0x8018724f, 0x4b0f4966), TOBN(0x79e7399f, 0x87dbde07),
7006 TOBN(0x56f8410e, 0xf4f8b16a), TOBN(0x97241afe, 0xc47b266a),
7007 TOBN(0x0a406b8e, 0x6d9c87c1), TOBN(0x803f3e02, 0xcd42ab1b),
7008 TOBN(0x7f0309a8, 0x04dbec69), TOBN(0xa83b85f7, 0x3bbad05f),
7009 TOBN(0xc6097273, 0xad8e197f), TOBN(0xc097440e, 0x5067adc1),
7010 TOBN(0x730eafb6, 0x3524ff16), TOBN(0xd7f9b51e, 0x823fc6ce),
7011 TOBN(0x27bd0d32, 0x443e4ac0), TOBN(0x40c59ad9, 0x4d66f217),
7012 TOBN(0x6c33136f, 0x17c387a4), TOBN(0x5043b8d5, 0xeb86804d),
7013 TOBN(0x74970312, 0x675a73c9), TOBN(0x838fdb31, 0xf16669b6),
7014 TOBN(0xc507b6dd, 0x418e7ddd), TOBN(0x39888d93, 0x472f19d6),
7015 TOBN(0x7eae26be, 0x0c27eb4d), TOBN(0x17b53ed3, 0xfbabb884),
7016 TOBN(0xfc27021b, 0x2b01ae4f), TOBN(0x88462e87, 0xcf488682),
7017 TOBN(0xbee096ec, 0x215e2d87), TOBN(0xeb2fea9a, 0xd242e29b),
7018 TOBN(0x5d985b5f, 0xb821fc28), TOBN(0x89d2e197, 0xdc1e2ad2),
7019 TOBN(0x55b566b8, 0x9030ba62), TOBN(0xe3fd41b5, 0x4f41b1c6),
7020 TOBN(0xb738ac2e, 0xb9a96d61), TOBN(0x7f8567ca, 0x369443f4),
7021 TOBN(0x8698622d, 0xf803a440), TOBN(0x2b586236, 0x8fe2f4dc),
7022 TOBN(0xbbcc00c7, 0x56b95bce), TOBN(0x5ec03906, 0x616da680),
7023 TOBN(0x79162ee6, 0x72214252), TOBN(0x43132b63, 0x86a892d2),
7024 TOBN(0x4bdd3ff2, 0x2f3263bf), TOBN(0xd5b3733c, 0x9cd0a142),
7025 TOBN(0x592eaa82, 0x44415ccb), TOBN(0x663e8924, 0x8d5474ea),
7026 TOBN(0x8058a25e, 0x5236344e), TOBN(0x82e8df9d, 0xbda76ee6),
7027 TOBN(0xdcf6efd8, 0x11cc3d22), TOBN(0x00089cda, 0x3b4ab529),
7028 TOBN(0x91d3a071, 0xbd38a3db), TOBN(0x4ea97fc0, 0xef72b925),
7029 TOBN(0x0c9fc15b, 0xea3edf75), TOBN(0x5a6297cd, 0xa4348ed3),
7030 TOBN(0x0d38ab35, 0xce7c42d4), TOBN(0x9fd493ef, 0x82feab10),
7031 TOBN(0x46056b6d, 0x82111b45), TOBN(0xda11dae1, 0x73efc5c3),
7032 TOBN(0xdc740278, 0x5545a7fb), TOBN(0xbdb2601c, 0x40d507e6),
7033 TOBN(0x121dfeeb, 0x7066fa58), TOBN(0x214369a8, 0x39ae8c2a),
7034 TOBN(0x195709cb, 0x06e0956c), TOBN(0x4c9d254f, 0x010cd34b),
7035 TOBN(0xf51e13f7, 0x0471a532), TOBN(0xe19d6791, 0x1e73054d),
7036 TOBN(0xf702a628, 0xdb5c7be3), TOBN(0xc7141218, 0xb24dde05),
7037 TOBN(0xdc18233c, 0xf29b2e2e), TOBN(0x3a6bd1e8, 0x85342dba),
7038 TOBN(0x3f747fa0, 0xb311898c), TOBN(0xe2a272e4, 0xcd0eac65),
7039 TOBN(0x4bba5851, 0xf914d0bc), TOBN(0x7a1a9660, 0xc4a43ee3),
7040 TOBN(0xe5a367ce, 0xa1c8cde9), TOBN(0x9d958ba9, 0x7271abe3),
7041 TOBN(0xf3ff7eb6, 0x3d1615cd), TOBN(0xa2280dce, 0xf5ae20b0),
7042 TOBN(0x56dba5c1, 0xcf640147), TOBN(0xea5a2e3d, 0x5e83d118),
7043 TOBN(0x04cd6b6d, 0xda24c511), TOBN(0x1c0f4671, 0xe854d214),
7044 TOBN(0x91a6b7a9, 0x69565381), TOBN(0xdc966240, 0xdecf1f5b),
7045 TOBN(0x1b22d21c, 0xfcf5d009), TOBN(0x2a05f641, 0x9021dbd5),
7046 TOBN(0x8c0ed566, 0xd4312483), TOBN(0x5179a95d, 0x643e216f),
7047 TOBN(0xcc185fec, 0x17044493), TOBN(0xb3063339, 0x54991a21),
7048 TOBN(0xd801ecdb, 0x0081a726), TOBN(0x0149b0c6, 0x4fa89bbb),
7049 TOBN(0xafe9065a, 0x4391b6b9), TOBN(0xedc92786, 0xd633f3a3),
7050 TOBN(0xe408c24a, 0xae6a8e13), TOBN(0x85833fde, 0x9f3897ab),
7051 TOBN(0x43800e7e, 0xd81a0715), TOBN(0xde08e346, 0xb44ffc5f),
7052 TOBN(0x7094184c, 0xcdeff2e0), TOBN(0x49f9387b, 0x165eaed1),
7053 TOBN(0x635d6129, 0x777c468a), TOBN(0x8c0dcfd1, 0x538c2dd8),
7054 TOBN(0xd6d9d9e3, 0x7a6a308b), TOBN(0x62375830, 0x4c2767d3),
7055 TOBN(0x874a8bc6, 0xf38cbeb6), TOBN(0xd94d3f1a, 0xccb6fd9e),
7056 TOBN(0x92a9735b, 0xba21f248), TOBN(0x272ad0e5, 0x6cd1efb0),
7057 TOBN(0x7437b69c, 0x05b03284), TOBN(0xe7f04702, 0x6948c225),
7058 TOBN(0x8a56c04a, 0xcba2ecec), TOBN(0x0c181270, 0xe3a73e41),
7059 TOBN(0x6cb34e9d, 0x03e93725), TOBN(0xf77c8713, 0x496521a9),
7060 TOBN(0x94569183, 0xfa7f9f90), TOBN(0xf2e7aa4c, 0x8c9707ad),
7061 TOBN(0xced2c9ba, 0x26c1c9a3), TOBN(0x9109fe96, 0x40197507),
7062 TOBN(0x9ae868a9, 0xe9adfe1c), TOBN(0x3984403d, 0x314e39bb),
7063 TOBN(0xb5875720, 0xf2fe378f), TOBN(0x33f901e0, 0xba44a628),
7064 TOBN(0xea1125fe, 0x3652438c), TOBN(0xae9ec4e6, 0x9dd1f20b),
7065 TOBN(0x1e740d9e, 0xbebf7fbd), TOBN(0x6dbd3ddc, 0x42dbe79c),
7066 TOBN(0x62082aec, 0xedd36776), TOBN(0xf612c478, 0xe9859039),
7067 TOBN(0xa493b201, 0x032f7065), TOBN(0xebd4d8f2, 0x4ff9b211),
7068 TOBN(0x3f23a0aa, 0xaac4cb32), TOBN(0xea3aadb7, 0x15ed4005),
7069 TOBN(0xacf17ea4, 0xafa27e63), TOBN(0x56125c1a, 0xc11fd66c),
7070 TOBN(0x266344a4, 0x3794f8dc), TOBN(0xdcca923a, 0x483c5c36),
7071 TOBN(0x2d6b6bbf, 0x3f9d10a0), TOBN(0xb320c5ca, 0x81d9bdf3),
7072 TOBN(0x620e28ff, 0x47b50a95), TOBN(0x933e3b01, 0xcef03371),
7073 TOBN(0xf081bf85, 0x99100153), TOBN(0x183be9a0, 0xc3a8c8d6),
7074 TOBN(0x4e3ddc5a, 0xd6bbe24d), TOBN(0xc6c74630, 0x53843795),
7075 TOBN(0x78193dd7, 0x65ec2d4c), TOBN(0xb8df26cc, 0xcd3c89b2),
7076 TOBN(0x98dbe399, 0x5a483f8d), TOBN(0x72d8a957, 0x7dd3313a),
7077 TOBN(0x65087294, 0xab0bd375), TOBN(0xfcd89248, 0x7c259d16),
7078 TOBN(0x8a9443d7, 0x7613aa81), TOBN(0x80100800, 0x85fe6584),
7079 TOBN(0x70fc4dbc, 0x7fb10288), TOBN(0xf58280d3, 0xe86beee8),
7080 TOBN(0x14fdd82f, 0x7c978c38), TOBN(0xdf1204c1, 0x0de44d7b),
7081 TOBN(0xa08a1c84, 0x4160252f), TOBN(0x591554ca, 0xc17646a5),
7082 TOBN(0x214a37d6, 0xa05bd525), TOBN(0x48d5f09b, 0x07957b3c),
7083 TOBN(0x0247cdcb, 0xd7109bc9), TOBN(0x40f9e4bb, 0x30599ce7),
7084 TOBN(0xc325fa03, 0xf46ad2ec), TOBN(0x00f766cf, 0xc3e3f9ee),
7085 TOBN(0xab556668, 0xd43a4577), TOBN(0x68d30a61, 0x3ee03b93),
7086 TOBN(0x7ddc81ea, 0x77b46a08), TOBN(0xcf5a6477, 0xc7480699),
7087 TOBN(0x43a8cb34, 0x6633f683), TOBN(0x1b867e6b, 0x92363c60),
7088 TOBN(0x43921114, 0x1f60558e), TOBN(0xcdbcdd63, 0x2f41450e),
7089 TOBN(0x7fc04601, 0xcc630e8b), TOBN(0xea7c66d5, 0x97038b43),
7090 TOBN(0x7259b8a5, 0x04e99fd8), TOBN(0x98a8dd12, 0x4785549a),
7091 TOBN(0x0e459a7c, 0x840552e1), TOBN(0xcdfcf4d0, 0x4bb0909e),
7092 TOBN(0x34a86db2, 0x53758da7), TOBN(0xe643bb83, 0xeac997e1),
7093 TOBN(0x96400bd7, 0x530c5b7e), TOBN(0x9f97af87, 0xb41c8b52),
7094 TOBN(0x34fc8820, 0xfbeee3f9), TOBN(0x93e53490, 0x49091afd),
7095 TOBN(0x764b9be5, 0x9a31f35c), TOBN(0x71f37864, 0x57e3d924),
7096 TOBN(0x02fb34e0, 0x943aa75e), TOBN(0xa18c9c58, 0xab8ff6e4),
7097 TOBN(0x080f31b1, 0x33cf0d19), TOBN(0x5c9682db, 0x083518a7),
7098 TOBN(0x873d4ca6, 0xb709c3de), TOBN(0x64a84262, 0x3575b8f0),
7099 TOBN(0x6275da1f, 0x020154bb), TOBN(0x97678caa, 0xd17cf1ab),
7100 TOBN(0x8779795f, 0x951a95c3), TOBN(0xdd35b163, 0x50fccc08),
7101 TOBN(0x32709627, 0x33d8f031), TOBN(0x3c5ab10a, 0x498dd85c),
7102 TOBN(0xb6c185c3, 0x41dca566), TOBN(0x7de7feda, 0xd8622aa3),
7103 TOBN(0x99e84d92, 0x901b6dfb), TOBN(0x30a02b0e, 0x7c4ad288),
7104 TOBN(0xc7c81daa, 0x2fd3cf36), TOBN(0xd1319547, 0xdf89e59f),
7105 TOBN(0xb2be8184, 0xcd496733), TOBN(0xd5f449eb, 0x93d3412b),
7106 TOBN(0x7ea41b1b, 0x25fe531d), TOBN(0xf9797432, 0x6a1d5646),
7107 TOBN(0x86067f72, 0x2bde501a), TOBN(0xf91481c0, 0x0c85e89c),
7108 TOBN(0xca8ee465, 0xf8b05bc6), TOBN(0x1844e1cf, 0x02e83cda),
7109 TOBN(0xca82114a, 0xb4dbe33b), TOBN(0x0f9f8769, 0x4eabfde2),
7110 TOBN(0x4936b1c0, 0x38b27fe2), TOBN(0x63b6359b, 0xaba402df),
7111 TOBN(0x40c0ea2f, 0x656bdbab), TOBN(0x9c992a89, 0x6580c39c),
7112 TOBN(0x600e8f15, 0x2a60aed1), TOBN(0xeb089ca4, 0xe0bf49df),
7113 TOBN(0x9c233d7d, 0x2d42d99a), TOBN(0x648d3f95, 0x4c6bc2fa),
7114 TOBN(0xdcc383a8, 0xe1add3f3), TOBN(0xf42c0c6a, 0x4f64a348),
7115 TOBN(0x2abd176f, 0x0030dbdb), TOBN(0x4de501a3, 0x7d6c215e),
7116 TOBN(0x4a107c1f, 0x4b9a64bc), TOBN(0xa77f0ad3, 0x2496cd59),
7117 TOBN(0xfb78ac62, 0x7688dffb), TOBN(0x7025a2ca, 0x67937d8e),
7118 TOBN(0xfde8b2d1, 0xd1a8f4e7), TOBN(0xf5b3da47, 0x7354927c),
7119 TOBN(0xe48606a3, 0xd9205735), TOBN(0xac477cc6, 0xe177b917),
7120 TOBN(0xfb1f73d2, 0xa883239a), TOBN(0xe12572f6, 0xcc8b8357),
7121 TOBN(0x9d355e9c, 0xfb1f4f86), TOBN(0x89b795f8, 0xd9f3ec6e),
7122 TOBN(0x27be56f1, 0xb54398dc), TOBN(0x1890efd7, 0x3fedeed5),
7123 TOBN(0x62f77f1f, 0x9c6d0140), TOBN(0x7ef0e314, 0x596f0ee4),
7124 TOBN(0x50ca6631, 0xcc61dab3), TOBN(0x4a39801d, 0xf4866e4f),
7125 TOBN(0x66c8d032, 0xae363b39), TOBN(0x22c591e5, 0x2ead66aa),
7126 TOBN(0x954ba308, 0xde02a53e), TOBN(0x2a6c060f, 0xd389f357),
7127 TOBN(0xe6cfcde8, 0xfbf40b66), TOBN(0x8e02fc56, 0xc6340ce1),
7128 TOBN(0xe4957795, 0x73adb4ba), TOBN(0x7b86122c, 0xa7b03805),
7129 TOBN(0x63f83512, 0x0c8e6fa6), TOBN(0x83660ea0, 0x057d7804),
7130 TOBN(0xbad79105, 0x21ba473c), TOBN(0xb6c50bee, 0xded5389d),
7131 TOBN(0xee2caf4d, 0xaa7c9bc0), TOBN(0xd97b8de4, 0x8c4e98a7),
7132 TOBN(0xa9f63e70, 0xab3bbddb), TOBN(0x3898aabf, 0x2597815a),
7133 TOBN(0x7659af89, 0xac15b3d9), TOBN(0xedf7725b, 0x703ce784),
7134 TOBN(0x25470fab, 0xe085116b), TOBN(0x04a43375, 0x87285310),
7135 TOBN(0x4e39187e, 0xe2bfd52f), TOBN(0x36166b44, 0x7d9ebc74),
7136 TOBN(0x92ad433c, 0xfd4b322c), TOBN(0x726aa817, 0xba79ab51),
7137 TOBN(0xf96eacd8, 0xc1db15eb), TOBN(0xfaf71e91, 0x0476be63),
7138 TOBN(0xdd69a640, 0x641fad98), TOBN(0xb7995918, 0x29622559),
7139 TOBN(0x03c6daa5, 0xde4199dc), TOBN(0x92cadc97, 0xad545eb4),
7140 TOBN(0x1028238b, 0x256534e4), TOBN(0x73e80ce6, 0x8595409a),
7141 TOBN(0x690d4c66, 0xd05dc59b), TOBN(0xc95f7b8f, 0x981dee80),
7142 TOBN(0xf4337014, 0xd856ac25), TOBN(0x441bd9dd, 0xac524dca),
7143 TOBN(0x640b3d85, 0x5f0499f5), TOBN(0x39cf84a9, 0xd5fda182),
7144 TOBN(0x04e7b055, 0xb2aa95a0), TOBN(0x29e33f0a, 0x0ddf1860),
7145 TOBN(0x082e74b5, 0x423f6b43), TOBN(0x217edeb9, 0x0aaa2b0f),
7146 TOBN(0x58b83f35, 0x83cbea55), TOBN(0xc485ee4d, 0xbc185d70),
7147 TOBN(0x833ff03b, 0x1e5f6992), TOBN(0xb5b9b9cc, 0xcf0c0dd5),
7148 TOBN(0x7caaee8e, 0x4e9e8a50), TOBN(0x462e907b, 0x6269dafd),
7149 TOBN(0x6ed5cee9, 0xfbe791c6), TOBN(0x68ca3259, 0xed430790),
7150 TOBN(0x2b72bdf2, 0x13b5ba88), TOBN(0x60294c8a, 0x35ef0ac4),
7151 TOBN(0x9c3230ed, 0x19b99b08), TOBN(0x560fff17, 0x6c2589aa),
7152 TOBN(0x552b8487, 0xd6770374), TOBN(0xa373202d, 0x9a56f685),
7153 TOBN(0xd3e7f907, 0x45f175d9), TOBN(0x3c2f315f, 0xd080d810),
7154 TOBN(0x1130e9dd, 0x7b9520e8), TOBN(0xc078f9e2, 0x0af037b5),
7155 TOBN(0x38cd2ec7, 0x1e9c104c), TOBN(0x0f684368, 0xc472fe92),
7156 TOBN(0xd3f1b5ed, 0x6247e7ef), TOBN(0xb32d33a9, 0x396dfe21),
7157 TOBN(0x46f59cf4, 0x4a9aa2c2), TOBN(0x69cd5168, 0xff0f7e41),
7158 TOBN(0x3f59da0f, 0x4b3234da), TOBN(0xcf0b0235, 0xb4579ebe),
7159 TOBN(0x6d1cbb25, 0x6d2476c7), TOBN(0x4f0837e6, 0x9dc30f08),
7160 TOBN(0x9a4075bb, 0x906f6e98), TOBN(0x253bb434, 0xc761e7d1),
7161 TOBN(0xde2e645f, 0x6e73af10), TOBN(0xb89a4060, 0x0c5f131c),
7162 TOBN(0xd12840c5, 0xb8cc037f), TOBN(0x3d093a5b, 0x7405bb47),
7163 TOBN(0x6202c253, 0x206348b8), TOBN(0xbf5d57fc, 0xc55a3ca7),
7164 TOBN(0x89f6c90c, 0x8c3bef48), TOBN(0x23ac7623, 0x5a0a960a),
7165 TOBN(0xdfbd3d6b, 0x552b42ab), TOBN(0x3ef22458, 0x132061f6),
7166 TOBN(0xd74e9bda, 0xc97e6516), TOBN(0x88779360, 0xc230f49e),
7167 TOBN(0xa6ec1de3, 0x1e74ea49), TOBN(0x581dcee5, 0x3fb645a2),
7168 TOBN(0xbaef2391, 0x8f483f14), TOBN(0x6d2dddfc, 0xd137d13b),
7169 TOBN(0x54cde50e, 0xd2743a42), TOBN(0x89a34fc5, 0xe4d97e67),
7170 TOBN(0x13f1f5b3, 0x12e08ce5), TOBN(0xa80540b8, 0xa7f0b2ca),
7171 TOBN(0x854bcf77, 0x01982805), TOBN(0xb8653ffd, 0x233bea04),
7172 TOBN(0x8e7b8787, 0x02b0b4c9), TOBN(0x2675261f, 0x9acb170a),
7173 TOBN(0x061a9d90, 0x930c14e5), TOBN(0xb59b30e0, 0xdef0abea),
7174 TOBN(0x1dc19ea6, 0x0200ec7d), TOBN(0xb6f4a3f9, 0x0bce132b),
7175 TOBN(0xb8d5de90, 0xf13e27e0), TOBN(0xbaee5ef0, 0x1fade16f),
7176 TOBN(0x6f406aaa, 0xe4c6cf38), TOBN(0xab4cfe06, 0xd1369815),
7177 TOBN(0x0dcffe87, 0xefd550c6), TOBN(0x9d4f59c7, 0x75ff7d39),
7178 TOBN(0xb02553b1, 0x51deb6ad), TOBN(0x812399a4, 0xb1877749),
7179 TOBN(0xce90f71f, 0xca6006e1), TOBN(0xc32363a6, 0xb02b6e77),
7180 TOBN(0x02284fbe, 0xdc36c64d), TOBN(0x86c81e31, 0xa7e1ae61),
7181 TOBN(0x2576c7e5, 0xb909d94a), TOBN(0x8b6f7d02, 0x818b2bb0),
7182 TOBN(0xeca3ed07, 0x56faa38a), TOBN(0xa3790e6c, 0x9305bb54),
7183 TOBN(0xd784eeda, 0x7bc73061), TOBN(0xbd56d369, 0x6dd50614),
7184 TOBN(0xd6575949, 0x229a8aa9), TOBN(0xdcca8f47, 0x4595ec28),
7185 TOBN(0x814305c1, 0x06ab4fe6), TOBN(0xc8c39768, 0x24f43f16),
7186 TOBN(0xe2a45f36, 0x523f2b36), TOBN(0x995c6493, 0x920d93bb),
7187 TOBN(0xf8afdab7, 0x90f1632b), TOBN(0x79ebbecd, 0x1c295954),
7188 TOBN(0xc7bb3ddb, 0x79592f48), TOBN(0x67216a7b, 0x5f88e998),
7189 TOBN(0xd91f098b, 0xbc01193e), TOBN(0xf7d928a5, 0xb1db83fc),
7190 TOBN(0x55e38417, 0xe991f600), TOBN(0x2a91113e, 0x2981a934),
7191 TOBN(0xcbc9d648, 0x06b13bde), TOBN(0xb011b6ac, 0x0755ff44),
7192 TOBN(0x6f4cb518, 0x045ec613), TOBN(0x522d2d31, 0xc2f5930a),
7193 TOBN(0x5acae1af, 0x382e65de), TOBN(0x57643067, 0x27bc966f),
7194 TOBN(0x5e12705d, 0x1c7193f0), TOBN(0xf0f32f47, 0x3be8858e),
7195 TOBN(0x785c3d7d, 0x96c6dfc7), TOBN(0xd75b4a20, 0xbf31795d),
7196 TOBN(0x91acf17b, 0x342659d4), TOBN(0xe596ea34, 0x44f0378f),
7197 TOBN(0x4515708f, 0xce52129d), TOBN(0x17387e1e, 0x79f2f585),
7198 TOBN(0x72cfd2e9, 0x49dee168), TOBN(0x1ae05223, 0x3e2af239),
7199 TOBN(0x009e75be, 0x1d94066a), TOBN(0x6cca31c7, 0x38abf413),
7200 TOBN(0xb50bd61d, 0x9bc49908), TOBN(0x4a9b4a8c, 0xf5e2bc1e),
7201 TOBN(0xeb6cc5f7, 0x946f83ac), TOBN(0x27da93fc, 0xebffab28),
7202 TOBN(0xea314c96, 0x4821c8c5), TOBN(0x8de49ded, 0xa83c15f4),
7203 TOBN(0x7a64cf20, 0x7af33004), TOBN(0x45f1bfeb, 0xc9627e10),
7204 TOBN(0x878b0626, 0x54b9df60), TOBN(0x5e4fdc3c, 0xa95c0b33),
7205 TOBN(0xe54a37ca, 0xc2035d8e), TOBN(0x9087cda9, 0x80f20b8c),
7206 TOBN(0x36f61c23, 0x8319ade4), TOBN(0x766f287a, 0xde8cfdf8),
7207 TOBN(0x48821948, 0x346f3705), TOBN(0x49a7b853, 0x16e4f4a2),
7208 TOBN(0xb9b3f8a7, 0x5cedadfd), TOBN(0x8f562815, 0x8db2a815),
7209 TOBN(0xc0b7d554, 0x01f68f95), TOBN(0x12971e27, 0x688a208e),
7210 TOBN(0xc9f8b696, 0xd0ff34fc), TOBN(0x20824de2, 0x1222718c),
7211 TOBN(0x7213cf9f, 0x0c95284d), TOBN(0xe2ad741b, 0xdc158240),
7212 TOBN(0x0ee3a6df, 0x54043ccf), TOBN(0x16ff479b, 0xd84412b3),
7213 TOBN(0xf6c74ee0, 0xdfc98af0), TOBN(0xa78a169f, 0x52fcd2fb),
7214 TOBN(0xd8ae8746, 0x99c930e9), TOBN(0x1d33e858, 0x49e117a5),
7215 TOBN(0x7581fcb4, 0x6624759f), TOBN(0xde50644f, 0x5bedc01d),
7216 TOBN(0xbeec5d00, 0xcaf3155e), TOBN(0x672d66ac, 0xbc73e75f),
7217 TOBN(0x86b9d8c6, 0x270b01db), TOBN(0xd249ef83, 0x50f55b79),
7218 TOBN(0x6131d6d4, 0x73978fe3), TOBN(0xcc4e4542, 0x754b00a1),
7219 TOBN(0x4e05df05, 0x57dfcfe9), TOBN(0x94b29cdd, 0x51ef6bf0),
7220 TOBN(0xe4530cff, 0x9bc7edf2), TOBN(0x8ac236fd, 0xd3da65f3),
7221 TOBN(0x0faf7d5f, 0xc8eb0b48), TOBN(0x4d2de14c, 0x660eb039),
7222 TOBN(0xc006bba7, 0x60430e54), TOBN(0x10a2d0d6, 0xda3289ab),
7223 TOBN(0x9c037a5d, 0xd7979c59), TOBN(0x04d1f3d3, 0xa116d944),
7224 TOBN(0x9ff22473, 0x8a0983cd), TOBN(0x28e25b38, 0xc883cabb),
7225 TOBN(0xe968dba5, 0x47a58995), TOBN(0x2c80b505, 0x774eebdf),
7226 TOBN(0xee763b71, 0x4a953beb), TOBN(0x502e223f, 0x1642e7f6),
7227 TOBN(0x6fe4b641, 0x61d5e722), TOBN(0x9d37c5b0, 0xdbef5316),
7228 TOBN(0x0115ed70, 0xf8330bc7), TOBN(0x139850e6, 0x75a72789),
7229 TOBN(0x27d7faec, 0xffceccc2), TOBN(0x3016a860, 0x4fd9f7f6),
7230 TOBN(0xc492ec64, 0x4cd8f64c), TOBN(0x58a2d790, 0x279d7b51),
7231 TOBN(0x0ced1fc5, 0x1fc75256), TOBN(0x3e658aed, 0x8f433017),
7232 TOBN(0x0b61942e, 0x05da59eb), TOBN(0xba3d60a3, 0x0ddc3722),
7233 TOBN(0x7c311cd1, 0x742e7f87), TOBN(0x6473ffee, 0xf6b01b6e),
7234 },
7235 {
7236 TOBN(0x8303604f, 0x692ac542), TOBN(0xf079ffe1, 0x227b91d3),
7237 TOBN(0x19f63e63, 0x15aaf9bd), TOBN(0xf99ee565, 0xf1f344fb),
7238 TOBN(0x8a1d661f, 0xd6219199), TOBN(0x8c883bc6, 0xd48ce41c),
7239 TOBN(0x1065118f, 0x3c74d904), TOBN(0x713889ee, 0x0faf8b1b),
7240 TOBN(0x972b3f8f, 0x81a1b3be), TOBN(0x4f3ce145, 0xce2764a0),
7241 TOBN(0xe2d0f1cc, 0x28c4f5f7), TOBN(0xdeee0c0d, 0xc7f3985b),
7242 TOBN(0x7df4adc0, 0xd39e25c3), TOBN(0x40619820, 0xc467a080),
7243 TOBN(0x440ebc93, 0x61cf5a58), TOBN(0x527729a6, 0x422ad600),
7244 TOBN(0xca6c0937, 0xb1b76ba6), TOBN(0x1a2eab85, 0x4d2026dc),
7245 TOBN(0xb1715e15, 0x19d9ae0a), TOBN(0xf1ad9199, 0xbac4a026),
7246 TOBN(0x35b3dfb8, 0x07ea7b0e), TOBN(0xedf5496f, 0x3ed9eb89),
7247 TOBN(0x8932e5ff, 0x2d6d08ab), TOBN(0xf314874e, 0x25bd2731),
7248 TOBN(0xefb26a75, 0x3f73f449), TOBN(0x1d1c94f8, 0x8d44fc79),
7249 TOBN(0x49f0fbc5, 0x3bc0dc4d), TOBN(0xb747ea0b, 0x3698a0d0),
7250 TOBN(0x5218c3fe, 0x228d291e), TOBN(0x35b804b5, 0x43c129d6),
7251 TOBN(0xfac859b8, 0xd1acc516), TOBN(0x6c10697d, 0x95d6e668),
7252 TOBN(0xc38e438f, 0x0876fd4e), TOBN(0x45f0c307, 0x83d2f383),
7253 TOBN(0x203cc2ec, 0xb10934cb), TOBN(0x6a8f2439, 0x2c9d46ee),
7254 TOBN(0xf16b431b, 0x65ccde7b), TOBN(0x41e2cd18, 0x27e76a6f),
7255 TOBN(0xb9c8cf8f, 0x4e3484d7), TOBN(0x64426efd, 0x8315244a),
7256 TOBN(0x1c0a8e44, 0xfc94dea3), TOBN(0x34c8cdbf, 0xdad6a0b0),
7257 TOBN(0x919c3840, 0x04113cef), TOBN(0xfd32fba4, 0x15490ffa),
7258 TOBN(0x58d190f6, 0x795dcfb7), TOBN(0xfef01b03, 0x83588baf),
7259 TOBN(0x9e6d1d63, 0xca1fc1c0), TOBN(0x53173f96, 0xf0a41ac9),
7260 TOBN(0x2b1d402a, 0xba16f73b), TOBN(0x2fb31014, 0x8cf9b9fc),
7261 TOBN(0x2d51e60e, 0x446ef7bf), TOBN(0xc731021b, 0xb91e1745),
7262 TOBN(0x9d3b4724, 0x4fee99d4), TOBN(0x4bca48b6, 0xfac5c1ea),
7263 TOBN(0x70f5f514, 0xbbea9af7), TOBN(0x751f55a5, 0x974c283a),
7264 TOBN(0x6e30251a, 0xcb452fdb), TOBN(0x31ee6965, 0x50f30650),
7265 TOBN(0xb0b3e508, 0x933548d9), TOBN(0xb8949a4f, 0xf4b0ef5b),
7266 TOBN(0x208b8326, 0x3c88f3bd), TOBN(0xab147c30, 0xdb1d9989),
7267 TOBN(0xed6515fd, 0x44d4df03), TOBN(0x17a12f75, 0xe72eb0c5),
7268 TOBN(0x3b59796d, 0x36cf69db), TOBN(0x1219eee9, 0x56670c18),
7269 TOBN(0xfe3341f7, 0x7a070d8e), TOBN(0x9b70130b, 0xa327f90c),
7270 TOBN(0x36a32462, 0x0ae18e0e), TOBN(0x2021a623, 0x46c0a638),
7271 TOBN(0x251b5817, 0xc62eb0d4), TOBN(0x87bfbcdf, 0x4c762293),
7272 TOBN(0xf78ab505, 0xcdd61d64), TOBN(0x8c7a53fc, 0xc8c18857),
7273 TOBN(0xa653ce6f, 0x16147515), TOBN(0x9c923aa5, 0xea7d52d5),
7274 TOBN(0xc24709cb, 0x5c18871f), TOBN(0x7d53bec8, 0x73b3cc74),
7275 TOBN(0x59264aff, 0xfdd1d4c4), TOBN(0x5555917e, 0x240da582),
7276 TOBN(0xcae8bbda, 0x548f5a0e), TOBN(0x1910eaba, 0x3bbfbbe1),
7277 TOBN(0xae579685, 0x7677afc3), TOBN(0x49ea61f1, 0x73ff0b5c),
7278 TOBN(0x78655478, 0x4f7c3922), TOBN(0x95d337cd, 0x20c68eef),
7279 TOBN(0x68f1e1e5, 0xdf779ab9), TOBN(0x14b491b0, 0xb5cf69a8),
7280 TOBN(0x7a6cbbe0, 0x28e3fe89), TOBN(0xe7e1fee4, 0xc5aac0eb),
7281 TOBN(0x7f47eda5, 0x697e5140), TOBN(0x4f450137, 0xb454921f),
7282 TOBN(0xdb625f84, 0x95cd8185), TOBN(0x74be0ba1, 0xcdb2e583),
7283 TOBN(0xaee4fd7c, 0xdd5e6de4), TOBN(0x4251437d, 0xe8101739),
7284 TOBN(0x686d72a0, 0xac620366), TOBN(0x4be3fb9c, 0xb6d59344),
7285 TOBN(0x6e8b44e7, 0xa1eb75b9), TOBN(0x84e39da3, 0x91a5c10c),
7286 TOBN(0x37cc1490, 0xb38f0409), TOBN(0x02951943, 0x2c2ade82),
7287 TOBN(0x9b688783, 0x1190a2d8), TOBN(0x25627d14, 0x231182ba),
7288 TOBN(0x6eb550aa, 0x658a6d87), TOBN(0x1405aaa7, 0xcf9c7325),
7289 TOBN(0xd147142e, 0x5c8748c9), TOBN(0x7f637e4f, 0x53ede0e0),
7290 TOBN(0xf8ca2776, 0x14ffad2c), TOBN(0xe58fb1bd, 0xbafb6791),
7291 TOBN(0x17158c23, 0xbf8f93fc), TOBN(0x7f15b373, 0x0a4a4655),
7292 TOBN(0x39d4add2, 0xd842ca72), TOBN(0xa71e4391, 0x3ed96305),
7293 TOBN(0x5bb09cbe, 0x6700be14), TOBN(0x68d69d54, 0xd8befcf6),
7294 TOBN(0xa45f5367, 0x37183bcf), TOBN(0x7152b7bb, 0x3370dff7),
7295 TOBN(0xcf887baa, 0xbf12525b), TOBN(0xe7ac7bdd, 0xd6d1e3cd),
7296 TOBN(0x25914f78, 0x81fdad90), TOBN(0xcf638f56, 0x0d2cf6ab),
7297 TOBN(0xb90bc03f, 0xcc054de5), TOBN(0x932811a7, 0x18b06350),
7298 TOBN(0x2f00b330, 0x9bbd11ff), TOBN(0x76108a6f, 0xb4044974),
7299 TOBN(0x801bb9e0, 0xa851d266), TOBN(0x0dd099be, 0xbf8990c1),
7300 TOBN(0x58c5aaaa, 0xabe32986), TOBN(0x0fe9dd2a, 0x50d59c27),
7301 TOBN(0x84951ff4, 0x8d307305), TOBN(0x6c23f829, 0x86529b78),
7302 TOBN(0x50bb2218, 0x0b136a79), TOBN(0x7e2174de, 0x77a20996),
7303 TOBN(0x6f00a4b9, 0xc0bb4da6), TOBN(0x89a25a17, 0xefdde8da),
7304 TOBN(0xf728a27e, 0xc11ee01d), TOBN(0xf900553a, 0xe5f10dfb),
7305 TOBN(0x189a83c8, 0x02ec893c), TOBN(0x3ca5bdc1, 0x23f66d77),
7306 TOBN(0x98781537, 0x97eada9f), TOBN(0x59c50ab3, 0x10256230),
7307 TOBN(0x346042d9, 0x323c69b3), TOBN(0x1b715a6d, 0x2c460449),
7308 TOBN(0xa41dd476, 0x6ae06e0b), TOBN(0xcdd7888e, 0x9d42e25f),
7309 TOBN(0x0f395f74, 0x56b25a20), TOBN(0xeadfe0ae, 0x8700e27e),
7310 TOBN(0xb09d52a9, 0x69950093), TOBN(0x3525d9cb, 0x327f8d40),
7311 TOBN(0xb8235a94, 0x67df886a), TOBN(0x77e4b0dd, 0x035faec2),
7312 TOBN(0x115eb20a, 0x517d7061), TOBN(0x77fe3433, 0x6c2df683),
7313 TOBN(0x6870ddc7, 0xcdc6fc67), TOBN(0xb1610588, 0x0b87de83),
7314 TOBN(0x343584ca, 0xd9c4ddbe), TOBN(0xb3164f1c, 0x3d754be2),
7315 TOBN(0x0731ed3a, 0xc1e6c894), TOBN(0x26327dec, 0x4f6b904c),
7316 TOBN(0x9d49c6de, 0x97b5cd32), TOBN(0x40835dae, 0xb5eceecd),
7317 TOBN(0xc66350ed, 0xd9ded7fe), TOBN(0x8aeebb5c, 0x7a678804),
7318 TOBN(0x51d42fb7, 0x5b8ee9ec), TOBN(0xd7a17bdd, 0x8e3ca118),
7319 TOBN(0x40d7511a, 0x2ef4400e), TOBN(0xc48990ac, 0x875a66f4),
7320 TOBN(0x8de07d2a, 0x2199e347), TOBN(0xbee75556, 0x2a39e051),
7321 TOBN(0x56918786, 0x916e51dc), TOBN(0xeb191313, 0x4a2d89ec),
7322 TOBN(0x6679610d, 0x37d341ed), TOBN(0x434fbb41, 0x56d51c2b),
7323 TOBN(0xe54b7ee7, 0xd7492dba), TOBN(0xaa33a79a, 0x59021493),
7324 TOBN(0x49fc5054, 0xe4bd6d3d), TOBN(0x09540f04, 0x5ab551d0),
7325 TOBN(0x8acc9085, 0x4942d3a6), TOBN(0x231af02f, 0x2d28323b),
7326 TOBN(0x93458cac, 0x0992c163), TOBN(0x1fef8e71, 0x888e3bb4),
7327 TOBN(0x27578da5, 0xbe8c268c), TOBN(0xcc8be792, 0xe805ec00),
7328 TOBN(0x29267bae, 0xc61c3855), TOBN(0xebff429d, 0x58c1fd3b),
7329 TOBN(0x22d886c0, 0x8c0b93b8), TOBN(0xca5e00b2, 0x2ddb8953),
7330 TOBN(0xcf330117, 0xc3fed8b7), TOBN(0xd49ac6fa, 0x819c01f6),
7331 TOBN(0x6ddaa6bd, 0x3c0fbd54), TOBN(0x91743068, 0x8049a2cf),
7332 TOBN(0xd67f981e, 0xaff2ef81), TOBN(0xc3654d35, 0x2818ae80),
7333 TOBN(0x81d05044, 0x1b2aa892), TOBN(0x2db067bf, 0x3d099328),
7334 TOBN(0xe7c79e86, 0x703dcc97), TOBN(0xe66f9b37, 0xe133e215),
7335 TOBN(0xcdf119a6, 0xe39a7a5c), TOBN(0x47c60de3, 0x876f1b61),
7336 TOBN(0x6e405939, 0xd860f1b2), TOBN(0x3e9a1dbc, 0xf5ed4d4a),
7337 TOBN(0x3f23619e, 0xc9b6bcbd), TOBN(0x5ee790cf, 0x734e4497),
7338 TOBN(0xf0a834b1, 0x5bdaf9bb), TOBN(0x02cedda7, 0x4ca295f0),
7339 TOBN(0x4619aa2b, 0xcb8e378c), TOBN(0xe5613244, 0xcc987ea4),
7340 TOBN(0x0bc022cc, 0x76b23a50), TOBN(0x4a2793ad, 0x0a6c21ce),
7341 TOBN(0x38328780, 0x89cac3f5), TOBN(0x29176f1b, 0xcba26d56),
7342 TOBN(0x06296187, 0x4f6f59eb), TOBN(0x86e9bca9, 0x8bdc658e),
7343 TOBN(0x2ca9c4d3, 0x57e30402), TOBN(0x5438b216, 0x516a09bb),
7344 TOBN(0x0a6a063c, 0x7672765a), TOBN(0x37a3ce64, 0x0547b9bf),
7345 TOBN(0x42c099c8, 0x98b1a633), TOBN(0xb5ab800d, 0x05ee6961),
7346 TOBN(0xf1963f59, 0x11a5acd6), TOBN(0xbaee6157, 0x46201063),
7347 TOBN(0x36d9a649, 0xa596210a), TOBN(0xaed04363, 0x1ba7138c),
7348 TOBN(0xcf817d1c, 0xa4a82b76), TOBN(0x5586960e, 0xf3806be9),
7349 TOBN(0x7ab67c89, 0x09dc6bb5), TOBN(0x52ace7a0, 0x114fe7eb),
7350 TOBN(0xcd987618, 0xcbbc9b70), TOBN(0x4f06fd5a, 0x604ca5e1),
7351 TOBN(0x90af14ca, 0x6dbde133), TOBN(0x1afe4322, 0x948a3264),
7352 TOBN(0xa70d2ca6, 0xc44b2c6c), TOBN(0xab726799, 0x0ef87dfe),
7353 TOBN(0x310f64dc, 0x2e696377), TOBN(0x49b42e68, 0x4c8126a0),
7354 TOBN(0x0ea444c3, 0xcea0b176), TOBN(0x53a8ddf7, 0xcb269182),
7355 TOBN(0xf3e674eb, 0xbbba9dcb), TOBN(0x0d2878a8, 0xd8669d33),
7356 TOBN(0x04b935d5, 0xd019b6a3), TOBN(0xbb5cf88e, 0x406f1e46),
7357 TOBN(0xa1912d16, 0x5b57c111), TOBN(0x9803fc21, 0x19ebfd78),
7358 TOBN(0x4f231c9e, 0xc07764a9), TOBN(0xd93286ee, 0xb75bd055),
7359 TOBN(0x83a9457d, 0x8ee6c9de), TOBN(0x04695915, 0x6087ec90),
7360 TOBN(0x14c6dd8a, 0x58d6cd46), TOBN(0x9cb633b5, 0x8e6634d2),
7361 TOBN(0xc1305047, 0xf81bc328), TOBN(0x12ede0e2, 0x26a177e5),
7362 TOBN(0x332cca62, 0x065a6f4f), TOBN(0xc3a47ecd, 0x67be487b),
7363 TOBN(0x741eb187, 0x0f47ed1c), TOBN(0x99e66e58, 0xe7598b14),
7364 TOBN(0x6f0544ca, 0x63d0ff12), TOBN(0xe5efc784, 0xb610a05f),
7365 TOBN(0xf72917b1, 0x7cad7b47), TOBN(0x3ff6ea20, 0xf2cac0c0),
7366 TOBN(0xcc23791b, 0xf21db8b7), TOBN(0x7dac70b1, 0xd7d93565),
7367 TOBN(0x682cda1d, 0x694bdaad), TOBN(0xeb88bb8c, 0x1023516d),
7368 TOBN(0xc4c634b4, 0xdfdbeb1b), TOBN(0x22f5ca72, 0xb4ee4dea),
7369 TOBN(0x1045a368, 0xe6524821), TOBN(0xed9e8a3f, 0x052b18b2),
7370 TOBN(0x9b7f2cb1, 0xb961f49a), TOBN(0x7fee2ec1, 0x7b009670),
7371 TOBN(0x350d8754, 0x22507a6d), TOBN(0x561bd711, 0x4db55f1d),
7372 TOBN(0x4c189ccc, 0x320bbcaf), TOBN(0x568434cf, 0xdf1de48c),
7373 TOBN(0x6af1b00e, 0x0fa8f128), TOBN(0xf0ba9d02, 0x8907583c),
7374 TOBN(0x735a4004, 0x32ff9f60), TOBN(0x3dd8e4b6, 0xc25dcf33),
7375 TOBN(0xf2230f16, 0x42c74cef), TOBN(0xd8117623, 0x013fa8ad),
7376 TOBN(0x36822876, 0xf51fe76e), TOBN(0x8a6811cc, 0x11d62589),
7377 TOBN(0xc3fc7e65, 0x46225718), TOBN(0xb7df2c9f, 0xc82fdbcd),
7378 TOBN(0x3b1d4e52, 0xdd7b205b), TOBN(0xb6959478, 0x47a2e414),
7379 TOBN(0x05e4d793, 0xefa91148), TOBN(0xb47ed446, 0xfd2e9675),
7380 TOBN(0x1a7098b9, 0x04c9d9bf), TOBN(0x661e2881, 0x1b793048),
7381 TOBN(0xb1a16966, 0xb01ee461), TOBN(0xbc521308, 0x2954746f),
7382 TOBN(0xc909a0fc, 0x2477de50), TOBN(0xd80bb41c, 0x7dbd51ef),
7383 TOBN(0xa85be7ec, 0x53294905), TOBN(0x6d465b18, 0x83958f97),
7384 TOBN(0x16f6f330, 0xfb6840fd), TOBN(0xfaaeb214, 0x3401e6c8),
7385 TOBN(0xaf83d30f, 0xccb5b4f8), TOBN(0x22885739, 0x266dec4b),
7386 TOBN(0x51b4367c, 0x7bc467df), TOBN(0x926562e3, 0xd842d27a),
7387 TOBN(0xdfcb6614, 0x0fea14a6), TOBN(0xeb394dae, 0xf2734cd9),
7388 TOBN(0x3eeae5d2, 0x11c0be98), TOBN(0xb1e6ed11, 0x814e8165),
7389 TOBN(0x191086bc, 0xe52bce1c), TOBN(0x14b74cc6, 0xa75a04da),
7390 TOBN(0x63cf1186, 0x8c060985), TOBN(0x071047de, 0x2dbd7f7c),
7391 TOBN(0x4e433b8b, 0xce0942ca), TOBN(0xecbac447, 0xd8fec61d),
7392 TOBN(0x8f0ed0e2, 0xebf3232f), TOBN(0xfff80f9e, 0xc52a2edd),
7393 TOBN(0xad9ab433, 0x75b55fdb), TOBN(0x73ca7820, 0xe42e0c11),
7394 TOBN(0x6dace0a0, 0xe6251b46), TOBN(0x89bc6b5c, 0x4c0d932d),
7395 TOBN(0x3438cd77, 0x095da19a), TOBN(0x2f24a939, 0x8d48bdfb),
7396 TOBN(0x99b47e46, 0x766561b7), TOBN(0x736600e6, 0x0ed0322a),
7397 TOBN(0x06a47cb1, 0x638e1865), TOBN(0x927c1c2d, 0xcb136000),
7398 TOBN(0x29542337, 0x0cc5df69), TOBN(0x99b37c02, 0x09d649a9),
7399 TOBN(0xc5f0043c, 0x6aefdb27), TOBN(0x6cdd9987, 0x1be95c27),
7400 TOBN(0x69850931, 0x390420d2), TOBN(0x299c40ac, 0x0983efa4),
7401 TOBN(0x3a05e778, 0xaf39aead), TOBN(0x84274408, 0x43a45193),
7402 TOBN(0x6bcd0fb9, 0x91a711a0), TOBN(0x461592c8, 0x9f52ab17),
7403 TOBN(0xb49302b4, 0xda3c6ed6), TOBN(0xc51fddc7, 0x330d7067),
7404 TOBN(0x94babeb6, 0xda50d531), TOBN(0x521b840d, 0xa6a7b9da),
7405 TOBN(0x5305151e, 0x404bdc89), TOBN(0x1bcde201, 0xd0d07449),
7406 TOBN(0xf427a78b, 0x3b76a59a), TOBN(0xf84841ce, 0x07791a1b),
7407 TOBN(0xebd314be, 0xbf91ed1c), TOBN(0x8e61d34c, 0xbf172943),
7408 TOBN(0x1d5dc451, 0x5541b892), TOBN(0xb186ee41, 0xfc9d9e54),
7409 TOBN(0x9d9f345e, 0xd5bf610d), TOBN(0x3e7ba65d, 0xf6acca9f),
7410 TOBN(0x9dda787a, 0xa8369486), TOBN(0x09f9dab7, 0x8eb5ba53),
7411 TOBN(0x5afb2033, 0xd6481bc3), TOBN(0x76f4ce30, 0xafa62104),
7412 TOBN(0xa8fa00cf, 0xf4f066b5), TOBN(0x89ab5143, 0x461dafc2),
7413 TOBN(0x44339ed7, 0xa3389998), TOBN(0x2ff862f1, 0xbc214903),
7414 TOBN(0x2c88f985, 0xb05556e3), TOBN(0xcd96058e, 0x3467081e),
7415 TOBN(0x7d6a4176, 0xedc637ea), TOBN(0xe1743d09, 0x36a5acdc),
7416 TOBN(0x66fd72e2, 0x7eb37726), TOBN(0xf7fa264e, 0x1481a037),
7417 TOBN(0x9fbd3bde, 0x45f4aa79), TOBN(0xed1e0147, 0x767c3e22),
7418 TOBN(0x7621f979, 0x82e7abe2), TOBN(0x19eedc72, 0x45f633f8),
7419 TOBN(0xe69b155e, 0x6137bf3a), TOBN(0xa0ad13ce, 0x414ee94e),
7420 TOBN(0x93e3d524, 0x1c0e651a), TOBN(0xab1a6e2a, 0x02ce227e),
7421 TOBN(0xe7af1797, 0x4ab27eca), TOBN(0x245446de, 0xbd444f39),
7422 TOBN(0x59e22a21, 0x56c07613), TOBN(0x43deafce, 0xf4275498),
7423 TOBN(0x10834ccb, 0x67fd0946), TOBN(0xa75841e5, 0x47406edf),
7424 TOBN(0xebd6a677, 0x7b0ac93d), TOBN(0xa6e37b0d, 0x78f5e0d7),
7425 TOBN(0x2516c096, 0x76f5492b), TOBN(0x1e4bf888, 0x9ac05f3a),
7426 TOBN(0xcdb42ce0, 0x4df0ba2b), TOBN(0x935d5cfd, 0x5062341b),
7427 TOBN(0x8a303333, 0x82acac20), TOBN(0x429438c4, 0x5198b00e),
7428 TOBN(0x1d083bc9, 0x049d33fa), TOBN(0x58b82dda, 0x946f67ff),
7429 TOBN(0xac3e2db8, 0x67a1d6a3), TOBN(0x62e6bead, 0x1798aac8),
7430 TOBN(0xfc85980f, 0xde46c58c), TOBN(0xa7f69379, 0x69c8d7be),
7431 TOBN(0x23557927, 0x837b35ec), TOBN(0x06a933d8, 0xe0790c0c),
7432 TOBN(0x827c0e9b, 0x077ff55d), TOBN(0x53977798, 0xbb26e680),
7433 TOBN(0x59530874, 0x1d9cb54f), TOBN(0xcca3f449, 0x4aac53ef),
7434 TOBN(0x11dc5c87, 0xa07eda0f), TOBN(0xc138bccf, 0xfd6400c8),
7435 TOBN(0x549680d3, 0x13e5da72), TOBN(0xc93eed82, 0x4540617e),
7436 TOBN(0xfd3db157, 0x4d0b75c0), TOBN(0x9716eb42, 0x6386075b),
7437 TOBN(0x0639605c, 0x817b2c16), TOBN(0x09915109, 0xf1e4f201),
7438 TOBN(0x35c9a928, 0x5cca6c3b), TOBN(0xb25f7d1a, 0x3505c900),
7439 TOBN(0xeb9f7d20, 0x630480c4), TOBN(0xc3c7b8c6, 0x2a1a501c),
7440 TOBN(0x3f99183c, 0x5a1f8e24), TOBN(0xfdb118fa, 0x9dd255f0),
7441 TOBN(0xb9b18b90, 0xc27f62a6), TOBN(0xe8f732f7, 0x396ec191),
7442 TOBN(0x524a2d91, 0x0be786ab), TOBN(0x5d32adef, 0x0ac5a0f5),
7443 TOBN(0x9b53d4d6, 0x9725f694), TOBN(0x032a76c6, 0x0510ba89),
7444 TOBN(0x840391a3, 0xebeb1544), TOBN(0x44b7b88c, 0x3ed73ac3),
7445 TOBN(0xd24bae7a, 0x256cb8b3), TOBN(0x7ceb151a, 0xe394cb12),
7446 TOBN(0xbd6b66d0, 0x5bc1e6a8), TOBN(0xec70cecb, 0x090f07bf),
7447 TOBN(0x270644ed, 0x7d937589), TOBN(0xee9e1a3d, 0x5f1dccfe),
7448 TOBN(0xb0d40a84, 0x745b98d2), TOBN(0xda429a21, 0x2556ed40),
7449 TOBN(0xf676eced, 0x85148cb9), TOBN(0x5a22d40c, 0xded18936),
7450 TOBN(0x3bc4b9e5, 0x70e8a4ce), TOBN(0xbfd1445b, 0x9eae0379),
7451 TOBN(0xf23f2c0c, 0x1a0bd47e), TOBN(0xa9c0bb31, 0xe1845531),
7452 TOBN(0x9ddc4d60, 0x0a4c3f6b), TOBN(0xbdfaad79, 0x2c15ef44),
7453 TOBN(0xce55a236, 0x7f484acc), TOBN(0x08653ca7, 0x055b1f15),
7454 TOBN(0x2efa8724, 0x538873a3), TOBN(0x09299e5d, 0xace1c7e7),
7455 TOBN(0x07afab66, 0xade332ba), TOBN(0x9be1fdf6, 0x92dd71b7),
7456 TOBN(0xa49b5d59, 0x5758b11c), TOBN(0x0b852893, 0xc8654f40),
7457 TOBN(0xb63ef6f4, 0x52379447), TOBN(0xd4957d29, 0x105e690c),
7458 TOBN(0x7d484363, 0x646559b0), TOBN(0xf4a8273c, 0x49788a8e),
7459 TOBN(0xee406cb8, 0x34ce54a9), TOBN(0x1e1c260f, 0xf86fda9b),
7460 TOBN(0xe150e228, 0xcf6a4a81), TOBN(0x1fa3b6a3, 0x1b488772),
7461 TOBN(0x1e6ff110, 0xc5a9c15b), TOBN(0xc6133b91, 0x8ad6aa47),
7462 TOBN(0x8ac5d55c, 0x9dffa978), TOBN(0xba1d1c1d, 0x5f3965f2),
7463 TOBN(0xf969f4e0, 0x7732b52f), TOBN(0xfceecdb5, 0xa5172a07),
7464 TOBN(0xb0120a5f, 0x10f2b8f5), TOBN(0xc83a6cdf, 0x5c4c2f63),
7465 TOBN(0x4d47a491, 0xf8f9c213), TOBN(0xd9e1cce5, 0xd3f1bbd5),
7466 TOBN(0x0d91bc7c, 0xaba7e372), TOBN(0xfcdc74c8, 0xdfd1a2db),
7467 TOBN(0x05efa800, 0x374618e5), TOBN(0x11216969, 0x15a7925e),
7468 TOBN(0xd4c89823, 0xf6021c5d), TOBN(0x880d5e84, 0xeff14423),
7469 TOBN(0x6523bc5a, 0x6dcd1396), TOBN(0xd1acfdfc, 0x113c978b),
7470 TOBN(0xb0c164e8, 0xbbb66840), TOBN(0xf7f4301e, 0x72b58459),
7471 TOBN(0xc29ad4a6, 0xa638e8ec), TOBN(0xf5ab8961, 0x46b78699),
7472 TOBN(0x9dbd7974, 0x0e954750), TOBN(0x0121de88, 0x64f9d2c6),
7473 TOBN(0x2e597b42, 0xd985232e), TOBN(0x55b6c3c5, 0x53451777),
7474 TOBN(0xbb53e547, 0x519cb9fb), TOBN(0xf134019f, 0x8428600d),
7475 TOBN(0x5a473176, 0xe081791a), TOBN(0x2f3e2263, 0x35fb0c08),
7476 TOBN(0xb28c3017, 0x73d273b0), TOBN(0xccd21076, 0x7721ef9a),
7477 TOBN(0x054cc292, 0xb650dc39), TOBN(0x662246de, 0x6188045e),
7478 TOBN(0x904b52fa, 0x6b83c0d1), TOBN(0xa72df267, 0x97e9cd46),
7479 TOBN(0x886b43cd, 0x899725e4), TOBN(0x2b651688, 0xd849ff22),
7480 TOBN(0x60479b79, 0x02f34533), TOBN(0x5e354c14, 0x0c77c148),
7481 TOBN(0xb4bb7581, 0xa8537c78), TOBN(0x188043d7, 0xefe1495f),
7482 TOBN(0x9ba12f42, 0x8c1d5026), TOBN(0x2e0c8a26, 0x93d4aaab),
7483 TOBN(0xbdba7b8b, 0xaa57c450), TOBN(0x140c9ad6, 0x9bbdafef),
7484 TOBN(0x2067aa42, 0x25ac0f18), TOBN(0xf7b1295b, 0x04d1fbf3),
7485 TOBN(0x14829111, 0xa4b04824), TOBN(0x2ce3f192, 0x33bd5e91),
7486 TOBN(0x9c7a1d55, 0x8f2e1b72), TOBN(0xfe932286, 0x302aa243),
7487 TOBN(0x497ca7b4, 0xd4be9554), TOBN(0xb8e821b8, 0xe0547a6e),
7488 TOBN(0xfb2838be, 0x67e573e0), TOBN(0x05891db9, 0x4084c44b),
7489 TOBN(0x91311373, 0x96c1c2c5), TOBN(0x6aebfa3f, 0xd958444b),
7490 TOBN(0xac9cdce9, 0xe56e55c1), TOBN(0x7148ced3, 0x2caa46d0),
7491 TOBN(0x2e10c7ef, 0xb61fe8eb), TOBN(0x9fd835da, 0xff97cf4d),
7492 },
7493 {
7494 TOBN(0xa36da109, 0x081e9387), TOBN(0xfb9780d7, 0x8c935828),
7495 TOBN(0xd5940332, 0xe540b015), TOBN(0xc9d7b51b, 0xe0f466fa),
7496 TOBN(0xfaadcd41, 0xd6d9f671), TOBN(0xba6c1e28, 0xb1a2ac17),
7497 TOBN(0x066a7833, 0xed201e5f), TOBN(0x19d99719, 0xf90f462b),
7498 TOBN(0xf431f462, 0x060b5f61), TOBN(0xa56f46b4, 0x7bd057c2),
7499 TOBN(0x348dca6c, 0x47e1bf65), TOBN(0x9a38783e, 0x41bcf1ff),
7500 TOBN(0x7a5d33a9, 0xda710718), TOBN(0x5a779987, 0x2e0aeaf6),
7501 TOBN(0xca87314d, 0x2d29d187), TOBN(0xfa0edc3e, 0xc687d733),
7502 TOBN(0x9df33621, 0x6a31e09b), TOBN(0xde89e44d, 0xc1350e35),
7503 TOBN(0x29214871, 0x4ca0cf52), TOBN(0xdf379672, 0x0b88a538),
7504 TOBN(0xc92a510a, 0x2591d61b), TOBN(0x79aa87d7, 0x585b447b),
7505 TOBN(0xf67db604, 0xe5287f77), TOBN(0x1697c8bf, 0x5efe7a80),
7506 TOBN(0x1c894849, 0xcb198ac7), TOBN(0xa884a93d, 0x0f264665),
7507 TOBN(0x2da964ef, 0x9b200678), TOBN(0x3c351b87, 0x009834e6),
7508 TOBN(0xafb2ef9f, 0xe2c4b44b), TOBN(0x580f6c47, 0x3326790c),
7509 TOBN(0xb8480521, 0x0b02264a), TOBN(0x8ba6f9e2, 0x42a194e2),
7510 TOBN(0xfc87975f, 0x8fb54738), TOBN(0x35160788, 0x27c3ead3),
7511 TOBN(0x834116d2, 0xb74a085a), TOBN(0x53c99a73, 0xa62fe996),
7512 TOBN(0x87585be0, 0x5b81c51b), TOBN(0x925bafa8, 0xbe0852b7),
7513 TOBN(0x76a4fafd, 0xa84d19a7), TOBN(0x39a45982, 0x585206d4),
7514 TOBN(0x499b6ab6, 0x5eb03c0e), TOBN(0xf19b7954, 0x72bc3fde),
7515 TOBN(0xa86b5b9c, 0x6e3a80d2), TOBN(0xe4377508, 0x6d42819f),
7516 TOBN(0xc1663650, 0xbb3ee8a3), TOBN(0x75eb14fc, 0xb132075f),
7517 TOBN(0xa8ccc906, 0x7ad834f6), TOBN(0xea6a2474, 0xe6e92ffd),
7518 TOBN(0x9d72fd95, 0x0f8d6758), TOBN(0xcb84e101, 0x408c07dd),
7519 TOBN(0xb9114bfd, 0xa5e23221), TOBN(0x358b5fe2, 0xe94e742c),
7520 TOBN(0x1c0577ec, 0x95f40e75), TOBN(0xf0155451, 0x3d73f3d6),
7521 TOBN(0x9d55cd67, 0xbd1b9b66), TOBN(0x63e86e78, 0xaf8d63c7),
7522 TOBN(0x39d934ab, 0xd3c095f1), TOBN(0x04b261be, 0xe4b76d71),
7523 TOBN(0x1d2e6970, 0xe73e6984), TOBN(0x879fb23b, 0x5e5fcb11),
7524 TOBN(0x11506c72, 0xdfd75490), TOBN(0x3a97d085, 0x61bcf1c1),
7525 TOBN(0x43201d82, 0xbf5e7007), TOBN(0x7f0ac52f, 0x798232a7),
7526 TOBN(0x2715cbc4, 0x6eb564d4), TOBN(0x8d6c752c, 0x9e570e29),
7527 TOBN(0xf80247c8, 0x9ef5fd5d), TOBN(0xc3c66b46, 0xd53eb514),
7528 TOBN(0x9666b401, 0x0f87de56), TOBN(0xce62c06f, 0xc6c603b5),
7529 TOBN(0xae7b4c60, 0x7e4fc942), TOBN(0x38ac0b77, 0x663a9c19),
7530 TOBN(0xcb4d20ee, 0x4b049136), TOBN(0x8b63bf12, 0x356a4613),
7531 TOBN(0x1221aef6, 0x70e08128), TOBN(0xe62d8c51, 0x4acb6b16),
7532 TOBN(0x71f64a67, 0x379e7896), TOBN(0xb25237a2, 0xcafd7fa5),
7533 TOBN(0xf077bd98, 0x3841ba6a), TOBN(0xc4ac0244, 0x3cd16e7e),
7534 TOBN(0x548ba869, 0x21fea4ca), TOBN(0xd36d0817, 0xf3dfdac1),
7535 TOBN(0x09d8d71f, 0xf4685faf), TOBN(0x8eff66be, 0xc52c459a),
7536 TOBN(0x182faee7, 0x0b57235e), TOBN(0xee3c39b1, 0x0106712b),
7537 TOBN(0x5107331f, 0xc0fcdcb0), TOBN(0x669fb9dc, 0xa51054ba),
7538 TOBN(0xb25101fb, 0x319d7682), TOBN(0xb0293129, 0x0a982fee),
7539 TOBN(0x51c1c9b9, 0x0261b344), TOBN(0x0e008c5b, 0xbfd371fa),
7540 TOBN(0xd866dd1c, 0x0278ca33), TOBN(0x666f76a6, 0xe5aa53b1),
7541 TOBN(0xe5cfb779, 0x6013a2cf), TOBN(0x1d3a1aad, 0xa3521836),
7542 TOBN(0xcedd2531, 0x73faa485), TOBN(0xc8ee6c4f, 0xc0a76878),
7543 TOBN(0xddbccfc9, 0x2a11667d), TOBN(0x1a418ea9, 0x1c2f695a),
7544 TOBN(0xdb11bd92, 0x51f73971), TOBN(0x3e4b3c82, 0xda2ed89f),
7545 TOBN(0x9a44f3f4, 0xe73e0319), TOBN(0xd1e3de0f, 0x303431af),
7546 TOBN(0x3c5604ff, 0x50f75f9c), TOBN(0x1d8eddf3, 0x7e752b22),
7547 TOBN(0x0ef074dd, 0x3c9a1118), TOBN(0xd0ffc172, 0xccb86d7b),
7548 TOBN(0xabd1ece3, 0x037d90f2), TOBN(0xe3f307d6, 0x6055856c),
7549 TOBN(0x422f9328, 0x7e4c6daf), TOBN(0x902aac66, 0x334879a0),
7550 TOBN(0xb6a1e7bf, 0x94cdfade), TOBN(0x6c97e1ed, 0x7fc6d634),
7551 TOBN(0x662ad24d, 0xa2fb63f8), TOBN(0xf81be1b9, 0xa5928405),
7552 TOBN(0x86d765e4, 0xd14b4206), TOBN(0xbecc2e0e, 0x8fa0db65),
7553 TOBN(0xa28838e0, 0xb17fc76c), TOBN(0xe49a602a, 0xe37cf24e),
7554 TOBN(0x76b4131a, 0x567193ec), TOBN(0xaf3c305a, 0xe5f6e70b),
7555 TOBN(0x9587bd39, 0x031eebdd), TOBN(0x5709def8, 0x71bbe831),
7556 TOBN(0x57059983, 0x0eb2b669), TOBN(0x4d80ce1b, 0x875b7029),
7557 TOBN(0x838a7da8, 0x0364ac16), TOBN(0x2f431d23, 0xbe1c83ab),
7558 TOBN(0xe56812a6, 0xf9294dd3), TOBN(0xb448d01f, 0x9b4b0d77),
7559 TOBN(0xf3ae6061, 0x04e8305c), TOBN(0x2bead645, 0x94d8c63e),
7560 TOBN(0x0a85434d, 0x84fd8b07), TOBN(0x537b983f, 0xf7a9dee5),
7561 TOBN(0xedcc5f18, 0xef55bd85), TOBN(0x2041af62, 0x21c6cf8b),
7562 TOBN(0x8e52874c, 0xb940c71e), TOBN(0x211935a9, 0xdb5f4b3a),
7563 TOBN(0x94350492, 0x301b1dc3), TOBN(0x33d2646d, 0x29958620),
7564 TOBN(0x16b0d64b, 0xef911404), TOBN(0x9d1f25ea, 0x9a3c5ef4),
7565 TOBN(0x20f200eb, 0x4a352c78), TOBN(0x43929f2c, 0x4bd0b428),
7566 TOBN(0xa5656667, 0xc7196e29), TOBN(0x7992c2f0, 0x9391be48),
7567 TOBN(0xaaa97cbd, 0x9ee0cd6e), TOBN(0x51b0310c, 0x3dc8c9bf),
7568 TOBN(0x237f8acf, 0xdd9f22cb), TOBN(0xbb1d81a1, 0xb585d584),
7569 TOBN(0x8d5d85f5, 0x8c416388), TOBN(0x0d6e5a5a, 0x42fe474f),
7570 TOBN(0xe7812766, 0x38235d4e), TOBN(0x1c62bd67, 0x496e3298),
7571 TOBN(0x8378660c, 0x3f175bc8), TOBN(0x4d04e189, 0x17afdd4d),
7572 TOBN(0x32a81601, 0x85a8068c), TOBN(0xdb58e4e1, 0x92b29a85),
7573 TOBN(0xe8a65b86, 0xc70d8a3b), TOBN(0x5f0e6f4e, 0x98a0403b),
7574 TOBN(0x08129684, 0x69ed2370), TOBN(0x34dc30bd, 0x0871ee26),
7575 TOBN(0x3a5ce948, 0x7c9c5b05), TOBN(0x7d487b80, 0x43a90c87),
7576 TOBN(0x4089ba37, 0xdd0e7179), TOBN(0x45f80191, 0xb4041811),
7577 TOBN(0x1c3e1058, 0x98747ba5), TOBN(0x98c4e13a, 0x6e1ae592),
7578 TOBN(0xd44636e6, 0xe82c9f9e), TOBN(0x711db87c, 0xc33a1043),
7579 TOBN(0x6f431263, 0xaa8aec05), TOBN(0x43ff120d, 0x2744a4aa),
7580 TOBN(0xd3bd892f, 0xae77779b), TOBN(0xf0fe0cc9, 0x8cdc9f82),
7581 TOBN(0xca5f7fe6, 0xf1c5b1bc), TOBN(0xcc63a682, 0x44929a72),
7582 TOBN(0xc7eaba0c, 0x09dbe19a), TOBN(0x2f3585ad, 0x6b5c73c2),
7583 TOBN(0x8ab8924b, 0x0ae50c30), TOBN(0x17fcd27a, 0x638b30ba),
7584 TOBN(0xaf414d34, 0x10b3d5a5), TOBN(0x09c107d2, 0x2a9accf1),
7585 TOBN(0x15dac49f, 0x946a6242), TOBN(0xaec3df2a, 0xd707d642),
7586 TOBN(0x2c2492b7, 0x3f894ae0), TOBN(0xf59df3e5, 0xb75f18ce),
7587 TOBN(0x7cb740d2, 0x8f53cad0), TOBN(0x3eb585fb, 0xc4f01294),
7588 TOBN(0x17da0c86, 0x32c7f717), TOBN(0xeb8c795b, 0xaf943f4c),
7589 TOBN(0x4ee23fb5, 0xf67c51d2), TOBN(0xef187575, 0x68889949),
7590 TOBN(0xa6b4bdb2, 0x0389168b), TOBN(0xc4ecd258, 0xea577d03),
7591 TOBN(0x3a63782b, 0x55743082), TOBN(0x6f678f4c, 0xc72f08cd),
7592 TOBN(0x553511cf, 0x65e58dd8), TOBN(0xd53b4e3e, 0xd402c0cd),
7593 TOBN(0x37de3e29, 0xa037c14c), TOBN(0x86b6c516, 0xc05712aa),
7594 TOBN(0x2834da3e, 0xb38dff6f), TOBN(0xbe012c52, 0xea636be8),
7595 TOBN(0x292d238c, 0x61dd37f8), TOBN(0x0e54523f, 0x8f8142db),
7596 TOBN(0xe31eb436, 0x036a05d8), TOBN(0x83e3cdff, 0x1e93c0ff),
7597 TOBN(0x3fd2fe0f, 0x50821ddf), TOBN(0xc8e19b0d, 0xff9eb33b),
7598 TOBN(0xc8cc943f, 0xb569a5fe), TOBN(0xad0090d4, 0xd4342d75),
7599 TOBN(0x82090b4b, 0xcaeca000), TOBN(0xca39687f, 0x1bd410eb),
7600 TOBN(0xe7bb0df7, 0x65959d77), TOBN(0x39d78218, 0x9c964999),
7601 TOBN(0xd87f62e8, 0xb2415451), TOBN(0xe5efb774, 0xbed76108),
7602 TOBN(0x3ea011a4, 0xe822f0d0), TOBN(0xbc647ad1, 0x5a8704f8),
7603 TOBN(0xbb315b35, 0x50c6820f), TOBN(0x863dec3d, 0xb7e76bec),
7604 TOBN(0x01ff5d3a, 0xf017bfc7), TOBN(0x20054439, 0x976b8229),
7605 TOBN(0x067fca37, 0x0bbd0d3b), TOBN(0xf63dde64, 0x7f5e3d0f),
7606 TOBN(0x22dbefb3, 0x2a4c94e9), TOBN(0xafbff0fe, 0x96f8278a),
7607 TOBN(0x80aea0b1, 0x3503793d), TOBN(0xb2238029, 0x5f06cd29),
7608 TOBN(0x65703e57, 0x8ec3feca), TOBN(0x06c38314, 0x393e7053),
7609 TOBN(0xa0b751eb, 0x7c6734c4), TOBN(0xd2e8a435, 0xc59f0f1e),
7610 TOBN(0x147d9052, 0x5e9ca895), TOBN(0x2f4dd31e, 0x972072df),
7611 TOBN(0xa16fda8e, 0xe6c6755c), TOBN(0xc66826ff, 0xcf196558),
7612 TOBN(0x1f1a76a3, 0x0cf43895), TOBN(0xa9d604e0, 0x83c3097b),
7613 TOBN(0xe1908309, 0x66390e0e), TOBN(0xa50bf753, 0xb3c85eff),
7614 TOBN(0x0696bdde, 0xf6a70251), TOBN(0x548b801b, 0x3c6ab16a),
7615 TOBN(0x37fcf704, 0xa4d08762), TOBN(0x090b3def, 0xdff76c4e),
7616 TOBN(0x87e8cb89, 0x69cb9158), TOBN(0x44a90744, 0x995ece43),
7617 TOBN(0xf85395f4, 0x0ad9fbf5), TOBN(0x49b0f6c5, 0x4fb0c82d),
7618 TOBN(0x75d9bc15, 0xadf7cccf), TOBN(0x81a3e5d6, 0xdfa1e1b0),
7619 TOBN(0x8c39e444, 0x249bc17e), TOBN(0xf37dccb2, 0x8ea7fd43),
7620 TOBN(0xda654873, 0x907fba12), TOBN(0x35daa6da, 0x4a372904),
7621 TOBN(0x0564cfc6, 0x6283a6c5), TOBN(0xd09fa4f6, 0x4a9395bf),
7622 TOBN(0x688e9ec9, 0xaeb19a36), TOBN(0xd913f1ce, 0xc7bfbfb4),
7623 TOBN(0x797b9a3c, 0x61c2faa6), TOBN(0x2f979bec, 0x6a0a9c12),
7624 TOBN(0xb5969d0f, 0x359679ec), TOBN(0xebcf523d, 0x079b0460),
7625 TOBN(0xfd6b0008, 0x10fab870), TOBN(0x3f2edcda, 0x9373a39c),
7626 TOBN(0x0d64f9a7, 0x6f568431), TOBN(0xf848c27c, 0x02f8898c),
7627 TOBN(0xf418ade1, 0x260b5bd5), TOBN(0xc1f3e323, 0x6973dee8),
7628 TOBN(0x46e9319c, 0x26c185dd), TOBN(0x6d85b7d8, 0x546f0ac4),
7629 TOBN(0x427965f2, 0x247f9d57), TOBN(0xb519b636, 0xb0035f48),
7630 TOBN(0x6b6163a9, 0xab87d59c), TOBN(0xff9f58c3, 0x39caaa11),
7631 TOBN(0x4ac39cde, 0x3177387b), TOBN(0x5f6557c2, 0x873e77f9),
7632 TOBN(0x67504006, 0x36a83041), TOBN(0x9b1c96ca, 0x75ef196c),
7633 TOBN(0xf34283de, 0xb08c7940), TOBN(0x7ea09644, 0x1128c316),
7634 TOBN(0xb510b3b5, 0x6aa39dff), TOBN(0x59b43da2, 0x9f8e4d8c),
7635 TOBN(0xa8ce31fd, 0x9e4c4b9f), TOBN(0x0e20be26, 0xc1303c01),
7636 TOBN(0x18187182, 0xe8ee47c9), TOBN(0xd9687cdb, 0x7db98101),
7637 TOBN(0x7a520e4d, 0xa1e14ff6), TOBN(0x429808ba, 0x8836d572),
7638 TOBN(0xa37ca60d, 0x4944b663), TOBN(0xf901f7a9, 0xa3f91ae5),
7639 TOBN(0xe4e3e76e, 0x9e36e3b1), TOBN(0x9aa219cf, 0x29d93250),
7640 TOBN(0x347fe275, 0x056a2512), TOBN(0xa4d643d9, 0xde65d95c),
7641 TOBN(0x9669d396, 0x699fc3ed), TOBN(0xb598dee2, 0xcf8c6bbe),
7642 TOBN(0x682ac1e5, 0xdda9e5c6), TOBN(0x4e0d3c72, 0xcaa9fc95),
7643 TOBN(0x17faaade, 0x772bea44), TOBN(0x5ef8428c, 0xab0009c8),
7644 TOBN(0xcc4ce47a, 0x460ff016), TOBN(0xda6d12bf, 0x725281cb),
7645 TOBN(0x44c67848, 0x0223aad2), TOBN(0x6e342afa, 0x36256e28),
7646 TOBN(0x1400bb0b, 0x93a37c04), TOBN(0x62b1bc9b, 0xdd10bd96),
7647 TOBN(0x7251adeb, 0x0dac46b7), TOBN(0x7d33b92e, 0x7be4ef51),
7648 TOBN(0x28b2a94b, 0xe61fa29a), TOBN(0x4b2be13f, 0x06422233),
7649 TOBN(0x36d6d062, 0x330d8d37), TOBN(0x5ef80e1e, 0xb28ca005),
7650 TOBN(0x174d4699, 0x6d16768e), TOBN(0x9fc4ff6a, 0x628bf217),
7651 TOBN(0x77705a94, 0x154e490d), TOBN(0x9d96dd28, 0x8d2d997a),
7652 TOBN(0x77e2d9d8, 0xce5d72c4), TOBN(0x9d06c5a4, 0xc11c714f),
7653 TOBN(0x02aa5136, 0x79e4a03e), TOBN(0x1386b3c2, 0x030ff28b),
7654 TOBN(0xfe82e8a6, 0xfb283f61), TOBN(0x7df203e5, 0xf3abc3fb),
7655 TOBN(0xeec7c351, 0x3a4d3622), TOBN(0xf7d17dbf, 0xdf762761),
7656 TOBN(0xc3956e44, 0x522055f0), TOBN(0xde3012db, 0x8fa748db),
7657 TOBN(0xca9fcb63, 0xbf1dcc14), TOBN(0xa56d9dcf, 0xbe4e2f3a),
7658 TOBN(0xb86186b6, 0x8bcec9c2), TOBN(0x7cf24df9, 0x680b9f06),
7659 TOBN(0xc46b45ea, 0xc0d29281), TOBN(0xfff42bc5, 0x07b10e12),
7660 TOBN(0x12263c40, 0x4d289427), TOBN(0x3d5f1899, 0xb4848ec4),
7661 TOBN(0x11f97010, 0xd040800c), TOBN(0xb4c5f529, 0x300feb20),
7662 TOBN(0xcc543f8f, 0xde94fdcb), TOBN(0xe96af739, 0xc7c2f05e),
7663 TOBN(0xaa5e0036, 0x882692e1), TOBN(0x09c75b68, 0x950d4ae9),
7664 TOBN(0x62f63df2, 0xb5932a7a), TOBN(0x2658252e, 0xde0979ad),
7665 TOBN(0x2a19343f, 0xb5e69631), TOBN(0x718c7501, 0x525b666b),
7666 TOBN(0x26a42d69, 0xea40dc3a), TOBN(0xdc84ad22, 0xaecc018f),
7667 TOBN(0x25c36c7b, 0x3270f04a), TOBN(0x46ba6d47, 0x50fa72ed),
7668 TOBN(0x6c37d1c5, 0x93e58a8e), TOBN(0xa2394731, 0x120c088c),
7669 TOBN(0xc3be4263, 0xcb6e86da), TOBN(0x2c417d36, 0x7126d038),
7670 TOBN(0x5b70f9c5, 0x8b6f8efa), TOBN(0x671a2faa, 0x37718536),
7671 TOBN(0xd3ced3c6, 0xb539c92b), TOBN(0xe56f1bd9, 0xa31203c2),
7672 TOBN(0x8b096ec4, 0x9ff3c8eb), TOBN(0x2deae432, 0x43491cea),
7673 TOBN(0x2465c6eb, 0x17943794), TOBN(0x5d267e66, 0x20586843),
7674 TOBN(0x9d3d116d, 0xb07159d0), TOBN(0xae07a67f, 0xc1896210),
7675 TOBN(0x8fc84d87, 0xbb961579), TOBN(0x30009e49, 0x1c1f8dd6),
7676 TOBN(0x8a8caf22, 0xe3132819), TOBN(0xcffa197c, 0xf23ab4ff),
7677 TOBN(0x58103a44, 0x205dd687), TOBN(0x57b796c3, 0x0ded67a2),
7678 TOBN(0x0b9c3a6c, 0xa1779ad7), TOBN(0xa33cfe2e, 0x357c09c5),
7679 TOBN(0x2ea29315, 0x3db4a57e), TOBN(0x91959695, 0x8ebeb52e),
7680 TOBN(0x118db9a6, 0xe546c879), TOBN(0x8e996df4, 0x6295c8d6),
7681 TOBN(0xdd990484, 0x55ec806b), TOBN(0x24f291ca, 0x165c1035),
7682 TOBN(0xcca523bb, 0x440e2229), TOBN(0x324673a2, 0x73ef4d04),
7683 TOBN(0xaf3adf34, 0x3e11ec39), TOBN(0x6136d7f1, 0xdc5968d3),
7684 TOBN(0x7a7b2899, 0xb053a927), TOBN(0x3eaa2661, 0xae067ecd),
7685 TOBN(0x8549b9c8, 0x02779cd9), TOBN(0x061d7940, 0xc53385ea),
7686 TOBN(0x3e0ba883, 0xf06d18bd), TOBN(0x4ba6de53, 0xb2700843),
7687 TOBN(0xb966b668, 0x591a9e4d), TOBN(0x93f67567, 0x7f4fa0ed),
7688 TOBN(0x5a02711b, 0x4347237b), TOBN(0xbc041e2f, 0xe794608e),
7689 TOBN(0x55af10f5, 0x70f73d8c), TOBN(0xd2d4d4f7, 0xbb7564f7),
7690 TOBN(0xd7d27a89, 0xb3e93ce7), TOBN(0xf7b5a875, 0x5d3a2c1b),
7691 TOBN(0xb29e68a0, 0x255b218a), TOBN(0xb533837e, 0x8af76754),
7692 TOBN(0xd1b05a73, 0x579fab2e), TOBN(0xb41055a1, 0xecd74385),
7693 TOBN(0xb2369274, 0x445e9115), TOBN(0x2972a7c4, 0xf520274e),
7694 TOBN(0x6c08334e, 0xf678e68a), TOBN(0x4e4160f0, 0x99b057ed),
7695 TOBN(0x3cfe11b8, 0x52ccb69a), TOBN(0x2fd1823a, 0x21c8f772),
7696 TOBN(0xdf7f072f, 0x3298f055), TOBN(0x8c0566f9, 0xfec74a6e),
7697 TOBN(0xe549e019, 0x5bb4d041), TOBN(0x7c3930ba, 0x9208d850),
7698 TOBN(0xe07141fc, 0xaaa2902b), TOBN(0x539ad799, 0xe4f69ad3),
7699 TOBN(0xa6453f94, 0x813f9ffd), TOBN(0xc58d3c48, 0x375bc2f7),
7700 TOBN(0xb3326fad, 0x5dc64e96), TOBN(0x3aafcaa9, 0xb240e354),
7701 TOBN(0x1d1b0903, 0xaca1e7a9), TOBN(0x4ceb9767, 0x1211b8a0),
7702 TOBN(0xeca83e49, 0xe32a858e), TOBN(0x4c32892e, 0xae907bad),
7703 TOBN(0xd5b42ab6, 0x2eb9b494), TOBN(0x7fde3ee2, 0x1eabae1b),
7704 TOBN(0x13b5ab09, 0xcaf54957), TOBN(0xbfb028be, 0xe5f5d5d5),
7705 TOBN(0x928a0650, 0x2003e2c0), TOBN(0x90793aac, 0x67476843),
7706 TOBN(0x5e942e79, 0xc81710a0), TOBN(0x557e4a36, 0x27ccadd4),
7707 TOBN(0x72a2bc56, 0x4bcf6d0c), TOBN(0x09ee5f43, 0x26d7b80c),
7708 TOBN(0x6b70dbe9, 0xd4292f19), TOBN(0x56f74c26, 0x63f16b18),
7709 TOBN(0xc23db0f7, 0x35fbb42a), TOBN(0xb606bdf6, 0x6ae10040),
7710 TOBN(0x1eb15d4d, 0x044573ac), TOBN(0x7dc3cf86, 0x556b0ba4),
7711 TOBN(0x97af9a33, 0xc60df6f7), TOBN(0x0b1ef85c, 0xa716ce8c),
7712 TOBN(0x2922f884, 0xc96958be), TOBN(0x7c32fa94, 0x35690963),
7713 TOBN(0x2d7f667c, 0xeaa00061), TOBN(0xeaaf7c17, 0x3547365c),
7714 TOBN(0x1eb4de46, 0x87032d58), TOBN(0xc54f3d83, 0x5e2c79e0),
7715 TOBN(0x07818df4, 0x5d04ef23), TOBN(0x55faa9c8, 0x673d41b4),
7716 TOBN(0xced64f6f, 0x89b95355), TOBN(0x4860d2ea, 0xb7415c84),
7717 TOBN(0x5fdb9bd2, 0x050ebad3), TOBN(0xdb53e0cc, 0x6685a5bf),
7718 TOBN(0xb830c031, 0x9feb6593), TOBN(0xdd87f310, 0x6accff17),
7719 TOBN(0x2303ebab, 0x9f555c10), TOBN(0x94603695, 0x287e7065),
7720 TOBN(0xf88311c3, 0x2e83358c), TOBN(0x508dd9b4, 0xeefb0178),
7721 TOBN(0x7ca23706, 0x2dba8652), TOBN(0x62aac5a3, 0x0047abe5),
7722 TOBN(0x9a61d2a0, 0x8b1ea7b3), TOBN(0xd495ab63, 0xae8b1485),
7723 TOBN(0x38740f84, 0x87052f99), TOBN(0x178ebe5b, 0xb2974eea),
7724 TOBN(0x030bbcca, 0x5b36d17f), TOBN(0xb5e4cce3, 0xaaf86eea),
7725 TOBN(0xb51a0220, 0x68f8e9e0), TOBN(0xa4348796, 0x09eb3e75),
7726 TOBN(0xbe592309, 0xeef1a752), TOBN(0x5d7162d7, 0x6f2aa1ed),
7727 TOBN(0xaebfb5ed, 0x0f007dd2), TOBN(0x255e14b2, 0xc89edd22),
7728 TOBN(0xba85e072, 0x0303b697), TOBN(0xc5d17e25, 0xf05720ff),
7729 TOBN(0x02b58d6e, 0x5128ebb6), TOBN(0x2c80242d, 0xd754e113),
7730 TOBN(0x919fca5f, 0xabfae1ca), TOBN(0x937afaac, 0x1a21459b),
7731 TOBN(0x9e0ca91c, 0x1f66a4d2), TOBN(0x194cc7f3, 0x23ec1331),
7732 TOBN(0xad25143a, 0x8aa11690), TOBN(0xbe40ad8d, 0x09b59e08),
7733 TOBN(0x37d60d9b, 0xe750860a), TOBN(0x6c53b008, 0xc6bf434c),
7734 TOBN(0xb572415d, 0x1356eb80), TOBN(0xb8bf9da3, 0x9578ded8),
7735 TOBN(0x22658e36, 0x5e8fb38b), TOBN(0x9b70ce22, 0x5af8cb22),
7736 TOBN(0x7c00018a, 0x829a8180), TOBN(0x84329f93, 0xb81ed295),
7737 TOBN(0x7c343ea2, 0x5f3cea83), TOBN(0x38f8655f, 0x67586536),
7738 TOBN(0xa661a0d0, 0x1d3ec517), TOBN(0x98744652, 0x512321ae),
7739 TOBN(0x084ca591, 0xeca92598), TOBN(0xa9bb9dc9, 0x1dcb3feb),
7740 TOBN(0x14c54355, 0x78b4c240), TOBN(0x5ed62a3b, 0x610cafdc),
7741 TOBN(0x07512f37, 0x1b38846b), TOBN(0x571bb70a, 0xb0e38161),
7742 TOBN(0xb556b95b, 0x2da705d2), TOBN(0x3ef8ada6, 0xb1a08f98),
7743 TOBN(0x85302ca7, 0xddecfbe5), TOBN(0x0e530573, 0x943105cd),
7744 TOBN(0x60554d55, 0x21a9255d), TOBN(0x63a32fa1, 0xf2f3802a),
7745 TOBN(0x35c8c5b0, 0xcd477875), TOBN(0x97f458ea, 0x6ad42da1),
7746 TOBN(0x832d7080, 0xeb6b242d), TOBN(0xd30bd023, 0x3b71e246),
7747 TOBN(0x7027991b, 0xbe31139d), TOBN(0x68797e91, 0x462e4e53),
7748 TOBN(0x423fe20a, 0x6b4e185a), TOBN(0x82f2c67e, 0x42d9b707),
7749 TOBN(0x25c81768, 0x4cf7811b), TOBN(0xbd53005e, 0x045bb95d),
7750 },
7751 {
7752 TOBN(0xe5f649be, 0x9d8e68fd), TOBN(0xdb0f0533, 0x1b044320),
7753 TOBN(0xf6fde9b3, 0xe0c33398), TOBN(0x92f4209b, 0x66c8cfae),
7754 TOBN(0xe9d1afcc, 0x1a739d4b), TOBN(0x09aea75f, 0xa28ab8de),
7755 TOBN(0x14375fb5, 0xeac6f1d0), TOBN(0x6420b560, 0x708f7aa5),
7756 TOBN(0x9eae499c, 0x6254dc41), TOBN(0x7e293924, 0x7a837e7e),
7757 TOBN(0x74aec08c, 0x090524a7), TOBN(0xf82b9219, 0x8d6f55f2),
7758 TOBN(0x493c962e, 0x1402cec5), TOBN(0x9f17ca17, 0xfa2f30e7),
7759 TOBN(0xbcd783e8, 0xe9b879cb), TOBN(0xea3d8c14, 0x5a6f145f),
7760 TOBN(0xdede15e7, 0x5e0dee6e), TOBN(0x74f24872, 0xdc628aa2),
7761 TOBN(0xd3e9c4fe, 0x7861bb93), TOBN(0x56d4822a, 0x6187b2e0),
7762 TOBN(0xb66417cf, 0xc59826f9), TOBN(0xca260969, 0x2408169e),
7763 TOBN(0xedf69d06, 0xc79ef885), TOBN(0x00031f8a, 0xdc7d138f),
7764 TOBN(0x103c46e6, 0x0ebcf726), TOBN(0x4482b831, 0x6231470e),
7765 TOBN(0x6f6dfaca, 0x487c2109), TOBN(0x2e0ace97, 0x62e666ef),
7766 TOBN(0x3246a9d3, 0x1f8d1f42), TOBN(0x1b1e83f1, 0x574944d2),
7767 TOBN(0x13dfa63a, 0xa57f334b), TOBN(0x0cf8daed, 0x9f025d81),
7768 TOBN(0x30d78ea8, 0x00ee11c1), TOBN(0xeb053cd4, 0xb5e3dd75),
7769 TOBN(0x9b65b13e, 0xd58c43c5), TOBN(0xc3ad49bd, 0xbd151663),
7770 TOBN(0x99fd8e41, 0xb6427990), TOBN(0x12cf15bd, 0x707eae1e),
7771 TOBN(0x29ad4f1b, 0x1aabb71e), TOBN(0x5143e74d, 0x07545d0e),
7772 TOBN(0x30266336, 0xc88bdee1), TOBN(0x25f29306, 0x5876767c),
7773 TOBN(0x9c078571, 0xc6731996), TOBN(0xc88690b2, 0xed552951),
7774 TOBN(0x274f2c2d, 0x852705b4), TOBN(0xb0bf8d44, 0x4e09552d),
7775 TOBN(0x7628beeb, 0x986575d1), TOBN(0x407be238, 0x7f864651),
7776 TOBN(0x0e5e3049, 0xa639fc6b), TOBN(0xe75c35d9, 0x86003625),
7777 TOBN(0x0cf35bd8, 0x5dcc1646), TOBN(0x8bcaced2, 0x6c26273a),
7778 TOBN(0xe22ecf1d, 0xb5536742), TOBN(0x013dd897, 0x1a9e068b),
7779 TOBN(0x17f411cb, 0x8a7909c5), TOBN(0x5757ac98, 0x861dd506),
7780 TOBN(0x85de1f0d, 0x1e935abb), TOBN(0xdefd10b4, 0x154de37a),
7781 TOBN(0xb8d9e392, 0x369cebb5), TOBN(0x54d5ef9b, 0x761324be),
7782 TOBN(0x4d6341ba, 0x74f17e26), TOBN(0xc0a0e3c8, 0x78c1dde4),
7783 TOBN(0xa6d77581, 0x87d918fd), TOBN(0x66876015, 0x02ca3a13),
7784 TOBN(0xc7313e9c, 0xf36658f0), TOBN(0xc433ef1c, 0x71f8057e),
7785 TOBN(0x85326246, 0x1b6a835a), TOBN(0xc8f05398, 0x7c86394c),
7786 TOBN(0xff398cdf, 0xe983c4a1), TOBN(0xbf5e8162, 0x03b7b931),
7787 TOBN(0x93193c46, 0xb7b9045b), TOBN(0x1e4ebf5d, 0xa4a6e46b),
7788 TOBN(0xf9942a60, 0x43a24fe7), TOBN(0x29c1191e, 0xffb3492b),
7789 TOBN(0x9f662449, 0x902fde05), TOBN(0xc792a7ac, 0x6713c32d),
7790 TOBN(0x2fd88ad8, 0xb737982c), TOBN(0x7e3a0319, 0xa21e60e3),
7791 TOBN(0x09b0de44, 0x7383591a), TOBN(0x6df141ee, 0x8310a456),
7792 TOBN(0xaec1a039, 0xe6d6f471), TOBN(0x14b2ba0f, 0x1198d12e),
7793 TOBN(0xebc1a160, 0x3aeee5ac), TOBN(0x401f4836, 0xe0b964ce),
7794 TOBN(0x2ee43796, 0x4fd03f66), TOBN(0x3fdb4e49, 0xdd8f3f12),
7795 TOBN(0x6ef267f6, 0x29380f18), TOBN(0x3e8e9670, 0x8da64d16),
7796 TOBN(0xbc19180c, 0x207674f1), TOBN(0x112e09a7, 0x33ae8fdb),
7797 TOBN(0x99667554, 0x6aaeb71e), TOBN(0x79432af1, 0xe101b1c7),
7798 TOBN(0xd5eb558f, 0xde2ddec6), TOBN(0x81392d1f, 0x5357753f),
7799 TOBN(0xa7a76b97, 0x3ae1158a), TOBN(0x416fbbff, 0x4a899991),
7800 TOBN(0x9e65fdfd, 0x0d4a9dcf), TOBN(0x7bc29e48, 0x944ddf12),
7801 TOBN(0xbc1a92d9, 0x3c856866), TOBN(0x273c6905, 0x6e98dfe2),
7802 TOBN(0x69fce418, 0xcdfaa6b8), TOBN(0x606bd823, 0x5061c69f),
7803 TOBN(0x42d495a0, 0x6af75e27), TOBN(0x8ed3d505, 0x6d873a1f),
7804 TOBN(0xaf552841, 0x6ab25b6a), TOBN(0xc6c0ffc7, 0x2b1a4523),
7805 TOBN(0xab18827b, 0x21c99e03), TOBN(0x060e8648, 0x9034691b),
7806 TOBN(0x5207f90f, 0x93c7f398), TOBN(0x9f4a96cb, 0x82f8d10b),
7807 TOBN(0xdd71cd79, 0x3ad0f9e3), TOBN(0x84f435d2, 0xfc3a54f5),
7808 TOBN(0x4b03c55b, 0x8e33787f), TOBN(0xef42f975, 0xa6384673),
7809 TOBN(0xff7304f7, 0x5051b9f0), TOBN(0x18aca1dc, 0x741c87c2),
7810 TOBN(0x56f120a7, 0x2d4bfe80), TOBN(0xfd823b3d, 0x053e732c),
7811 TOBN(0x11bccfe4, 0x7537ca16), TOBN(0xdf6c9c74, 0x1b5a996b),
7812 TOBN(0xee7332c7, 0x904fc3fa), TOBN(0x14a23f45, 0xc7e3636a),
7813 TOBN(0xc38659c3, 0xf091d9aa), TOBN(0x4a995e5d, 0xb12d8540),
7814 TOBN(0x20a53bec, 0xf3a5598a), TOBN(0x56534b17, 0xb1eaa995),
7815 TOBN(0x9ed3dca4, 0xbf04e03c), TOBN(0x716c563a, 0xd8d56268),
7816 TOBN(0x27ba77a4, 0x1d6178e7), TOBN(0xe4c80c40, 0x68a1ff8e),
7817 TOBN(0x75011099, 0x0a13f63d), TOBN(0x7bf33521, 0xa61d46f3),
7818 TOBN(0x0aff218e, 0x10b365bb), TOBN(0x81021804, 0x0fd7ea75),
7819 TOBN(0x05a3fd8a, 0xa4b3a925), TOBN(0xb829e75f, 0x9b3db4e6),
7820 TOBN(0x6bdc75a5, 0x4d53e5fb), TOBN(0x04a5dc02, 0xd52717e3),
7821 TOBN(0x86af502f, 0xe9a42ec2), TOBN(0x8867e8fb, 0x2630e382),
7822 TOBN(0xbf845c6e, 0xbec9889b), TOBN(0x54f491f2, 0xcb47c98d),
7823 TOBN(0xa3091fba, 0x790c2a12), TOBN(0xd7f6fd78, 0xc20f708b),
7824 TOBN(0xa569ac30, 0xacde5e17), TOBN(0xd0f996d0, 0x6852b4d7),
7825 TOBN(0xe51d4bb5, 0x4609ae54), TOBN(0x3fa37d17, 0x0daed061),
7826 TOBN(0x62a88684, 0x34b8fb41), TOBN(0x99a2acbd, 0x9efb64f1),
7827 TOBN(0xb75c1a5e, 0x6448e1f2), TOBN(0xfa99951a, 0x42b5a069),
7828 TOBN(0x6d956e89, 0x2f3b26e7), TOBN(0xf4709860, 0xda875247),
7829 TOBN(0x3ad15179, 0x2482dda3), TOBN(0xd64110e3, 0x017d82f0),
7830 TOBN(0x14928d2c, 0xfad414e4), TOBN(0x2b155f58, 0x2ed02b24),
7831 TOBN(0x481a141b, 0xcb821bf1), TOBN(0x12e3c770, 0x4f81f5da),
7832 TOBN(0xe49c5de5, 0x9fff8381), TOBN(0x11053232, 0x5bbec894),
7833 TOBN(0xa0d051cc, 0x454d88c4), TOBN(0x4f6db89c, 0x1f8e531b),
7834 TOBN(0x34fe3fd6, 0xca563a44), TOBN(0x7f5c2215, 0x58da8ab9),
7835 TOBN(0x8445016d, 0x9474f0a1), TOBN(0x17d34d61, 0xcb7d8a0a),
7836 TOBN(0x8e9d3910, 0x1c474019), TOBN(0xcaff2629, 0xd52ceefb),
7837 TOBN(0xf9cf3e32, 0xc1622c2b), TOBN(0xd4b95e3c, 0xe9071a05),
7838 TOBN(0xfbbca61f, 0x1594438c), TOBN(0x1eb6e6a6, 0x04aadedf),
7839 TOBN(0x853027f4, 0x68e14940), TOBN(0x221d322a, 0xdfabda9c),
7840 TOBN(0xed8ea9f6, 0xb7cb179a), TOBN(0xdc7b764d, 0xb7934dcc),
7841 TOBN(0xfcb13940, 0x5e09180d), TOBN(0x6629a6bf, 0xb47dc2dd),
7842 TOBN(0xbfc55e4e, 0x9f5a915e), TOBN(0xb1db9d37, 0x6204441e),
7843 TOBN(0xf82d68cf, 0x930c5f53), TOBN(0x17d3a142, 0xcbb605b1),
7844 TOBN(0xdd5944ea, 0x308780f2), TOBN(0xdc8de761, 0x3845f5e4),
7845 TOBN(0x6beaba7d, 0x7624d7a3), TOBN(0x1e709afd, 0x304df11e),
7846 TOBN(0x95364376, 0x02170456), TOBN(0xbf204b3a, 0xc8f94b64),
7847 TOBN(0x4e53af7c, 0x5680ca68), TOBN(0x0526074a, 0xe0c67574),
7848 TOBN(0x95d8cef8, 0xecd92af6), TOBN(0xe6b9fa7a, 0x6cd1745a),
7849 TOBN(0x3d546d3d, 0xa325c3e4), TOBN(0x1f57691d, 0x9ae93aae),
7850 TOBN(0xe891f3fe, 0x9d2e1a33), TOBN(0xd430093f, 0xac063d35),
7851 TOBN(0xeda59b12, 0x5513a327), TOBN(0xdc2134f3, 0x5536f18f),
7852 TOBN(0xaa51fe2c, 0x5c210286), TOBN(0x3f68aaee, 0x1cab658c),
7853 TOBN(0x5a23a00b, 0xf9357292), TOBN(0x9a626f39, 0x7efdabed),
7854 TOBN(0xfe2b3bf3, 0x199d78e3), TOBN(0xb7a2af77, 0x71bbc345),
7855 TOBN(0x3d19827a, 0x1e59802c), TOBN(0x823bbc15, 0xb487a51c),
7856 TOBN(0x856139f2, 0x99d0a422), TOBN(0x9ac3df65, 0xf456c6fb),
7857 TOBN(0xaddf65c6, 0x701f8bd6), TOBN(0x149f321e, 0x3758df87),
7858 TOBN(0xb1ecf714, 0x721b7eba), TOBN(0xe17df098, 0x31a3312a),
7859 TOBN(0xdb2fd6ec, 0xd5c4d581), TOBN(0xfd02996f, 0x8fcea1b3),
7860 TOBN(0xe29fa63e, 0x7882f14f), TOBN(0xc9f6dc35, 0x07c6cadc),
7861 TOBN(0x46f22d6f, 0xb882bed0), TOBN(0x1a45755b, 0xd118e52c),
7862 TOBN(0x9f2c7c27, 0x7c4608cf), TOBN(0x7ccbdf32, 0x568012c2),
7863 TOBN(0xfcb0aedd, 0x61729b0e), TOBN(0x7ca2ca9e, 0xf7d75dbf),
7864 TOBN(0xf58fecb1, 0x6f640f62), TOBN(0xe274b92b, 0x39f51946),
7865 TOBN(0x7f4dfc04, 0x6288af44), TOBN(0x0a91f32a, 0xeac329e5),
7866 TOBN(0x43ad274b, 0xd6aaba31), TOBN(0x719a1640, 0x0f6884f9),
7867 TOBN(0x685d29f6, 0xdaf91e20), TOBN(0x5ec1cc33, 0x27e49d52),
7868 TOBN(0x38f4de96, 0x3b54a059), TOBN(0x0e0015e5, 0xefbcfdb3),
7869 TOBN(0x177d23d9, 0x4dbb8da6), TOBN(0x98724aa2, 0x97a617ad),
7870 TOBN(0x30f0885b, 0xfdb6558e), TOBN(0xf9f7a28a, 0xc7899a96),
7871 TOBN(0xd2ae8ac8, 0x872dc112), TOBN(0xfa0642ca, 0x73c3c459),
7872 TOBN(0x15296981, 0xe7dfc8d6), TOBN(0x67cd4450, 0x1fb5b94a),
7873 TOBN(0x0ec71cf1, 0x0eddfd37), TOBN(0xc7e5eeb3, 0x9a8eddc7),
7874 TOBN(0x02ac8e3d, 0x81d95028), TOBN(0x0088f172, 0x70b0e35d),
7875 TOBN(0xec041fab, 0xe1881fe3), TOBN(0x62cf71b8, 0xd99e7faa),
7876 TOBN(0x5043dea7, 0xe0f222c2), TOBN(0x309d42ac, 0x72e65142),
7877 TOBN(0x94fe9ddd, 0x9216cd30), TOBN(0xd6539c7d, 0x0f87feec),
7878 TOBN(0x03c5a57c, 0x432ac7d7), TOBN(0x72692cf0, 0x327fda10),
7879 TOBN(0xec28c85f, 0x280698de), TOBN(0x2331fb46, 0x7ec283b1),
7880 TOBN(0xd34bfa32, 0x2867e633), TOBN(0x78709a82, 0x0a9cc815),
7881 TOBN(0xb7fe6964, 0x875e2fa5), TOBN(0x25cc064f, 0x9e98bfb5),
7882 TOBN(0x9eb0151c, 0x493a65c5), TOBN(0x5fb5d941, 0x53182464),
7883 TOBN(0x69e6f130, 0xf04618e2), TOBN(0xa8ecec22, 0xf89c8ab6),
7884 TOBN(0xcd6ac88b, 0xb96209bd), TOBN(0x65fa8cdb, 0xb3e1c9e0),
7885 TOBN(0xa47d22f5, 0x4a8d8eac), TOBN(0x83895cdf, 0x8d33f963),
7886 TOBN(0xa8adca59, 0xb56cd3d1), TOBN(0x10c8350b, 0xdaf38232),
7887 TOBN(0x2b161fb3, 0xa5080a9f), TOBN(0xbe7f5c64, 0x3af65b3a),
7888 TOBN(0x2c754039, 0x97403a11), TOBN(0x94626cf7, 0x121b96af),
7889 TOBN(0x431de7c4, 0x6a983ec2), TOBN(0x3780dd3a, 0x52cc3df7),
7890 TOBN(0xe28a0e46, 0x2baf8e3b), TOBN(0xabe68aad, 0x51d299ae),
7891 TOBN(0x603eb8f9, 0x647a2408), TOBN(0x14c61ed6, 0x5c750981),
7892 TOBN(0x88b34414, 0xc53352e7), TOBN(0x5a34889c, 0x1337d46e),
7893 TOBN(0x612c1560, 0xf95f2bc8), TOBN(0x8a3f8441, 0xd4807a3a),
7894 TOBN(0x680d9e97, 0x5224da68), TOBN(0x60cd6e88, 0xc3eb00e9),
7895 TOBN(0x3875a98e, 0x9a6bc375), TOBN(0xdc80f924, 0x4fd554c2),
7896 TOBN(0x6c4b3415, 0x6ac77407), TOBN(0xa1e5ea8f, 0x25420681),
7897 TOBN(0x541bfa14, 0x4607a458), TOBN(0x5dbc7e7a, 0x96d7fbf9),
7898 TOBN(0x646a851b, 0x31590a47), TOBN(0x039e85ba, 0x15ee6df8),
7899 TOBN(0xd19fa231, 0xd7b43fc0), TOBN(0x84bc8be8, 0x299a0e04),
7900 TOBN(0x2b9d2936, 0xf20df03a), TOBN(0x24054382, 0x8608d472),
7901 TOBN(0x76b6ba04, 0x9149202a), TOBN(0xb21c3831, 0x3670e7b7),
7902 TOBN(0xddd93059, 0xd6fdee10), TOBN(0x9da47ad3, 0x78488e71),
7903 TOBN(0x99cc1dfd, 0xa0fcfb25), TOBN(0x42abde10, 0x64696954),
7904 TOBN(0x14cc15fc, 0x17eab9fe), TOBN(0xd6e863e4, 0xd3e70972),
7905 TOBN(0x29a7765c, 0x6432112c), TOBN(0x88660001, 0x5b0774d8),
7906 TOBN(0x3729175a, 0x2c088eae), TOBN(0x13afbcae, 0x8230b8d4),
7907 TOBN(0x44768151, 0x915f4379), TOBN(0xf086431a, 0xd8d22812),
7908 TOBN(0x37461955, 0xc298b974), TOBN(0x905fb5f0, 0xf8711e04),
7909 TOBN(0x787abf3a, 0xfe969d18), TOBN(0x392167c2, 0x6f6a494e),
7910 TOBN(0xfc7a0d2d, 0x28c511da), TOBN(0xf127c7dc, 0xb66a262d),
7911 TOBN(0xf9c4bb95, 0xfd63fdf0), TOBN(0x90016589, 0x3913ef46),
7912 TOBN(0x74d2a73c, 0x11aa600d), TOBN(0x2f5379bd, 0x9fb5ab52),
7913 TOBN(0xe49e53a4, 0x7fb70068), TOBN(0x68dd39e5, 0x404aa9a7),
7914 TOBN(0xb9b0cf57, 0x2ecaa9c3), TOBN(0xba0e103b, 0xe824826b),
7915 TOBN(0x60c2198b, 0x4631a3c4), TOBN(0xc5ff84ab, 0xfa8966a2),
7916 TOBN(0x2d6ebe22, 0xac95aff8), TOBN(0x1c9bb6db, 0xb5a46d09),
7917 TOBN(0x419062da, 0x53ee4f8d), TOBN(0x7b9042d0, 0xbb97efef),
7918 TOBN(0x0f87f080, 0x830cf6bd), TOBN(0x4861d19a, 0x6ec8a6c6),
7919 TOBN(0xd3a0daa1, 0x202f01aa), TOBN(0xb0111674, 0xf25afbd5),
7920 TOBN(0x6d00d6cf, 0x1afb20d9), TOBN(0x13695000, 0x40671bc5),
7921 TOBN(0x913ab0dc, 0x2485ea9b), TOBN(0x1f2bed06, 0x9eef61ac),
7922 TOBN(0x850c8217, 0x6d799e20), TOBN(0x93415f37, 0x3271c2de),
7923 TOBN(0x5afb06e9, 0x6c4f5910), TOBN(0x688a52df, 0xc4e9e421),
7924 TOBN(0x30495ba3, 0xe2a9a6db), TOBN(0x4601303d, 0x58f9268b),
7925 TOBN(0xbe3b0dad, 0x7eb0f04f), TOBN(0x4ea47250, 0x4456936d),
7926 TOBN(0x8caf8798, 0xd33fd3e7), TOBN(0x1ccd8a89, 0xeb433708),
7927 TOBN(0x9effe3e8, 0x87fd50ad), TOBN(0xbe240a56, 0x6b29c4df),
7928 TOBN(0xec4ffd98, 0xca0e7ebd), TOBN(0xf586783a, 0xe748616e),
7929 TOBN(0xa5b00d8f, 0xc77baa99), TOBN(0x0acada29, 0xb4f34c9c),
7930 TOBN(0x36dad67d, 0x0fe723ac), TOBN(0x1d8e53a5, 0x39c36c1e),
7931 TOBN(0xe4dd342d, 0x1f4bea41), TOBN(0x64fd5e35, 0xebc9e4e0),
7932 TOBN(0x96f01f90, 0x57908805), TOBN(0xb5b9ea3d, 0x5ed480dd),
7933 TOBN(0x366c5dc2, 0x3efd2dd0), TOBN(0xed2fe305, 0x6e9dfa27),
7934 TOBN(0x4575e892, 0x6e9197e2), TOBN(0x11719c09, 0xab502a5d),
7935 TOBN(0x264c7bec, 0xe81f213f), TOBN(0x741b9241, 0x55f5c457),
7936 TOBN(0x78ac7b68, 0x49a5f4f4), TOBN(0xf91d70a2, 0x9fc45b7d),
7937 TOBN(0x39b05544, 0xb0f5f355), TOBN(0x11f06bce, 0xeef930d9),
7938 TOBN(0xdb84d25d, 0x038d05e1), TOBN(0x04838ee5, 0xbacc1d51),
7939 TOBN(0x9da3ce86, 0x9e8ee00b), TOBN(0xc3412057, 0xc36eda1f),
7940 TOBN(0xae80b913, 0x64d9c2f4), TOBN(0x7468bac3, 0xa010a8ff),
7941 TOBN(0xdfd20037, 0x37359d41), TOBN(0x1a0f5ab8, 0x15efeacc),
7942 TOBN(0x7c25ad2f, 0x659d0ce0), TOBN(0x4011bcbb, 0x6785cff1),
7943 TOBN(0x128b9912, 0x7e2192c7), TOBN(0xa549d8e1, 0x13ccb0e8),
7944 TOBN(0x805588d8, 0xc85438b1), TOBN(0x5680332d, 0xbc25cb27),
7945 TOBN(0xdcd1bc96, 0x1a4bfdf4), TOBN(0x779ff428, 0x706f6566),
7946 TOBN(0x8bbee998, 0xf059987a), TOBN(0xf6ce8cf2, 0xcc686de7),
7947 TOBN(0xf8ad3c4a, 0x953cfdb2), TOBN(0xd1d426d9, 0x2205da36),
7948 TOBN(0xb3c0f13f, 0xc781a241), TOBN(0x3e89360e, 0xd75362a8),
7949 TOBN(0xccd05863, 0xc8a91184), TOBN(0x9bd0c9b7, 0xefa8a7f4),
7950 TOBN(0x97ee4d53, 0x8a912a4b), TOBN(0xde5e15f8, 0xbcf518fd),
7951 TOBN(0x6a055bf8, 0xc467e1e0), TOBN(0x10be4b4b, 0x1587e256),
7952 TOBN(0xd90c14f2, 0x668621c9), TOBN(0xd5518f51, 0xab9c92c1),
7953 TOBN(0x8e6a0100, 0xd6d47b3c), TOBN(0xcbe980dd, 0x66716175),
7954 TOBN(0x500d3f10, 0xddd83683), TOBN(0x3b6cb35d, 0x99cac73c),
7955 TOBN(0x53730c8b, 0x6083d550), TOBN(0xcf159767, 0xdf0a1987),
7956 TOBN(0x84bfcf53, 0x43ad73b3), TOBN(0x1b528c20, 0x4f035a94),
7957 TOBN(0x4294edf7, 0x33eeac69), TOBN(0xb6283e83, 0x817f3240),
7958 TOBN(0xc3fdc959, 0x0a5f25b1), TOBN(0xefaf8aa5, 0x5844ee22),
7959 TOBN(0xde269ba5, 0xdbdde4de), TOBN(0xe3347160, 0xc56133bf),
7960 TOBN(0xc1184219, 0x8d9ea9f8), TOBN(0x090de5db, 0xf3fc1ab5),
7961 TOBN(0x404c37b1, 0x0bf22cda), TOBN(0x7de20ec8, 0xf5618894),
7962 TOBN(0x754c588e, 0xecdaecab), TOBN(0x6ca4b0ed, 0x88342743),
7963 TOBN(0x76f08bdd, 0xf4a938ec), TOBN(0xd182de89, 0x91493ccb),
7964 TOBN(0xd652c53e, 0xc8a4186a), TOBN(0xb3e878db, 0x946d8e33),
7965 TOBN(0x088453c0, 0x5f37663c), TOBN(0x5cd9daaa, 0xb407748b),
7966 TOBN(0xa1f5197f, 0x586d5e72), TOBN(0x47500be8, 0xc443ca59),
7967 TOBN(0x78ef35b2, 0xe2652424), TOBN(0x09c5d26f, 0x6dd7767d),
7968 TOBN(0x7175a79a, 0xa74d3f7b), TOBN(0x0428fd8d, 0xcf5ea459),
7969 TOBN(0x511cb97c, 0xa5d1746d), TOBN(0x36363939, 0xe71d1278),
7970 TOBN(0xcf2df955, 0x10350bf4), TOBN(0xb3817439, 0x60aae782),
7971 TOBN(0xa748c0e4, 0x3e688809), TOBN(0x98021fbf, 0xd7a5a006),
7972 TOBN(0x9076a70c, 0x0e367a98), TOBN(0xbea1bc15, 0x0f62b7c2),
7973 TOBN(0x2645a68c, 0x30fe0343), TOBN(0xacaffa78, 0x699dc14f),
7974 TOBN(0xf4469964, 0x457bf9c4), TOBN(0x0db6407b, 0x0d2ead83),
7975 TOBN(0x68d56cad, 0xb2c6f3eb), TOBN(0x3b512e73, 0xf376356c),
7976 TOBN(0xe43b0e1f, 0xfce10408), TOBN(0x89ddc003, 0x5a5e257d),
7977 TOBN(0xb0ae0d12, 0x0362e5b3), TOBN(0x07f983c7, 0xb0519161),
7978 TOBN(0xc2e94d15, 0x5d5231e7), TOBN(0xcff22aed, 0x0b4f9513),
7979 TOBN(0xb02588dd, 0x6ad0b0b5), TOBN(0xb967d1ac, 0x11d0dcd5),
7980 TOBN(0x8dac6bc6, 0xcf777b6c), TOBN(0x0062bdbd, 0x4c6d1959),
7981 TOBN(0x53da71b5, 0x0ef5cc85), TOBN(0x07012c7d, 0x4006f14f),
7982 TOBN(0x4617f962, 0xac47800d), TOBN(0x53365f2b, 0xc102ed75),
7983 TOBN(0xb422efcb, 0x4ab8c9d3), TOBN(0x195cb26b, 0x34af31c9),
7984 TOBN(0x3a926e29, 0x05f2c4ce), TOBN(0xbd2bdecb, 0x9856966c),
7985 TOBN(0x5d16ab3a, 0x85527015), TOBN(0x9f81609e, 0x4486c231),
7986 TOBN(0xd8b96b2c, 0xda350002), TOBN(0xbd054690, 0xfa1b7d36),
7987 TOBN(0xdc90ebf5, 0xe71d79bc), TOBN(0xf241b6f9, 0x08964e4e),
7988 TOBN(0x7c838643, 0x2fe3cd4c), TOBN(0xe0f33acb, 0xb4bc633c),
7989 TOBN(0xb4a9ecec, 0x3d139f1f), TOBN(0x05ce69cd, 0xdc4a1f49),
7990 TOBN(0xa19d1b16, 0xf5f98aaf), TOBN(0x45bb71d6, 0x6f23e0ef),
7991 TOBN(0x33789fcd, 0x46cdfdd3), TOBN(0x9b8e2978, 0xcee040ca),
7992 TOBN(0x9c69b246, 0xae0a6828), TOBN(0xba533d24, 0x7078d5aa),
7993 TOBN(0x7a2e42c0, 0x7bb4fbdb), TOBN(0xcfb4879a, 0x7035385c),
7994 TOBN(0x8c3dd30b, 0x3281705b), TOBN(0x7e361c6c, 0x404fe081),
7995 TOBN(0x7b21649c, 0x3f604edf), TOBN(0x5dbf6a3f, 0xe52ffe47),
7996 TOBN(0xc41b7c23, 0x4b54d9bf), TOBN(0x1374e681, 0x3511c3d9),
7997 TOBN(0x1863bf16, 0xc1b2b758), TOBN(0x90e78507, 0x1e9e6a96),
7998 TOBN(0xab4bf98d, 0x5d86f174), TOBN(0xd74e0bd3, 0x85e96fe4),
7999 TOBN(0x8afde39f, 0xcac5d344), TOBN(0x90946dbc, 0xbd91b847),
8000 TOBN(0xf5b42358, 0xfe1a838c), TOBN(0x05aae6c5, 0x620ac9d8),
8001 TOBN(0x8e193bd8, 0xa1ce5a0b), TOBN(0x8f710571, 0x4dabfd72),
8002 TOBN(0x8d8fdd48, 0x182caaac), TOBN(0x8c4aeefa, 0x040745cf),
8003 TOBN(0x73c6c30a, 0xf3b93e6d), TOBN(0x991241f3, 0x16f42011),
8004 TOBN(0xa0158eea, 0xe457a477), TOBN(0xd19857db, 0xee6ddc05),
8005 TOBN(0xb3265224, 0x18c41671), TOBN(0x3ffdfc7e, 0x3c2c0d58),
8006 TOBN(0x3a3a5254, 0x26ee7cda), TOBN(0x341b0869, 0xdf02c3a8),
8007 TOBN(0xa023bf42, 0x723bbfc8), TOBN(0x3d15002a, 0x14452691),
8008 },
8009 {
8010 TOBN(0x5ef7324c, 0x85edfa30), TOBN(0x25976554, 0x87d4f3da),
8011 TOBN(0x352f5bc0, 0xdcb50c86), TOBN(0x8f6927b0, 0x4832a96c),
8012 TOBN(0xd08ee1ba, 0x55f2f94c), TOBN(0x6a996f99, 0x344b45fa),
8013 TOBN(0xe133cb8d, 0xa8aa455d), TOBN(0x5d0721ec, 0x758dc1f7),
8014 TOBN(0x6ba7a920, 0x79e5fb67), TOBN(0xe1331feb, 0x70aa725e),
8015 TOBN(0x5080ccf5, 0x7df5d837), TOBN(0xe4cae01d, 0x7ff72e21),
8016 TOBN(0xd9243ee6, 0x0412a77d), TOBN(0x06ff7cac, 0xdf449025),
8017 TOBN(0xbe75f7cd, 0x23ef5a31), TOBN(0xbc957822, 0x0ddef7a8),
8018 TOBN(0x8cf7230c, 0xb0ce1c55), TOBN(0x5b534d05, 0x0bbfb607),
8019 TOBN(0xee1ef113, 0x0e16363b), TOBN(0x27e0aa7a, 0xb4999e82),
8020 TOBN(0xce1dac2d, 0x79362c41), TOBN(0x67920c90, 0x91bb6cb0),
8021 TOBN(0x1e648d63, 0x2223df24), TOBN(0x0f7d9eef, 0xe32e8f28),
8022 TOBN(0x6943f39a, 0xfa833834), TOBN(0x22951722, 0xa6328562),
8023 TOBN(0x81d63dd5, 0x4170fc10), TOBN(0x9f5fa58f, 0xaecc2e6d),
8024 TOBN(0xb66c8725, 0xe77d9a3b), TOBN(0x11235cea, 0x6384ebe0),
8025 TOBN(0x06a8c118, 0x5845e24a), TOBN(0x0137b286, 0xebd093b1),
8026 TOBN(0xc589e1ce, 0x44ace150), TOBN(0xe0f8d3d9, 0x4381e97c),
8027 TOBN(0x59e99b11, 0x62c5a4b8), TOBN(0x90d262f7, 0xfd0ec9f9),
8028 TOBN(0xfbc854c9, 0x283e13c9), TOBN(0x2d04fde7, 0xaedc7085),
8029 TOBN(0x057d7765, 0x47dcbecb), TOBN(0x8dbdf591, 0x9a76fa5f),
8030 TOBN(0xd0150695, 0x0de1e578), TOBN(0x2e1463e7, 0xe9f72bc6),
8031 TOBN(0xffa68441, 0x1b39eca5), TOBN(0x673c8530, 0x7c037f2f),
8032 TOBN(0xd0d6a600, 0x747f91da), TOBN(0xb08d43e1, 0xc9cb78e9),
8033 TOBN(0x0fc0c644, 0x27b5cef5), TOBN(0x5c1d160a, 0xa60a2fd6),
8034 TOBN(0xf98cae53, 0x28c8e13b), TOBN(0x375f10c4, 0xb2eddcd1),
8035 TOBN(0xd4eb8b7f, 0x5cce06ad), TOBN(0xb4669f45, 0x80a2e1ef),
8036 TOBN(0xd593f9d0, 0x5bbd8699), TOBN(0x5528a4c9, 0xe7976d13),
8037 TOBN(0x3923e095, 0x1c7e28d3), TOBN(0xb9293790, 0x3f6bb577),
8038 TOBN(0xdb567d6a, 0xc42bd6d2), TOBN(0x6df86468, 0xbb1f96ae),
8039 TOBN(0x0efe5b1a, 0x4843b28e), TOBN(0x961bbb05, 0x6379b240),
8040 TOBN(0xb6caf5f0, 0x70a6a26b), TOBN(0x70686c0d, 0x328e6e39),
8041 TOBN(0x80da06cf, 0x895fc8d3), TOBN(0x804d8810, 0xb363fdc9),
8042 TOBN(0xbe22877b, 0x207f1670), TOBN(0x9b0dd188, 0x4e615291),
8043 TOBN(0x625ae8dc, 0x97a3c2bf), TOBN(0x08584ef7, 0x439b86e8),
8044 TOBN(0xde7190a5, 0xdcd898ff), TOBN(0x26286c40, 0x2058ee3d),
8045 TOBN(0x3db0b217, 0x5f87b1c1), TOBN(0xcc334771, 0x102a6db5),
8046 TOBN(0xd99de954, 0x2f770fb1), TOBN(0x97c1c620, 0x4cd7535e),
8047 TOBN(0xd3b6c448, 0x3f09cefc), TOBN(0xd725af15, 0x5a63b4f8),
8048 TOBN(0x0c95d24f, 0xc01e20ec), TOBN(0xdfd37494, 0x9ae7121f),
8049 TOBN(0x7d6ddb72, 0xec77b7ec), TOBN(0xfe079d3b, 0x0353a4ae),
8050 TOBN(0x3066e70a, 0x2e6ac8d2), TOBN(0x9c6b5a43, 0x106e5c05),
8051 TOBN(0x52d3c6f5, 0xede59b8c), TOBN(0x30d6a5c3, 0xfccec9ae),
8052 TOBN(0xedec7c22, 0x4fc0a9ef), TOBN(0x190ff083, 0x95c16ced),
8053 TOBN(0xbe12ec8f, 0x94de0fde), TOBN(0x0d131ab8, 0x852d3433),
8054 TOBN(0x42ace07e, 0x85701291), TOBN(0x94793ed9, 0x194061a8),
8055 TOBN(0x30e83ed6, 0xd7f4a485), TOBN(0x9eec7269, 0xf9eeff4d),
8056 TOBN(0x90acba59, 0x0c9d8005), TOBN(0x5feca458, 0x1e79b9d1),
8057 TOBN(0x8fbe5427, 0x1d506a1e), TOBN(0xa32b2c8e, 0x2439cfa7),
8058 TOBN(0x1671c173, 0x73dd0b4e), TOBN(0x37a28214, 0x44a054c6),
8059 TOBN(0x81760a1b, 0x4e8b53f1), TOBN(0xa6c04224, 0xf9f93b9e),
8060 TOBN(0x18784b34, 0xcf671e3c), TOBN(0x81bbecd2, 0xcda9b994),
8061 TOBN(0x38831979, 0xb2ab3848), TOBN(0xef54feb7, 0xf2e03c2d),
8062 TOBN(0xcf197ca7, 0xfb8088fa), TOBN(0x01427247, 0x4ddc96c5),
8063 TOBN(0xa2d2550a, 0x30777176), TOBN(0x53469898, 0x4d0cf71d),
8064 TOBN(0x6ce937b8, 0x3a2aaac6), TOBN(0xe9f91dc3, 0x5af38d9b),
8065 TOBN(0x2598ad83, 0xc8bf2899), TOBN(0x8e706ac9, 0xb5536c16),
8066 TOBN(0x40dc7495, 0xf688dc98), TOBN(0x26490cd7, 0x124c4afc),
8067 TOBN(0xe651ec84, 0x1f18775c), TOBN(0x393ea6c3, 0xb4fdaf4a),
8068 TOBN(0x1e1f3343, 0x7f338e0d), TOBN(0x39fb832b, 0x6053e7b5),
8069 TOBN(0x46e702da, 0x619e14d5), TOBN(0x859cacd1, 0xcdeef6e0),
8070 TOBN(0x63b99ce7, 0x4462007d), TOBN(0xb8ab48a5, 0x4cb5f5b7),
8071 TOBN(0x9ec673d2, 0xf55edde7), TOBN(0xd1567f74, 0x8cfaefda),
8072 TOBN(0x46381b6b, 0x0887bcec), TOBN(0x694497ce, 0xe178f3c2),
8073 TOBN(0x5e6525e3, 0x1e6266cb), TOBN(0x5931de26, 0x697d6413),
8074 TOBN(0x87f8df7c, 0x0e58d493), TOBN(0xb1ae5ed0, 0x58b73f12),
8075 TOBN(0xc368f784, 0xdea0c34d), TOBN(0x9bd0a120, 0x859a91a0),
8076 TOBN(0xb00d88b7, 0xcc863c68), TOBN(0x3a1cc11e, 0x3d1f4d65),
8077 TOBN(0xea38e0e7, 0x0aa85593), TOBN(0x37f13e98, 0x7dc4aee8),
8078 TOBN(0x10d38667, 0xbc947bad), TOBN(0x738e07ce, 0x2a36ee2e),
8079 TOBN(0xc93470cd, 0xc577fcac), TOBN(0xdee1b616, 0x2782470d),
8080 TOBN(0x36a25e67, 0x2e793d12), TOBN(0xd6aa6cae, 0xe0f186da),
8081 TOBN(0x474d0fd9, 0x80e07af7), TOBN(0xf7cdc47d, 0xba8a5cd4),
8082 TOBN(0x28af6d9d, 0xab15247f), TOBN(0x7c789c10, 0x493a537f),
8083 TOBN(0x7ac9b110, 0x23a334e7), TOBN(0x0236ac09, 0x12c9c277),
8084 TOBN(0xa7e5bd25, 0x1d7a5144), TOBN(0x098b9c2a, 0xf13ec4ec),
8085 TOBN(0x3639daca, 0xd3f0abca), TOBN(0x642da81a, 0xa23960f9),
8086 TOBN(0x7d2e5c05, 0x4f7269b1), TOBN(0xfcf30777, 0xe287c385),
8087 TOBN(0x10edc84f, 0xf2a46f21), TOBN(0x35441757, 0x4f43fa36),
8088 TOBN(0xf1327899, 0xfd703431), TOBN(0xa438d7a6, 0x16dd587a),
8089 TOBN(0x65c34c57, 0xe9c8352d), TOBN(0xa728edab, 0x5cc5a24e),
8090 TOBN(0xaed78abc, 0x42531689), TOBN(0x0a51a0e8, 0x010963ef),
8091 TOBN(0x5776fa0a, 0xd717d9b3), TOBN(0xf356c239, 0x7dd3428b),
8092 TOBN(0x29903fff, 0x8d3a3dac), TOBN(0x409597fa, 0x3d94491f),
8093 TOBN(0x4cd7a5ff, 0xbf4a56a4), TOBN(0xe5096474, 0x8adab462),
8094 TOBN(0xa97b5126, 0x5c3427b0), TOBN(0x6401405c, 0xd282c9bd),
8095 TOBN(0x3629f8d7, 0x222c5c45), TOBN(0xb1c02c16, 0xe8d50aed),
8096 TOBN(0xbea2ed75, 0xd9635bc9), TOBN(0x226790c7, 0x6e24552f),
8097 TOBN(0x3c33f2a3, 0x65f1d066), TOBN(0x2a43463e, 0x6dfccc2e),
8098 TOBN(0x8cc3453a, 0xdb483761), TOBN(0xe7cc6085, 0x65d5672b),
8099 TOBN(0x277ed6cb, 0xde3efc87), TOBN(0x19f2f368, 0x69234eaf),
8100 TOBN(0x9aaf4317, 0x5c0b800b), TOBN(0x1f1e7c89, 0x8b6da6e2),
8101 TOBN(0x6cfb4715, 0xb94ec75e), TOBN(0xd590dd5f, 0x453118c2),
8102 TOBN(0x14e49da1, 0x1f17a34c), TOBN(0x5420ab39, 0x235a1456),
8103 TOBN(0xb7637241, 0x2f50363b), TOBN(0x7b15d623, 0xc3fabb6e),
8104 TOBN(0xa0ef40b1, 0xe274e49c), TOBN(0x5cf50744, 0x96b1860a),
8105 TOBN(0xd6583fbf, 0x66afe5a4), TOBN(0x44240510, 0xf47e3e9a),
8106 TOBN(0x99254343, 0x11b2d595), TOBN(0xf1367499, 0xeec8df57),
8107 TOBN(0x3cb12c61, 0x3e73dd05), TOBN(0xd248c033, 0x7dac102a),
8108 TOBN(0xcf154f13, 0xa77739f5), TOBN(0xbf4288cb, 0x23d2af42),
8109 TOBN(0xaa64c9b6, 0x32e4a1cf), TOBN(0xee8c07a8, 0xc8a208f3),
8110 TOBN(0xe10d4999, 0x6fe8393f), TOBN(0x0f809a3f, 0xe91f3a32),
8111 TOBN(0x61096d1c, 0x802f63c8), TOBN(0x289e1462, 0x57750d3d),
8112 TOBN(0xed06167e, 0x9889feea), TOBN(0xd5c9c0e2, 0xe0993909),
8113 TOBN(0x46fca0d8, 0x56508ac6), TOBN(0x91826047, 0x4f1b8e83),
8114 TOBN(0x4f2c877a, 0x9a4a2751), TOBN(0x71bd0072, 0xcae6fead),
8115 TOBN(0x38df8dcc, 0x06aa1941), TOBN(0x5a074b4c, 0x63beeaa8),
8116 TOBN(0xd6d65934, 0xc1cec8ed), TOBN(0xa6ecb49e, 0xaabc03bd),
8117 TOBN(0xaade91c2, 0xde8a8415), TOBN(0xcfb0efdf, 0x691136e0),
8118 TOBN(0x11af45ee, 0x23ab3495), TOBN(0xa132df88, 0x0b77463d),
8119 TOBN(0x8923c15c, 0x815d06f4), TOBN(0xc3ceb3f5, 0x0d61a436),
8120 TOBN(0xaf52291d, 0xe88fb1da), TOBN(0xea057974, 0x1da12179),
8121 TOBN(0xb0d7218c, 0xd2fef720), TOBN(0x6c0899c9, 0x8e1d8845),
8122 TOBN(0x98157504, 0x752ddad7), TOBN(0xd60bd74f, 0xa1a68a97),
8123 TOBN(0x7047a3a9, 0xf658fb99), TOBN(0x1f5d86d6, 0x5f8511e4),
8124 TOBN(0xb8a4bc42, 0x4b5a6d88), TOBN(0x69eb2c33, 0x1abefa7d),
8125 TOBN(0x95bf39e8, 0x13c9c510), TOBN(0xf571960a, 0xd48aab43),
8126 TOBN(0x7e8cfbcf, 0x704e23c6), TOBN(0xc71b7d22, 0x28aaa65b),
8127 TOBN(0xa041b2bd, 0x245e3c83), TOBN(0x69b98834, 0xd21854ff),
8128 TOBN(0x89d227a3, 0x963bfeec), TOBN(0x99947aaa, 0xde7da7cb),
8129 TOBN(0x1d9ee9db, 0xee68a9b1), TOBN(0x0a08f003, 0x698ec368),
8130 TOBN(0xe9ea4094, 0x78ef2487), TOBN(0xc8d2d415, 0x02cfec26),
8131 TOBN(0xc52f9a6e, 0xb7dcf328), TOBN(0x0ed489e3, 0x85b6a937),
8132 TOBN(0x9b94986b, 0xbef3366e), TOBN(0x0de59c70, 0xedddddb8),
8133 TOBN(0xffdb748c, 0xeadddbe2), TOBN(0x9b9784bb, 0x8266ea40),
8134 TOBN(0x142b5502, 0x1a93507a), TOBN(0xb4cd1187, 0x8d3c06cf),
8135 TOBN(0xdf70e76a, 0x91ec3f40), TOBN(0x484e81ad, 0x4e7553c2),
8136 TOBN(0x830f87b5, 0x272e9d6e), TOBN(0xea1c93e5, 0xc6ff514a),
8137 TOBN(0x67cc2adc, 0xc4192a8e), TOBN(0xc77e27e2, 0x42f4535a),
8138 TOBN(0x9cdbab36, 0xd2b713c5), TOBN(0x86274ea0, 0xcf7b0cd3),
8139 TOBN(0x784680f3, 0x09af826b), TOBN(0xbfcc837a, 0x0c72dea3),
8140 TOBN(0xa8bdfe9d, 0xd6529b73), TOBN(0x708aa228, 0x63a88002),
8141 TOBN(0x6c7a9a54, 0xc91d45b9), TOBN(0xdf1a38bb, 0xfd004f56),
8142 TOBN(0x2e8c9a26, 0xb8bad853), TOBN(0x2d52cea3, 0x3723eae7),
8143 TOBN(0x054d6d81, 0x56ca2830), TOBN(0xa3317d14, 0x9a8dc411),
8144 TOBN(0xa08662fe, 0xfd4ddeda), TOBN(0xed2a153a, 0xb55d792b),
8145 TOBN(0x7035c16a, 0xbfc6e944), TOBN(0xb6bc5834, 0x00171cf3),
8146 TOBN(0xe27152b3, 0x83d102b6), TOBN(0xfe695a47, 0x0646b848),
8147 TOBN(0xa5bb09d8, 0x916e6d37), TOBN(0xb4269d64, 0x0d17015e),
8148 TOBN(0x8d8156a1, 0x0a1d2285), TOBN(0xfeef6c51, 0x46d26d72),
8149 TOBN(0x9dac57c8, 0x4c5434a7), TOBN(0x0282e5be, 0x59d39e31),
8150 TOBN(0xedfff181, 0x721c486d), TOBN(0x301baf10, 0xbc58824e),
8151 TOBN(0x8136a6aa, 0x00570031), TOBN(0x55aaf78c, 0x1cddde68),
8152 TOBN(0x26829371, 0x59c63952), TOBN(0x3a3bd274, 0x8bc25baf),
8153 TOBN(0xecdf8657, 0xb7e52dc3), TOBN(0x2dd8c087, 0xfd78e6c8),
8154 TOBN(0x20553274, 0xf5531461), TOBN(0x8b4a1281, 0x5d95499b),
8155 TOBN(0xe2c8763a, 0x1a80f9d2), TOBN(0xd1dbe32b, 0x4ddec758),
8156 TOBN(0xaf12210d, 0x30c34169), TOBN(0xba74a953, 0x78baa533),
8157 TOBN(0x3d133c6e, 0xa438f254), TOBN(0xa431531a, 0x201bef5b),
8158 TOBN(0x15295e22, 0xf669d7ec), TOBN(0xca374f64, 0x357fb515),
8159 TOBN(0x8a8406ff, 0xeaa3fdb3), TOBN(0x106ae448, 0xdf3f2da8),
8160 TOBN(0x8f9b0a90, 0x33c8e9a1), TOBN(0x234645e2, 0x71ad5885),
8161 TOBN(0x3d083224, 0x1c0aed14), TOBN(0xf10a7d3e, 0x7a942d46),
8162 TOBN(0x7c11deee, 0x40d5c9be), TOBN(0xb2bae7ff, 0xba84ed98),
8163 TOBN(0x93e97139, 0xaad58ddd), TOBN(0x3d872796, 0x3f6d1fa3),
8164 TOBN(0x483aca81, 0x8569ff13), TOBN(0x8b89a5fb, 0x9a600f72),
8165 TOBN(0x4cbc27c3, 0xc06f2b86), TOBN(0x22130713, 0x63ad9c0b),
8166 TOBN(0xb5358b1e, 0x48ac2840), TOBN(0x18311294, 0xecba9477),
8167 TOBN(0xda58f990, 0xa6946b43), TOBN(0x3098baf9, 0x9ab41819),
8168 TOBN(0x66c4c158, 0x4198da52), TOBN(0xab4fc17c, 0x146bfd1b),
8169 TOBN(0x2f0a4c3c, 0xbf36a908), TOBN(0x2ae9e34b, 0x58cf7838),
8170 TOBN(0xf411529e, 0x3fa11b1f), TOBN(0x21e43677, 0x974af2b4),
8171 TOBN(0x7c20958e, 0xc230793b), TOBN(0x710ea885, 0x16e840f3),
8172 TOBN(0xfc0b21fc, 0xc5dc67cf), TOBN(0x08d51647, 0x88405718),
8173 TOBN(0xd955c21f, 0xcfe49eb7), TOBN(0x9722a5d5, 0x56dd4a1f),
8174 TOBN(0xc9ef50e2, 0xc861baa5), TOBN(0xc0c21a5d, 0x9505ac3e),
8175 TOBN(0xaf6b9a33, 0x8b7c063f), TOBN(0xc6370339, 0x2f4779c1),
8176 TOBN(0x22df99c7, 0x638167c3), TOBN(0xfe6ffe76, 0x795db30c),
8177 TOBN(0x2b822d33, 0xa4854989), TOBN(0xfef031dd, 0x30563aa5),
8178 TOBN(0x16b09f82, 0xd57c667f), TOBN(0xc70312ce, 0xcc0b76f1),
8179 TOBN(0xbf04a9e6, 0xc9118aec), TOBN(0x82fcb419, 0x3409d133),
8180 TOBN(0x1a8ab385, 0xab45d44d), TOBN(0xfba07222, 0x617b83a3),
8181 TOBN(0xb05f50dd, 0x58e81b52), TOBN(0x1d8db553, 0x21ce5aff),
8182 TOBN(0x3097b8d4, 0xe344a873), TOBN(0x7d8d116d, 0xfe36d53e),
8183 TOBN(0x6db22f58, 0x7875e750), TOBN(0x2dc5e373, 0x43e144ea),
8184 TOBN(0xc05f32e6, 0xe799eb95), TOBN(0xe9e5f4df, 0x6899e6ec),
8185 TOBN(0xbdc3bd68, 0x1fab23d5), TOBN(0xb72b8ab7, 0x73af60e6),
8186 TOBN(0x8db27ae0, 0x2cecc84a), TOBN(0x600016d8, 0x7bdb871c),
8187 TOBN(0x42a44b13, 0xd7c46f58), TOBN(0xb8919727, 0xc3a77d39),
8188 TOBN(0xcfc6bbbd, 0xdafd6088), TOBN(0x1a740146, 0x6bd20d39),
8189 TOBN(0x8c747abd, 0x98c41072), TOBN(0x4c91e765, 0xbdf68ea1),
8190 TOBN(0x7c95e5ca, 0x08819a78), TOBN(0xcf48b729, 0xc9587921),
8191 TOBN(0x091c7c5f, 0xdebbcc7d), TOBN(0x6f287404, 0xf0e05149),
8192 TOBN(0xf83b5ac2, 0x26cd44ec), TOBN(0x88ae32a6, 0xcfea250e),
8193 TOBN(0x6ac5047a, 0x1d06ebc5), TOBN(0xc7e550b4, 0xd434f781),
8194 TOBN(0x61ab1cf2, 0x5c727bd2), TOBN(0x2e4badb1, 0x1cf915b0),
8195 TOBN(0x1b4dadec, 0xf69d3920), TOBN(0xe61b1ca6, 0xf14c1dfe),
8196 TOBN(0x90b479cc, 0xbd6bd51f), TOBN(0x8024e401, 0x8045ec30),
8197 TOBN(0xcab29ca3, 0x25ef0e62), TOBN(0x4f2e9416, 0x49e4ebc0),
8198 TOBN(0x45eb40ec, 0x0ccced58), TOBN(0x25cd4b9c, 0x0da44f98),
8199 TOBN(0x43e06458, 0x871812c6), TOBN(0x99f80d55, 0x16cef651),
8200 TOBN(0x571340c9, 0xce6dc153), TOBN(0x138d5117, 0xd8665521),
8201 TOBN(0xacdb45bc, 0x4e07014d), TOBN(0x2f34bb38, 0x84b60b91),
8202 TOBN(0xf44a4fd2, 0x2ae8921e), TOBN(0xb039288e, 0x892ba1e2),
8203 TOBN(0x9da50174, 0xb1c180b2), TOBN(0x6b70ab66, 0x1693dc87),
8204 TOBN(0x7e9babc9, 0xe7057481), TOBN(0x4581ddef, 0x9c80dc41),
8205 TOBN(0x0c890da9, 0x51294682), TOBN(0x0b5629d3, 0x3f4736e5),
8206 TOBN(0x2340c79e, 0xb06f5b41), TOBN(0xa42e84ce, 0x4e243469),
8207 TOBN(0xf9a20135, 0x045a71a9), TOBN(0xefbfb415, 0xd27b6fb6),
8208 TOBN(0x25ebea23, 0x9d33cd6f), TOBN(0x9caedb88, 0xaa6c0af8),
8209 TOBN(0x53dc7e9a, 0xd9ce6f96), TOBN(0x3897f9fd, 0x51e0b15a),
8210 TOBN(0xf51cb1f8, 0x8e5d788e), TOBN(0x1aec7ba8, 0xe1d490ee),
8211 TOBN(0x265991e0, 0xcc58cb3c), TOBN(0x9f306e8c, 0x9fc3ad31),
8212 TOBN(0x5fed006e, 0x5040a0ac), TOBN(0xca9d5043, 0xfb476f2e),
8213 TOBN(0xa19c06e8, 0xbeea7a23), TOBN(0xd2865801, 0x0edabb63),
8214 TOBN(0xdb92293f, 0x6967469a), TOBN(0x2894d839, 0x8d8a8ed8),
8215 TOBN(0x87c9e406, 0xbbc77122), TOBN(0x8671c6f1, 0x2ea3a26a),
8216 TOBN(0xe42df8d6, 0xd7de9853), TOBN(0x2e3ce346, 0xb1f2bcc7),
8217 TOBN(0xda601dfc, 0x899d50cf), TOBN(0xbfc913de, 0xfb1b598f),
8218 TOBN(0x81c4909f, 0xe61f7908), TOBN(0x192e304f, 0x9bbc7b29),
8219 TOBN(0xc3ed8738, 0xc104b338), TOBN(0xedbe9e47, 0x783f5d61),
8220 TOBN(0x0c06e9be, 0x2db30660), TOBN(0xda3e613f, 0xc0eb7d8e),
8221 TOBN(0xd8fa3e97, 0x322e096e), TOBN(0xfebd91e8, 0xd336e247),
8222 TOBN(0x8f13ccc4, 0xdf655a49), TOBN(0xa9e00dfc, 0x5eb20210),
8223 TOBN(0x84631d0f, 0xc656b6ea), TOBN(0x93a058cd, 0xd8c0d947),
8224 TOBN(0x6846904a, 0x67bd3448), TOBN(0x4a3d4e1a, 0xf394fd5c),
8225 TOBN(0xc102c1a5, 0xdb225f52), TOBN(0xe3455bba, 0xfc4f5e9a),
8226 TOBN(0x6b36985b, 0x4b9ad1ce), TOBN(0xa9818536, 0x5bb7f793),
8227 TOBN(0x6c25e1d0, 0x48b1a416), TOBN(0x1381dd53, 0x3c81bee7),
8228 TOBN(0xd2a30d61, 0x7a4a7620), TOBN(0xc8412926, 0x39b8944c),
8229 TOBN(0x3c1c6fbe, 0x7a97c33a), TOBN(0x941e541d, 0x938664e7),
8230 TOBN(0x417499e8, 0x4a34f239), TOBN(0x15fdb83c, 0xb90402d5),
8231 TOBN(0xb75f46bf, 0x433aa832), TOBN(0xb61e15af, 0x63215db1),
8232 TOBN(0xaabe59d4, 0xa127f89a), TOBN(0x5d541e0c, 0x07e816da),
8233 TOBN(0xaaba0659, 0xa618b692), TOBN(0x55327733, 0x17266026),
8234 TOBN(0xaf53a0fc, 0x95f57552), TOBN(0x32947650, 0x6cacb0c9),
8235 TOBN(0x253ff58d, 0xc821be01), TOBN(0xb0309531, 0xa06f1146),
8236 TOBN(0x59bbbdf5, 0x05c2e54d), TOBN(0x158f27ad, 0x26e8dd22),
8237 TOBN(0xcc5b7ffb, 0x397e1e53), TOBN(0xae03f65b, 0x7fc1e50d),
8238 TOBN(0xa9784ebd, 0x9c95f0f9), TOBN(0x5ed9deb2, 0x24640771),
8239 TOBN(0x31244af7, 0x035561c4), TOBN(0x87332f3a, 0x7ee857de),
8240 TOBN(0x09e16e9e, 0x2b9e0d88), TOBN(0x52d910f4, 0x56a06049),
8241 TOBN(0x507ed477, 0xa9592f48), TOBN(0x85cb917b, 0x2365d678),
8242 TOBN(0xf8511c93, 0x4c8998d1), TOBN(0x2186a3f1, 0x730ea58f),
8243 TOBN(0x50189626, 0xb2029db0), TOBN(0x9137a6d9, 0x02ceb75a),
8244 TOBN(0x2fe17f37, 0x748bc82c), TOBN(0x87c2e931, 0x80469f8c),
8245 TOBN(0x850f71cd, 0xbf891aa2), TOBN(0x0ca1b89b, 0x75ec3d8d),
8246 TOBN(0x516c43aa, 0x5e1cd3cd), TOBN(0x89397808, 0x9a887c28),
8247 TOBN(0x0059c699, 0xddea1f9f), TOBN(0x7737d6fa, 0x8e6868f7),
8248 TOBN(0x6d93746a, 0x60f1524b), TOBN(0x36985e55, 0xba052aa7),
8249 TOBN(0x41b1d322, 0xed923ea5), TOBN(0x3429759f, 0x25852a11),
8250 TOBN(0xbeca6ec3, 0x092e9f41), TOBN(0x3a238c66, 0x62256bbd),
8251 TOBN(0xd82958ea, 0x70ad487d), TOBN(0x4ac8aaf9, 0x65610d93),
8252 TOBN(0x3fa101b1, 0x5e4ccab0), TOBN(0x9bf430f2, 0x9de14bfb),
8253 TOBN(0xa10f5cc6, 0x6531899d), TOBN(0x590005fb, 0xea8ce17d),
8254 TOBN(0xc437912f, 0x24544cb6), TOBN(0x9987b71a, 0xd79ac2e3),
8255 TOBN(0x13e3d9dd, 0xc058a212), TOBN(0x00075aac, 0xd2de9606),
8256 TOBN(0x80ab508b, 0x6cac8369), TOBN(0x87842be7, 0xf54f6c89),
8257 TOBN(0xa7ad663d, 0x6bc532a4), TOBN(0x67813de7, 0x78a91bc8),
8258 TOBN(0x5dcb61ce, 0xc3427239), TOBN(0x5f3c7cf0, 0xc56934d9),
8259 TOBN(0xc079e0fb, 0xe3191591), TOBN(0xe40896bd, 0xb01aada7),
8260 TOBN(0x8d466791, 0x0492d25f), TOBN(0x8aeb30c9, 0xe7408276),
8261 TOBN(0xe9437495, 0x9287aacc), TOBN(0x23d4708d, 0x79fe03d4),
8262 TOBN(0x8cda9cf2, 0xd0c05199), TOBN(0x502fbc22, 0xfae78454),
8263 TOBN(0xc0bda9df, 0xf572a182), TOBN(0x5f9b71b8, 0x6158b372),
8264 TOBN(0xe0f33a59, 0x2b82dd07), TOBN(0x76302735, 0x9523032e),
8265 TOBN(0x7fe1a721, 0xc4505a32), TOBN(0x7b6e3e82, 0xf796409f),
8266 },
8267 {
8268 TOBN(0xe3417bc0, 0x35d0b34a), TOBN(0x440b386b, 0x8327c0a7),
8269 TOBN(0x8fb7262d, 0xac0362d1), TOBN(0x2c41114c, 0xe0cdf943),
8270 TOBN(0x2ba5cef1, 0xad95a0b1), TOBN(0xc09b37a8, 0x67d54362),
8271 TOBN(0x26d6cdd2, 0x01e486c9), TOBN(0x20477abf, 0x42ff9297),
8272 TOBN(0xa004dcb3, 0x292a9287), TOBN(0xddc15cf6, 0x77b092c7),
8273 TOBN(0x083a8464, 0x806c0605), TOBN(0x4a68df70, 0x3db997b0),
8274 TOBN(0x9c134e45, 0x05bf7dd0), TOBN(0xa4e63d39, 0x8ccf7f8c),
8275 TOBN(0xa6e6517f, 0x41b5f8af), TOBN(0xaa8b9342, 0xad7bc1cc),
8276 TOBN(0x126f35b5, 0x1e706ad9), TOBN(0xb99cebb4, 0xc3a9ebdf),
8277 TOBN(0xa75389af, 0xbf608d90), TOBN(0x76113c4f, 0xc6c89858),
8278 TOBN(0x80de8eb0, 0x97e2b5aa), TOBN(0x7e1022cc, 0x63b91304),
8279 TOBN(0x3bdab605, 0x6ccc066c), TOBN(0x33cbb144, 0xb2edf900),
8280 TOBN(0xc4176471, 0x7af715d2), TOBN(0xe2f7f594, 0xd0134a96),
8281 TOBN(0x2c1873ef, 0xa41ec956), TOBN(0xe4e7b4f6, 0x77821304),
8282 TOBN(0xe5c8ff97, 0x88d5374a), TOBN(0x2b915e63, 0x80823d5b),
8283 TOBN(0xea6bc755, 0xb2ee8fe2), TOBN(0x6657624c, 0xe7112651),
8284 TOBN(0x157af101, 0xdace5aca), TOBN(0xc4fdbcf2, 0x11a6a267),
8285 TOBN(0xdaddf340, 0xc49c8609), TOBN(0x97e49f52, 0xe9604a65),
8286 TOBN(0x9be8e790, 0x937e2ad5), TOBN(0x846e2508, 0x326e17f1),
8287 TOBN(0x3f38007a, 0x0bbbc0dc), TOBN(0xcf03603f, 0xb11e16d6),
8288 TOBN(0xd6f800e0, 0x7442f1d5), TOBN(0x475607d1, 0x66e0e3ab),
8289 TOBN(0x82807f16, 0xb7c64047), TOBN(0x8858e1e3, 0xa749883d),
8290 TOBN(0x5859120b, 0x8231ee10), TOBN(0x1b80e7eb, 0x638a1ece),
8291 TOBN(0xcb72525a, 0xc6aa73a4), TOBN(0xa7cdea3d, 0x844423ac),
8292 TOBN(0x5ed0c007, 0xf8ae7c38), TOBN(0x6db07a5c, 0x3d740192),
8293 TOBN(0xbe5e9c2a, 0x5fe36db3), TOBN(0xd5b9d57a, 0x76e95046),
8294 TOBN(0x54ac32e7, 0x8eba20f2), TOBN(0xef11ca8f, 0x71b9a352),
8295 TOBN(0x305e373e, 0xff98a658), TOBN(0xffe5a100, 0x823eb667),
8296 TOBN(0x57477b11, 0xe51732d2), TOBN(0xdfd6eb28, 0x2538fc0e),
8297 TOBN(0x5c43b0cc, 0x3b39eec5), TOBN(0x6af12778, 0xcb36cc57),
8298 TOBN(0x70b0852d, 0x06c425ae), TOBN(0x6df92f8c, 0x5c221b9b),
8299 TOBN(0x6c8d4f9e, 0xce826d9c), TOBN(0xf59aba7b, 0xb49359c3),
8300 TOBN(0x5c8ed8d5, 0xda64309d), TOBN(0x61a6de56, 0x91b30704),
8301 TOBN(0xd6b52f6a, 0x2f9b5808), TOBN(0x0eee4194, 0x98c958a7),
8302 TOBN(0xcddd9aab, 0x771e4caa), TOBN(0x83965dfd, 0x78bc21be),
8303 TOBN(0x02affce3, 0xb3b504f5), TOBN(0x30847a21, 0x561c8291),
8304 TOBN(0xd2eb2cf1, 0x52bfda05), TOBN(0xe0e4c4e9, 0x6197b98c),
8305 TOBN(0x1d35076c, 0xf8a1726f), TOBN(0x6c06085b, 0x2db11e3d),
8306 TOBN(0x15c0c4d7, 0x4463ba14), TOBN(0x9d292f83, 0x0030238c),
8307 TOBN(0x1311ee8b, 0x3727536d), TOBN(0xfeea86ef, 0xbeaedc1e),
8308 TOBN(0xb9d18cd3, 0x66131e2e), TOBN(0xf31d974f, 0x80fe2682),
8309 TOBN(0xb6e49e0f, 0xe4160289), TOBN(0x7c48ec0b, 0x08e92799),
8310 TOBN(0x818111d8, 0xd1989aa7), TOBN(0xb34fa0aa, 0xebf926f9),
8311 TOBN(0xdb5fe2f5, 0xa245474a), TOBN(0xf80a6ebb, 0x3c7ca756),
8312 TOBN(0xa7f96054, 0xafa05dd8), TOBN(0x26dfcf21, 0xfcaf119e),
8313 TOBN(0xe20ef2e3, 0x0564bb59), TOBN(0xef4dca50, 0x61cb02b8),
8314 TOBN(0xcda7838a, 0x65d30672), TOBN(0x8b08d534, 0xfd657e86),
8315 TOBN(0x4c5b4395, 0x46d595c8), TOBN(0x39b58725, 0x425cb836),
8316 TOBN(0x8ea61059, 0x3de9abe3), TOBN(0x40434881, 0x9cdc03be),
8317 TOBN(0x9b261245, 0xcfedce8c), TOBN(0x78c318b4, 0xcf5234a1),
8318 TOBN(0x510bcf16, 0xfde24c99), TOBN(0x2a77cb75, 0xa2c2ff5d),
8319 TOBN(0x9c895c2b, 0x27960fb4), TOBN(0xd30ce975, 0xb0eda42b),
8320 TOBN(0xfda85393, 0x1a62cc26), TOBN(0x23c69b96, 0x50c0e052),
8321 TOBN(0xa227df15, 0xbfc633f3), TOBN(0x2ac78848, 0x1bae7d48),
8322 TOBN(0x487878f9, 0x187d073d), TOBN(0x6c2be919, 0x967f807d),
8323 TOBN(0x765861d8, 0x336e6d8f), TOBN(0x88b8974c, 0xce528a43),
8324 TOBN(0x09521177, 0xff57d051), TOBN(0x2ff38037, 0xfb6a1961),
8325 TOBN(0xfc0aba74, 0xa3d76ad4), TOBN(0x7c764803, 0x25a7ec17),
8326 TOBN(0x7532d75f, 0x48879bc8), TOBN(0xea7eacc0, 0x58ce6bc1),
8327 TOBN(0xc82176b4, 0x8e896c16), TOBN(0x9a30e0b2, 0x2c750fed),
8328 TOBN(0xc37e2c2e, 0x421d3aa4), TOBN(0xf926407c, 0xe84fa840),
8329 TOBN(0x18abc03d, 0x1454e41c), TOBN(0x26605ecd, 0x3f7af644),
8330 TOBN(0x242341a6, 0xd6a5eabf), TOBN(0x1edb84f4, 0x216b668e),
8331 TOBN(0xd836edb8, 0x04010102), TOBN(0x5b337ce7, 0x945e1d8c),
8332 TOBN(0xd2075c77, 0xc055dc14), TOBN(0x2a0ffa25, 0x81d89cdf),
8333 TOBN(0x8ce815ea, 0x6ffdcbaf), TOBN(0xa3428878, 0xfb648867),
8334 TOBN(0x277699cf, 0x884655fb), TOBN(0xfa5b5bd6, 0x364d3e41),
8335 TOBN(0x01f680c6, 0x441e1cb7), TOBN(0x3fd61e66, 0xb70a7d67),
8336 TOBN(0x666ba2dc, 0xcc78cf66), TOBN(0xb3018174, 0x6fdbff77),
8337 TOBN(0x8d4dd0db, 0x168d4668), TOBN(0x259455d0, 0x1dab3a2a),
8338 TOBN(0xf58564c5, 0xcde3acec), TOBN(0x77141925, 0x13adb276),
8339 TOBN(0x527d725d, 0x8a303f65), TOBN(0x55deb6c9, 0xe6f38f7b),
8340 TOBN(0xfd5bb657, 0xb1fa70fb), TOBN(0xfa07f50f, 0xd8073a00),
8341 TOBN(0xf72e3aa7, 0xbca02500), TOBN(0xf68f895d, 0x9975740d),
8342 TOBN(0x30112060, 0x5cae2a6a), TOBN(0x01bd7218, 0x02874842),
8343 TOBN(0x3d423891, 0x7ce47bd3), TOBN(0xa66663c1, 0x789544f6),
8344 TOBN(0x864d05d7, 0x3272d838), TOBN(0xe22924f9, 0xfa6295c5),
8345 TOBN(0x8189593f, 0x6c2fda32), TOBN(0x330d7189, 0xb184b544),
8346 TOBN(0x79efa62c, 0xbde1f714), TOBN(0x35771c94, 0xe5cb1a63),
8347 TOBN(0x2f4826b8, 0x641c8332), TOBN(0x00a894fb, 0xc8cee854),
8348 TOBN(0xb4b9a39b, 0x36194d40), TOBN(0xe857a7c5, 0x77612601),
8349 TOBN(0xf4209dd2, 0x4ecf2f58), TOBN(0x82b9e66d, 0x5a033487),
8350 TOBN(0xc1e36934, 0xe4e8b9dd), TOBN(0xd2372c9d, 0xa42377d7),
8351 TOBN(0x51dc94c7, 0x0e3ae43b), TOBN(0x4c57761e, 0x04474f6f),
8352 TOBN(0xdcdacd0a, 0x1058a318), TOBN(0x369cf3f5, 0x78053a9a),
8353 TOBN(0xc6c3de50, 0x31c68de2), TOBN(0x4653a576, 0x3c4b6d9f),
8354 TOBN(0x1688dd5a, 0xaa4e5c97), TOBN(0x5be80aa1, 0xb7ab3c74),
8355 TOBN(0x70cefe7c, 0xbc65c283), TOBN(0x57f95f13, 0x06867091),
8356 TOBN(0xa39114e2, 0x4415503b), TOBN(0xc08ff7c6, 0x4cbb17e9),
8357 TOBN(0x1eff674d, 0xd7dec966), TOBN(0x6d4690af, 0x53376f63),
8358 TOBN(0xff6fe32e, 0xea74237b), TOBN(0xc436d17e, 0xcd57508e),
8359 TOBN(0x15aa28e1, 0xedcc40fe), TOBN(0x0d769c04, 0x581bbb44),
8360 TOBN(0xc240b6de, 0x34eaacda), TOBN(0xd9e116e8, 0x2ba0f1de),
8361 TOBN(0xcbe45ec7, 0x79438e55), TOBN(0x91787c9d, 0x96f752d7),
8362 TOBN(0x897f532b, 0xf129ac2f), TOBN(0xd307b7c8, 0x5a36e22c),
8363 TOBN(0x91940675, 0x749fb8f3), TOBN(0xd14f95d0, 0x157fdb28),
8364 TOBN(0xfe51d029, 0x6ae55043), TOBN(0x8931e98f, 0x44a87de1),
8365 TOBN(0xe57f1cc6, 0x09e4fee2), TOBN(0x0d063b67, 0x4e072d92),
8366 TOBN(0x70a998b9, 0xed0e4316), TOBN(0xe74a736b, 0x306aca46),
8367 TOBN(0xecf0fbf2, 0x4fda97c7), TOBN(0xa40f65cb, 0x3e178d93),
8368 TOBN(0x16253604, 0x16df4285), TOBN(0xb0c9babb, 0xd0c56ae2),
8369 TOBN(0x73032b19, 0xcfc5cfc3), TOBN(0xe497e5c3, 0x09752056),
8370 TOBN(0x12096bb4, 0x164bda96), TOBN(0x1ee42419, 0xa0b74da1),
8371 TOBN(0x8fc36243, 0x403826ba), TOBN(0x0c8f0069, 0xdc09e660),
8372 TOBN(0x8667e981, 0xc27253c9), TOBN(0x05a6aefb, 0x92b36a45),
8373 TOBN(0xa62c4b36, 0x9cb7bb46), TOBN(0x8394f375, 0x11f7027b),
8374 TOBN(0x747bc79c, 0x5f109d0f), TOBN(0xcad88a76, 0x5b8cc60a),
8375 TOBN(0x80c5a66b, 0x58f09e68), TOBN(0xe753d451, 0xf6127eac),
8376 TOBN(0xc44b74a1, 0x5b0ec6f5), TOBN(0x47989fe4, 0x5289b2b8),
8377 TOBN(0x745f8484, 0x58d6fc73), TOBN(0xec362a6f, 0xf61c70ab),
8378 TOBN(0x070c98a7, 0xb3a8ad41), TOBN(0x73a20fc0, 0x7b63db51),
8379 TOBN(0xed2c2173, 0xf44c35f4), TOBN(0x8a56149d, 0x9acc9dca),
8380 TOBN(0x98f17881, 0x9ac6e0f4), TOBN(0x360fdeaf, 0xa413b5ed),
8381 TOBN(0x0625b8f4, 0xa300b0fd), TOBN(0xf1f4d76a, 0x5b3222d3),
8382 TOBN(0x9d6f5109, 0x587f76b8), TOBN(0x8b4ee08d, 0x2317fdb5),
8383 TOBN(0x88089bb7, 0x8c68b095), TOBN(0x95570e9a, 0x5808d9b9),
8384 TOBN(0xa395c36f, 0x35d33ae7), TOBN(0x200ea123, 0x50bb5a94),
8385 TOBN(0x20c789bd, 0x0bafe84b), TOBN(0x243ef52d, 0x0919276a),
8386 TOBN(0x3934c577, 0xe23ae233), TOBN(0xb93807af, 0xa460d1ec),
8387 TOBN(0xb72a53b1, 0xf8fa76a4), TOBN(0xd8914cb0, 0xc3ca4491),
8388 TOBN(0x2e128494, 0x3fb42622), TOBN(0x3b2700ac, 0x500907d5),
8389 TOBN(0xf370fb09, 0x1a95ec63), TOBN(0xf8f30be2, 0x31b6dfbd),
8390 TOBN(0xf2b2f8d2, 0x69e55f15), TOBN(0x1fead851, 0xcc1323e9),
8391 TOBN(0xfa366010, 0xd9e5eef6), TOBN(0x64d487b0, 0xe316107e),
8392 TOBN(0x4c076b86, 0xd23ddc82), TOBN(0x03fd344c, 0x7e0143f0),
8393 TOBN(0xa95362ff, 0x317af2c5), TOBN(0x0add3db7, 0xe18b7a4f),
8394 TOBN(0x9c673e3f, 0x8260e01b), TOBN(0xfbeb49e5, 0x54a1cc91),
8395 TOBN(0x91351bf2, 0x92f2e433), TOBN(0xc755e7ec, 0x851141eb),
8396 TOBN(0xc9a95139, 0x29607745), TOBN(0x0ca07420, 0xa26f2b28),
8397 TOBN(0xcb2790e7, 0x4bc6f9dd), TOBN(0x345bbb58, 0xadcaffc0),
8398 TOBN(0xc65ea38c, 0xbe0f27a2), TOBN(0x67c24d7c, 0x641fcb56),
8399 TOBN(0x2c25f0a7, 0xa9e2c757), TOBN(0x93f5cdb0, 0x16f16c49),
8400 TOBN(0x2ca5a9d7, 0xc5ee30a1), TOBN(0xd1593635, 0xb909b729),
8401 TOBN(0x804ce9f3, 0xdadeff48), TOBN(0xec464751, 0xb07c30c3),
8402 TOBN(0x89d65ff3, 0x9e49af6a), TOBN(0xf2d6238a, 0x6f3d01bc),
8403 TOBN(0x1095561e, 0x0bced843), TOBN(0x51789e12, 0xc8a13fd8),
8404 TOBN(0xd633f929, 0x763231df), TOBN(0x46df9f7d, 0xe7cbddef),
8405 TOBN(0x01c889c0, 0xcb265da8), TOBN(0xfce1ad10, 0xaf4336d2),
8406 TOBN(0x8d110df6, 0xfc6a0a7e), TOBN(0xdd431b98, 0x6da425dc),
8407 TOBN(0xcdc4aeab, 0x1834aabe), TOBN(0x84deb124, 0x8439b7fc),
8408 TOBN(0x8796f169, 0x3c2a5998), TOBN(0x9b9247b4, 0x7947190d),
8409 TOBN(0x55b9d9a5, 0x11597014), TOBN(0x7e9dd70d, 0x7b1566ee),
8410 TOBN(0x94ad78f7, 0xcbcd5e64), TOBN(0x0359ac17, 0x9bd4c032),
8411 TOBN(0x3b11baaf, 0x7cc222ae), TOBN(0xa6a6e284, 0xba78e812),
8412 TOBN(0x8392053f, 0x24cea1a0), TOBN(0xc97bce4a, 0x33621491),
8413 TOBN(0x7eb1db34, 0x35399ee9), TOBN(0x473f78ef, 0xece81ad1),
8414 TOBN(0x41d72fe0, 0xf63d3d0d), TOBN(0xe620b880, 0xafab62fc),
8415 TOBN(0x92096bc9, 0x93158383), TOBN(0x41a21357, 0x8f896f6c),
8416 TOBN(0x1b5ee2fa, 0xc7dcfcab), TOBN(0x650acfde, 0x9546e007),
8417 TOBN(0xc081b749, 0xb1b02e07), TOBN(0xda9e41a0, 0xf9eca03d),
8418 TOBN(0x013ba727, 0x175a54ab), TOBN(0xca0cd190, 0xea5d8d10),
8419 TOBN(0x85ea52c0, 0x95fd96a9), TOBN(0x2c591b9f, 0xbc5c3940),
8420 TOBN(0x6fb4d4e4, 0x2bad4d5f), TOBN(0xfa4c3590, 0xfef0059b),
8421 TOBN(0x6a10218a, 0xf5122294), TOBN(0x9a78a81a, 0xa85751d1),
8422 TOBN(0x04f20579, 0xa98e84e7), TOBN(0xfe1242c0, 0x4997e5b5),
8423 TOBN(0xe77a273b, 0xca21e1e4), TOBN(0xfcc8b1ef, 0x9411939d),
8424 TOBN(0xe20ea302, 0x92d0487a), TOBN(0x1442dbec, 0x294b91fe),
8425 TOBN(0x1f7a4afe, 0xbb6b0e8f), TOBN(0x1700ef74, 0x6889c318),
8426 TOBN(0xf5bbffc3, 0x70f1fc62), TOBN(0x3b31d4b6, 0x69c79cca),
8427 TOBN(0xe8bc2aab, 0xa7f6340d), TOBN(0xb0b08ab4, 0xa725e10a),
8428 TOBN(0x44f05701, 0xae340050), TOBN(0xba4b3016, 0x1cf0c569),
8429 TOBN(0x5aa29f83, 0xfbe19a51), TOBN(0x1b9ed428, 0xb71d752e),
8430 TOBN(0x1666e54e, 0xeb4819f5), TOBN(0x616cdfed, 0x9e18b75b),
8431 TOBN(0x112ed5be, 0x3ee27b0b), TOBN(0xfbf28319, 0x44c7de4d),
8432 TOBN(0xd685ec85, 0xe0e60d84), TOBN(0x68037e30, 0x1db7ee78),
8433 TOBN(0x5b65bdcd, 0x003c4d6e), TOBN(0x33e7363a, 0x93e29a6a),
8434 TOBN(0x995b3a61, 0x08d0756c), TOBN(0xd727f85c, 0x2faf134b),
8435 TOBN(0xfac6edf7, 0x1d337823), TOBN(0x99b9aa50, 0x0439b8b4),
8436 TOBN(0x722eb104, 0xe2b4e075), TOBN(0x49987295, 0x437c4926),
8437 TOBN(0xb1e4c0e4, 0x46a9b82d), TOBN(0xd0cb3197, 0x57a006f5),
8438 TOBN(0xf3de0f7d, 0xd7808c56), TOBN(0xb5c54d8f, 0x51f89772),
8439 TOBN(0x500a114a, 0xadbd31aa), TOBN(0x9afaaaa6, 0x295f6cab),
8440 TOBN(0x94705e21, 0x04cf667a), TOBN(0xfc2a811b, 0x9d3935d7),
8441 TOBN(0x560b0280, 0x6d09267c), TOBN(0xf19ed119, 0xf780e53b),
8442 TOBN(0xf0227c09, 0x067b6269), TOBN(0x967b8533, 0x5caef599),
8443 TOBN(0x155b9243, 0x68efeebc), TOBN(0xcd6d34f5, 0xc497bae6),
8444 TOBN(0x1dd8d5d3, 0x6cceb370), TOBN(0x2aeac579, 0xa78d7bf9),
8445 TOBN(0x5d65017d, 0x70b67a62), TOBN(0x70c8e44f, 0x17c53f67),
8446 TOBN(0xd1fc0950, 0x86a34d09), TOBN(0xe0fca256, 0xe7134907),
8447 TOBN(0xe24fa29c, 0x80fdd315), TOBN(0x2c4acd03, 0xd87499ad),
8448 TOBN(0xbaaf7517, 0x3b5a9ba6), TOBN(0xb9cbe1f6, 0x12e51a51),
8449 TOBN(0xd88edae3, 0x5e154897), TOBN(0xe4309c3c, 0x77b66ca0),
8450 TOBN(0xf5555805, 0xf67f3746), TOBN(0x85fc37ba, 0xa36401ff),
8451 TOBN(0xdf86e2ca, 0xd9499a53), TOBN(0x6270b2a3, 0xecbc955b),
8452 TOBN(0xafae64f5, 0x974ad33b), TOBN(0x04d85977, 0xfe7b2df1),
8453 TOBN(0x2a3db3ff, 0x4ab03f73), TOBN(0x0b87878a, 0x8702740a),
8454 TOBN(0x6d263f01, 0x5a061732), TOBN(0xc25430ce, 0xa32a1901),
8455 TOBN(0xf7ebab3d, 0xdb155018), TOBN(0x3a86f693, 0x63a9b78e),
8456 TOBN(0x349ae368, 0xda9f3804), TOBN(0x470f07fe, 0xa164349c),
8457 TOBN(0xd52f4cc9, 0x8562baa5), TOBN(0xc74a9e86, 0x2b290df3),
8458 TOBN(0xd3a1aa35, 0x43471a24), TOBN(0x239446be, 0xb8194511),
8459 TOBN(0xbec2dd00, 0x81dcd44d), TOBN(0xca3d7f0f, 0xc42ac82d),
8460 TOBN(0x1f3db085, 0xfdaf4520), TOBN(0xbb6d3e80, 0x4549daf2),
8461 TOBN(0xf5969d8a, 0x19ad5c42), TOBN(0x7052b13d, 0xdbfd1511),
8462 TOBN(0x11890d1b, 0x682b9060), TOBN(0xa71d3883, 0xac34452c),
8463 TOBN(0xa438055b, 0x783805b4), TOBN(0x43241277, 0x4725b23e),
8464 TOBN(0xf20cf96e, 0x4901bbed), TOBN(0x6419c710, 0xf432a2bb),
8465 TOBN(0x57a0fbb9, 0xdfa9cd7d), TOBN(0x589111e4, 0x00daa249),
8466 TOBN(0x19809a33, 0x7b60554e), TOBN(0xea5f8887, 0xede283a4),
8467 TOBN(0x2d713802, 0x503bfd35), TOBN(0x151bb0af, 0x585d2a53),
8468 TOBN(0x40b08f74, 0x43b30ca8), TOBN(0xe10b5bba, 0xd9934583),
8469 TOBN(0xe8a546d6, 0xb51110ad), TOBN(0x1dd50e66, 0x28e0b6c5),
8470 TOBN(0x292e9d54, 0xcff2b821), TOBN(0x3882555d, 0x47281760),
8471 TOBN(0x134838f8, 0x3724d6e3), TOBN(0xf2c679e0, 0x22ddcda1),
8472 TOBN(0x40ee8815, 0x6d2a5768), TOBN(0x7f227bd2, 0x1c1e7e2d),
8473 TOBN(0x487ba134, 0xd04ff443), TOBN(0x76e2ff3d, 0xc614e54b),
8474 TOBN(0x36b88d6f, 0xa3177ec7), TOBN(0xbf731d51, 0x2328fff5),
8475 TOBN(0x758caea2, 0x49ba158e), TOBN(0x5ab8ff4c, 0x02938188),
8476 TOBN(0x33e16056, 0x35edc56d), TOBN(0x5a69d349, 0x7e940d79),
8477 TOBN(0x6c4fd001, 0x03866dcb), TOBN(0x20a38f57, 0x4893cdef),
8478 TOBN(0xfbf3e790, 0xfac3a15b), TOBN(0x6ed7ea2e, 0x7a4f8e6b),
8479 TOBN(0xa663eb4f, 0xbc3aca86), TOBN(0x22061ea5, 0x080d53f7),
8480 TOBN(0x2480dfe6, 0xf546783f), TOBN(0xd38bc6da, 0x5a0a641e),
8481 TOBN(0xfb093cd1, 0x2ede8965), TOBN(0x89654db4, 0xacb455cf),
8482 TOBN(0x413cbf9a, 0x26e1adee), TOBN(0x291f3764, 0x373294d4),
8483 TOBN(0x00797257, 0x648083fe), TOBN(0x25f504d3, 0x208cc341),
8484 TOBN(0x635a8e5e, 0xc3a0ee43), TOBN(0x70aaebca, 0x679898ff),
8485 TOBN(0x9ee9f547, 0x5dc63d56), TOBN(0xce987966, 0xffb34d00),
8486 TOBN(0xf9f86b19, 0x5e26310a), TOBN(0x9e435484, 0x382a8ca8),
8487 TOBN(0x253bcb81, 0xc2352fe4), TOBN(0xa4eac8b0, 0x4474b571),
8488 TOBN(0xc1b97512, 0xc1ad8cf8), TOBN(0x193b4e9e, 0x99e0b697),
8489 TOBN(0x939d2716, 0x01e85df0), TOBN(0x4fb265b3, 0xcd44eafd),
8490 TOBN(0x321e7dcd, 0xe51e1ae2), TOBN(0x8e3a8ca6, 0xe3d8b096),
8491 TOBN(0x8de46cb0, 0x52604998), TOBN(0x91099ad8, 0x39072aa7),
8492 TOBN(0x2617f91c, 0x93aa96b8), TOBN(0x0fc8716b, 0x7fca2e13),
8493 TOBN(0xa7106f5e, 0x95328723), TOBN(0xd1c9c40b, 0x262e6522),
8494 TOBN(0xb9bafe86, 0x42b7c094), TOBN(0x1873439d, 0x1543c021),
8495 TOBN(0xe1baa5de, 0x5cbefd5d), TOBN(0xa363fc5e, 0x521e8aff),
8496 TOBN(0xefe6320d, 0xf862eaac), TOBN(0x14419c63, 0x22c647dc),
8497 TOBN(0x0e06707c, 0x4e46d428), TOBN(0xcb6c834f, 0x4a178f8f),
8498 TOBN(0x0f993a45, 0xd30f917c), TOBN(0xd4c4b049, 0x9879afee),
8499 TOBN(0xb6142a1e, 0x70500063), TOBN(0x7c9b41c3, 0xa5d9d605),
8500 TOBN(0xbc00fc2f, 0x2f8ba2c7), TOBN(0x0966eb2f, 0x7c67aa28),
8501 TOBN(0x13f7b516, 0x5a786972), TOBN(0x3bfb7557, 0x8a2fbba0),
8502 TOBN(0x131c4f23, 0x5a2b9620), TOBN(0xbff3ed27, 0x6faf46be),
8503 TOBN(0x9b4473d1, 0x7e172323), TOBN(0x421e8878, 0x339f6246),
8504 TOBN(0x0fa8587a, 0x25a41632), TOBN(0xc0814124, 0xa35b6c93),
8505 TOBN(0x2b18a9f5, 0x59ebb8db), TOBN(0x264e3357, 0x76edb29c),
8506 TOBN(0xaf245ccd, 0xc87c51e2), TOBN(0x16b3015b, 0x501e6214),
8507 TOBN(0xbb31c560, 0x0a3882ce), TOBN(0x6961bb94, 0xfec11e04),
8508 TOBN(0x3b825b8d, 0xeff7a3a0), TOBN(0xbec33738, 0xb1df7326),
8509 TOBN(0x68ad747c, 0x99604a1f), TOBN(0xd154c934, 0x9a3bd499),
8510 TOBN(0xac33506f, 0x1cc7a906), TOBN(0x73bb5392, 0x6c560e8f),
8511 TOBN(0x6428fcbe, 0x263e3944), TOBN(0xc11828d5, 0x1c387434),
8512 TOBN(0x3cd04be1, 0x3e4b12ff), TOBN(0xc3aad9f9, 0x2d88667c),
8513 TOBN(0xc52ddcf8, 0x248120cf), TOBN(0x985a892e, 0x2a389532),
8514 TOBN(0xfbb4b21b, 0x3bb85fa0), TOBN(0xf95375e0, 0x8dfc6269),
8515 TOBN(0xfb4fb06c, 0x7ee2acea), TOBN(0x6785426e, 0x309c4d1f),
8516 TOBN(0x659b17c8, 0xd8ceb147), TOBN(0x9b649eee, 0xb70a5554),
8517 TOBN(0x6b7fa0b5, 0xac6bc634), TOBN(0xd99fe2c7, 0x1d6e732f),
8518 TOBN(0x30e6e762, 0x8d3abba2), TOBN(0x18fee6e7, 0xa797b799),
8519 TOBN(0x5c9d360d, 0xc696464d), TOBN(0xe3baeb48, 0x27bfde12),
8520 TOBN(0x2bf5db47, 0xf23206d5), TOBN(0x2f6d3420, 0x1d260152),
8521 TOBN(0x17b87653, 0x3f8ff89a), TOBN(0x5157c30c, 0x378fa458),
8522 TOBN(0x7517c5c5, 0x2d4fb936), TOBN(0xef22f7ac, 0xe6518cdc),
8523 TOBN(0xdeb483e6, 0xbf847a64), TOBN(0xf5084558, 0x92e0fa89),
8524 },
8525 {
8526 TOBN(0xab9659d8, 0xdf7304d4), TOBN(0xb71bcf1b, 0xff210e8e),
8527 TOBN(0xa9a2438b, 0xd73fbd60), TOBN(0x4595cd1f, 0x5d11b4de),
8528 TOBN(0x9c0d329a, 0x4835859d), TOBN(0x4a0f0d2d, 0x7dbb6e56),
8529 TOBN(0xc6038e5e, 0xdf928a4e), TOBN(0xc9429621, 0x8f5ad154),
8530 TOBN(0x91213462, 0xf23f2d92), TOBN(0x6cab71bd, 0x60b94078),
8531 TOBN(0x6bdd0a63, 0x176cde20), TOBN(0x54c9b20c, 0xee4d54bc),
8532 TOBN(0x3cd2d8aa, 0x9f2ac02f), TOBN(0x03f8e617, 0x206eedb0),
8533 TOBN(0xc7f68e16, 0x93086434), TOBN(0x831469c5, 0x92dd3db9),
8534 TOBN(0x8521df24, 0x8f981354), TOBN(0x587e23ec, 0x3588a259),
8535 TOBN(0xcbedf281, 0xd7a0992c), TOBN(0x06930a55, 0x38961407),
8536 TOBN(0x09320deb, 0xbe5bbe21), TOBN(0xa7ffa5b5, 0x2491817f),
8537 TOBN(0xe6c8b4d9, 0x09065160), TOBN(0xac4f3992, 0xfff6d2a9),
8538 TOBN(0x7aa7a158, 0x3ae9c1bd), TOBN(0xe0af6d98, 0xe37ce240),
8539 TOBN(0xe54342d9, 0x28ab38b4), TOBN(0xe8b75007, 0x0a1c98ca),
8540 TOBN(0xefce86af, 0xe02358f2), TOBN(0x31b8b856, 0xea921228),
8541 TOBN(0x052a1912, 0x0a1c67fc), TOBN(0xb4069ea4, 0xe3aead59),
8542 TOBN(0x3232d6e2, 0x7fa03cb3), TOBN(0xdb938e5b, 0x0fdd7d88),
8543 TOBN(0x04c1d2cd, 0x2ccbfc5d), TOBN(0xd2f45c12, 0xaf3a580f),
8544 TOBN(0x592620b5, 0x7883e614), TOBN(0x5fd27e68, 0xbe7c5f26),
8545 TOBN(0x139e45a9, 0x1567e1e3), TOBN(0x2cc71d2d, 0x44d8aaaf),
8546 TOBN(0x4a9090cd, 0xe36d0757), TOBN(0xf722d7b1, 0xd9a29382),
8547 TOBN(0xfb7fb04c, 0x04b48ddf), TOBN(0x628ad2a7, 0xebe16f43),
8548 TOBN(0xcd3fbfb5, 0x20226040), TOBN(0x6c34ecb1, 0x5104b6c4),
8549 TOBN(0x30c0754e, 0xc903c188), TOBN(0xec336b08, 0x2d23cab0),
8550 TOBN(0x473d62a2, 0x1e206ee5), TOBN(0xf1e27480, 0x8c49a633),
8551 TOBN(0x87ab956c, 0xe9f6b2c3), TOBN(0x61830b48, 0x62b606ea),
8552 TOBN(0x67cd6846, 0xe78e815f), TOBN(0xfe40139f, 0x4c02082a),
8553 TOBN(0x52bbbfcb, 0x952ec365), TOBN(0x74c11642, 0x6b9836ab),
8554 TOBN(0x9f51439e, 0x558df019), TOBN(0x230da4ba, 0xac712b27),
8555 TOBN(0x518919e3, 0x55185a24), TOBN(0x4dcefcdd, 0x84b78f50),
8556 TOBN(0xa7d90fb2, 0xa47d4c5a), TOBN(0x55ac9abf, 0xb30e009e),
8557 TOBN(0xfd2fc359, 0x74eed273), TOBN(0xb72d824c, 0xdbea8faf),
8558 TOBN(0xce721a74, 0x4513e2ca), TOBN(0x0b418612, 0x38240b2c),
8559 TOBN(0x05199968, 0xd5baa450), TOBN(0xeb1757ed, 0x2b0e8c25),
8560 TOBN(0x6ebc3e28, 0x3dfac6d5), TOBN(0xb2431e2e, 0x48a237f5),
8561 TOBN(0x2acb5e23, 0x52f61499), TOBN(0x5558a2a7, 0xe06c936b),
8562 TOBN(0xd213f923, 0xcbb13d1b), TOBN(0x98799f42, 0x5bfb9bfe),
8563 TOBN(0x1ae8ddc9, 0x701144a9), TOBN(0x0b8b3bb6, 0x4c5595ee),
8564 TOBN(0x0ea9ef2e, 0x3ecebb21), TOBN(0x17cb6c4b, 0x3671f9a7),
8565 TOBN(0x47ef464f, 0x726f1d1f), TOBN(0x171b9484, 0x6943a276),
8566 TOBN(0x51a4ae2d, 0x7ef0329c), TOBN(0x08509222, 0x91c4402a),
8567 TOBN(0x64a61d35, 0xafd45bbc), TOBN(0x38f096fe, 0x3035a851),
8568 TOBN(0xc7468b74, 0xa1dec027), TOBN(0xe8cf10e7, 0x4fc7dcba),
8569 TOBN(0xea35ff40, 0xf4a06353), TOBN(0x0b4c0dfa, 0x8b77dd66),
8570 TOBN(0x779b8552, 0xde7e5c19), TOBN(0xfab28609, 0xc1c0256c),
8571 TOBN(0x64f58eee, 0xabd4743d), TOBN(0x4e8ef838, 0x7b6cc93b),
8572 TOBN(0xee650d26, 0x4cb1bf3d), TOBN(0x4c1f9d09, 0x73dedf61),
8573 TOBN(0xaef7c9d7, 0xbfb70ced), TOBN(0x1ec0507e, 0x1641de1e),
8574 TOBN(0xcd7e5cc7, 0xcde45079), TOBN(0xde173c9a, 0x516ac9e4),
8575 TOBN(0x517a8494, 0xc170315c), TOBN(0x438fd905, 0x91d8e8fb),
8576 TOBN(0x5145c506, 0xc7d9630b), TOBN(0x6457a87b, 0xf47d4d75),
8577 TOBN(0xd31646bf, 0x0d9a80e8), TOBN(0x453add2b, 0xcef3aabe),
8578 TOBN(0xc9941109, 0xa607419d), TOBN(0xfaa71e62, 0xbb6bca80),
8579 TOBN(0x34158c13, 0x07c431f3), TOBN(0x594abebc, 0x992bc47a),
8580 TOBN(0x6dfea691, 0xeb78399f), TOBN(0x48aafb35, 0x3f42cba4),
8581 TOBN(0xedcd65af, 0x077c04f0), TOBN(0x1a29a366, 0xe884491a),
8582 TOBN(0x023a40e5, 0x1c21f2bf), TOBN(0xf99a513c, 0xa5057aee),
8583 TOBN(0xa3fe7e25, 0xbcab072e), TOBN(0x8568d2e1, 0x40e32bcf),
8584 TOBN(0x904594eb, 0xd3f69d9f), TOBN(0x181a9733, 0x07affab1),
8585 TOBN(0xe4d68d76, 0xb6e330f4), TOBN(0x87a6dafb, 0xc75a7fc1),
8586 TOBN(0x549db2b5, 0xef7d9289), TOBN(0x2480d4a8, 0x197f015a),
8587 TOBN(0x61d5590b, 0xc40493b6), TOBN(0x3a55b52e, 0x6f780331),
8588 TOBN(0x40eb8115, 0x309eadb0), TOBN(0xdea7de5a, 0x92e5c625),
8589 TOBN(0x64d631f0, 0xcc6a3d5a), TOBN(0x9d5e9d7c, 0x93e8dd61),
8590 TOBN(0xf297bef5, 0x206d3ffc), TOBN(0x23d5e033, 0x7d808bd4),
8591 TOBN(0x4a4f6912, 0xd24cf5ba), TOBN(0xe4d8163b, 0x09cdaa8a),
8592 TOBN(0x0e0de9ef, 0xd3082e8e), TOBN(0x4fe1246c, 0x0192f360),
8593 TOBN(0x1f900150, 0x4b8eee0a), TOBN(0x5219da81, 0xf1da391b),
8594 TOBN(0x7bf6a5c1, 0xf7ea25aa), TOBN(0xd165e6bf, 0xfbb07d5f),
8595 TOBN(0xe3539361, 0x89e78671), TOBN(0xa3fcac89, 0x2bac4219),
8596 TOBN(0xdfab6fd4, 0xf0baa8ab), TOBN(0x5a4adac1, 0xe2c1c2e5),
8597 TOBN(0x6cd75e31, 0x40d85849), TOBN(0xce263fea, 0x19b39181),
8598 TOBN(0xcb6803d3, 0x07032c72), TOBN(0x7f40d5ce, 0x790968c8),
8599 TOBN(0xa6de86bd, 0xdce978f0), TOBN(0x25547c4f, 0x368f751c),
8600 TOBN(0xb1e685fd, 0x65fb2a9e), TOBN(0xce69336f, 0x1eb9179c),
8601 TOBN(0xb15d1c27, 0x12504442), TOBN(0xb7df465c, 0xb911a06b),
8602 TOBN(0xb8d804a3, 0x315980cd), TOBN(0x693bc492, 0xfa3bebf7),
8603 TOBN(0x3578aeee, 0x2253c504), TOBN(0x158de498, 0xcd2474a2),
8604 TOBN(0x1331f5c7, 0xcfda8368), TOBN(0xd2d7bbb3, 0x78d7177e),
8605 TOBN(0xdf61133a, 0xf3c1e46e), TOBN(0x5836ce7d, 0xd30e7be8),
8606 TOBN(0x83084f19, 0x94f834cb), TOBN(0xd35653d4, 0x429ed782),
8607 TOBN(0xa542f16f, 0x59e58243), TOBN(0xc2b52f65, 0x0470a22d),
8608 TOBN(0xe3b6221b, 0x18f23d96), TOBN(0xcb05abac, 0x3f5252b4),
8609 TOBN(0xca00938b, 0x87d61402), TOBN(0x2f186cdd, 0x411933e4),
8610 TOBN(0xe042ece5, 0x9a29a5c5), TOBN(0xb19b3c07, 0x3b6c8402),
8611 TOBN(0xc97667c7, 0x19d92684), TOBN(0xb5624622, 0xebc66372),
8612 TOBN(0x0cb96e65, 0x3c04fa02), TOBN(0x83a7176c, 0x8eaa39aa),
8613 TOBN(0x2033561d, 0xeaa1633f), TOBN(0x45a9d086, 0x4533df73),
8614 TOBN(0xe0542c1d, 0x3dc090bc), TOBN(0x82c996ef, 0xaa59c167),
8615 TOBN(0xe3f735e8, 0x0ee7fc4d), TOBN(0x7b179393, 0x7c35db79),
8616 TOBN(0xb6419e25, 0xf8c5dbfd), TOBN(0x4d9d7a1e, 0x1f327b04),
8617 TOBN(0x979f6f9b, 0x298dfca8), TOBN(0xc7c5dff1, 0x8de9366a),
8618 TOBN(0x1b7a588d, 0x04c82bdd), TOBN(0x68005534, 0xf8319dfd),
8619 TOBN(0xde8a55b5, 0xd8eb9580), TOBN(0x5ea886da, 0x8d5bca81),
8620 TOBN(0xe8530a01, 0x252a0b4d), TOBN(0x1bffb4fe, 0x35eaa0a1),
8621 TOBN(0x2ad828b1, 0xd8e99563), TOBN(0x7de96ef5, 0x95f9cd87),
8622 TOBN(0x4abb2d0c, 0xd77d970c), TOBN(0x03cfb933, 0xd33ef9cb),
8623 TOBN(0xb0547c01, 0x8b211fe9), TOBN(0x2fe64809, 0xa56ed1c6),
8624 TOBN(0xcb7d5624, 0xc2ac98cc), TOBN(0x2a1372c0, 0x1a393e33),
8625 TOBN(0xc8d1ec1c, 0x29660521), TOBN(0xf3d31b04, 0xb37ac3e9),
8626 TOBN(0xa29ae9df, 0x5ece6e7c), TOBN(0x0603ac8f, 0x0facfb55),
8627 TOBN(0xcfe85b7a, 0xdda233a5), TOBN(0xe618919f, 0xbd75f0b8),
8628 TOBN(0xf555a3d2, 0x99bf1603), TOBN(0x1f43afc9, 0xf184255a),
8629 TOBN(0xdcdaf341, 0x319a3e02), TOBN(0xd3b117ef, 0x03903a39),
8630 TOBN(0xe095da13, 0x65d1d131), TOBN(0x86f16367, 0xc37ad03e),
8631 TOBN(0x5f37389e, 0x462cd8dd), TOBN(0xc103fa04, 0xd67a60e6),
8632 TOBN(0x57c34344, 0xf4b478f0), TOBN(0xce91edd8, 0xe117c98d),
8633 TOBN(0x001777b0, 0x231fc12e), TOBN(0x11ae47f2, 0xb207bccb),
8634 TOBN(0xd983cf8d, 0x20f8a242), TOBN(0x7aff5b1d, 0xf22e1ad8),
8635 TOBN(0x68fd11d0, 0x7fc4feb3), TOBN(0x5d53ae90, 0xb0f1c3e1),
8636 TOBN(0x50fb7905, 0xec041803), TOBN(0x85e3c977, 0x14404888),
8637 TOBN(0x0e67faed, 0xac628d8f), TOBN(0x2e865150, 0x6668532c),
8638 TOBN(0x15acaaa4, 0x6a67a6b0), TOBN(0xf4cdee25, 0xb25cec41),
8639 TOBN(0x49ee565a, 0xe4c6701e), TOBN(0x2a04ca66, 0xfc7d63d8),
8640 TOBN(0xeb105018, 0xef0543fb), TOBN(0xf709a4f5, 0xd1b0d81d),
8641 TOBN(0x5b906ee6, 0x2915d333), TOBN(0xf4a87412, 0x96f1f0ab),
8642 TOBN(0xb6b82fa7, 0x4d82f4c2), TOBN(0x90725a60, 0x6804efb3),
8643 TOBN(0xbc82ec46, 0xadc3425e), TOBN(0xb7b80581, 0x2787843e),
8644 TOBN(0xdf46d91c, 0xdd1fc74c), TOBN(0xdc1c62cb, 0xe783a6c4),
8645 TOBN(0x59d1b9f3, 0x1a04cbba), TOBN(0xd87f6f72, 0x95e40764),
8646 TOBN(0x02b4cfc1, 0x317f4a76), TOBN(0x8d2703eb, 0x91036bce),
8647 TOBN(0x98206cc6, 0xa5e72a56), TOBN(0x57be9ed1, 0xcf53fb0f),
8648 TOBN(0x09374571, 0xef0b17ac), TOBN(0x74b2655e, 0xd9181b38),
8649 TOBN(0xc8f80ea8, 0x89935d0e), TOBN(0xc0d9e942, 0x91529936),
8650 TOBN(0x19686041, 0x1e84e0e5), TOBN(0xa5db84d3, 0xaea34c93),
8651 TOBN(0xf9d5bb19, 0x7073a732), TOBN(0xb8d2fe56, 0x6bcfd7c0),
8652 TOBN(0x45775f36, 0xf3eb82fa), TOBN(0x8cb20ccc, 0xfdff8b58),
8653 TOBN(0x1659b65f, 0x8374c110), TOBN(0xb8b4a422, 0x330c789a),
8654 TOBN(0x75e3c3ea, 0x6fe8208b), TOBN(0xbd74b9e4, 0x286e78fe),
8655 TOBN(0x0be2e81b, 0xd7d93a1a), TOBN(0x7ed06e27, 0xdd0a5aae),
8656 TOBN(0x721f5a58, 0x6be8b800), TOBN(0x428299d1, 0xd846db28),
8657 TOBN(0x95cb8e6b, 0x5be88ed3), TOBN(0xc3186b23, 0x1c034e11),
8658 TOBN(0xa6312c9e, 0x8977d99b), TOBN(0xbe944331, 0x83f531e7),
8659 TOBN(0x8232c0c2, 0x18d3b1d4), TOBN(0x617aae8b, 0xe1247b73),
8660 TOBN(0x40153fc4, 0x282aec3b), TOBN(0xc6063d2f, 0xf7b8f823),
8661 TOBN(0x68f10e58, 0x3304f94c), TOBN(0x31efae74, 0xee676346),
8662 TOBN(0xbadb6c6d, 0x40a9b97c), TOBN(0x14702c63, 0x4f666256),
8663 TOBN(0xdeb954f1, 0x5184b2e3), TOBN(0x5184a526, 0x94b6ca40),
8664 TOBN(0xfff05337, 0x003c32ea), TOBN(0x5aa374dd, 0x205974c7),
8665 TOBN(0x9a763854, 0x4b0dd71a), TOBN(0x459cd27f, 0xdeb947ec),
8666 TOBN(0xa6e28161, 0x459c2b92), TOBN(0x2f020fa8, 0x75ee8ef5),
8667 TOBN(0xb132ec2d, 0x30b06310), TOBN(0xc3e15899, 0xbc6a4530),
8668 TOBN(0xdc5f53fe, 0xaa3f451a), TOBN(0x3a3c7f23, 0xc2d9acac),
8669 TOBN(0x2ec2f892, 0x6b27e58b), TOBN(0x68466ee7, 0xd742799f),
8670 TOBN(0x98324dd4, 0x1fa26613), TOBN(0xa2dc6dab, 0xbdc29d63),
8671 TOBN(0xf9675faa, 0xd712d657), TOBN(0x813994be, 0x21fd8d15),
8672 TOBN(0x5ccbb722, 0xfd4f7553), TOBN(0x5135ff8b, 0xf3a36b20),
8673 TOBN(0x44be28af, 0x69559df5), TOBN(0x40b65bed, 0x9d41bf30),
8674 TOBN(0xd98bf2a4, 0x3734e520), TOBN(0x5e3abbe3, 0x209bdcba),
8675 TOBN(0x77c76553, 0xbc945b35), TOBN(0x5331c093, 0xc6ef14aa),
8676 TOBN(0x518ffe29, 0x76b60c80), TOBN(0x2285593b, 0x7ace16f8),
8677 TOBN(0xab1f64cc, 0xbe2b9784), TOBN(0xe8f2c0d9, 0xab2421b6),
8678 TOBN(0x617d7174, 0xc1df065c), TOBN(0xafeeb5ab, 0x5f6578fa),
8679 TOBN(0x16ff1329, 0x263b54a8), TOBN(0x45c55808, 0xc990dce3),
8680 TOBN(0x42eab6c0, 0xecc8c177), TOBN(0x799ea9b5, 0x5982ecaa),
8681 TOBN(0xf65da244, 0xb607ef8e), TOBN(0x8ab226ce, 0x32a3fc2c),
8682 TOBN(0x745741e5, 0x7ea973dc), TOBN(0x5c00ca70, 0x20888f2e),
8683 TOBN(0x7cdce3cf, 0x45fd9cf1), TOBN(0x8a741ef1, 0x5507f872),
8684 TOBN(0x47c51c2f, 0x196b4cec), TOBN(0x70d08e43, 0xc97ea618),
8685 TOBN(0x930da15c, 0x15b18a2b), TOBN(0x33b6c678, 0x2f610514),
8686 TOBN(0xc662e4f8, 0x07ac9794), TOBN(0x1eccf050, 0xba06cb79),
8687 TOBN(0x1ff08623, 0xe7d954e5), TOBN(0x6ef2c5fb, 0x24cf71c3),
8688 TOBN(0xb2c063d2, 0x67978453), TOBN(0xa0cf3796, 0x1d654af8),
8689 TOBN(0x7cb242ea, 0x7ebdaa37), TOBN(0x206e0b10, 0xb86747e0),
8690 TOBN(0x481dae5f, 0xd5ecfefc), TOBN(0x07084fd8, 0xc2bff8fc),
8691 TOBN(0x8040a01a, 0xea324596), TOBN(0x4c646980, 0xd4de4036),
8692 TOBN(0x9eb8ab4e, 0xd65abfc3), TOBN(0xe01cb91f, 0x13541ec7),
8693 TOBN(0x8f029adb, 0xfd695012), TOBN(0x9ae28483, 0x3c7569ec),
8694 TOBN(0xa5614c9e, 0xa66d80a1), TOBN(0x680a3e44, 0x75f5f911),
8695 TOBN(0x0c07b14d, 0xceba4fc1), TOBN(0x891c285b, 0xa13071c1),
8696 TOBN(0xcac67ceb, 0x799ece3c), TOBN(0x29b910a9, 0x41e07e27),
8697 TOBN(0x66bdb409, 0xf2e43123), TOBN(0x06f8b137, 0x7ac9ecbe),
8698 TOBN(0x5981fafd, 0x38547090), TOBN(0x19ab8b9f, 0x85e3415d),
8699 TOBN(0xfc28c194, 0xc7e31b27), TOBN(0x843be0aa, 0x6fbcbb42),
8700 TOBN(0xf3b1ed43, 0xa6db836c), TOBN(0x2a1330e4, 0x01a45c05),
8701 TOBN(0x4f19f3c5, 0x95c1a377), TOBN(0xa85f39d0, 0x44b5ee33),
8702 TOBN(0x3da18e6d, 0x4ae52834), TOBN(0x5a403b39, 0x7423dcb0),
8703 TOBN(0xbb555e0a, 0xf2374aef), TOBN(0x2ad599c4, 0x1e8ca111),
8704 TOBN(0x1b3a2fb9, 0x014b3bf8), TOBN(0x73092684, 0xf66d5007),
8705 TOBN(0x079f1426, 0xc4340102), TOBN(0x1827cf81, 0x8fddf4de),
8706 TOBN(0xc83605f6, 0xf10ff927), TOBN(0xd3871451, 0x23739fc6),
8707 TOBN(0x6d163450, 0xcac1c2cc), TOBN(0x6b521296, 0xa2ec1ac5),
8708 TOBN(0x0606c4f9, 0x6e3cb4a5), TOBN(0xe47d3f41, 0x778abff7),
8709 TOBN(0x425a8d5e, 0xbe8e3a45), TOBN(0x53ea9e97, 0xa6102160),
8710 TOBN(0x477a106e, 0x39cbb688), TOBN(0x532401d2, 0xf3386d32),
8711 TOBN(0x8e564f64, 0xb1b9b421), TOBN(0xca9b8388, 0x81dad33f),
8712 TOBN(0xb1422b4e, 0x2093913e), TOBN(0x533d2f92, 0x69bc8112),
8713 TOBN(0x3fa017be, 0xebe7b2c7), TOBN(0xb2767c4a, 0xcaf197c6),
8714 TOBN(0xc925ff87, 0xaedbae9f), TOBN(0x7daf0eb9, 0x36880a54),
8715 TOBN(0x9284ddf5, 0x9c4d0e71), TOBN(0x1581cf93, 0x316f8cf5),
8716 TOBN(0x3eeca887, 0x3ac1f452), TOBN(0xb417fce9, 0xfb6aeffe),
8717 TOBN(0xa5918046, 0xeefb8dc3), TOBN(0x73d318ac, 0x02209400),
8718 TOBN(0xe800400f, 0x728693e5), TOBN(0xe87d814b, 0x339927ed),
8719 TOBN(0x93e94d3b, 0x57ea9910), TOBN(0xff8a35b6, 0x2245fb69),
8720 TOBN(0x043853d7, 0x7f200d34), TOBN(0x470f1e68, 0x0f653ce1),
8721 TOBN(0x81ac05bd, 0x59a06379), TOBN(0xa14052c2, 0x03930c29),
8722 TOBN(0x6b72fab5, 0x26bc2797), TOBN(0x13670d16, 0x99f16771),
8723 TOBN(0x00170052, 0x1e3e48d1), TOBN(0x978fe401, 0xb7adf678),
8724 TOBN(0x55ecfb92, 0xd41c5dd4), TOBN(0x5ff8e247, 0xc7b27da5),
8725 TOBN(0xe7518272, 0x013fb606), TOBN(0x5768d7e5, 0x2f547a3c),
8726 TOBN(0xbb24eaa3, 0x60017a5f), TOBN(0x6b18e6e4, 0x9c64ce9b),
8727 TOBN(0xc225c655, 0x103dde07), TOBN(0xfc3672ae, 0x7592f7ea),
8728 TOBN(0x9606ad77, 0xd06283a1), TOBN(0x542fc650, 0xe4d59d99),
8729 TOBN(0xabb57c49, 0x2a40e7c2), TOBN(0xac948f13, 0xa8db9f55),
8730 TOBN(0x6d4c9682, 0xb04465c3), TOBN(0xe3d062fa, 0x6468bd15),
8731 TOBN(0xa51729ac, 0x5f318d7e), TOBN(0x1fc87df6, 0x9eb6fc95),
8732 TOBN(0x63d146a8, 0x0591f652), TOBN(0xa861b8f7, 0x589621aa),
8733 TOBN(0x59f5f15a, 0xce31348c), TOBN(0x8f663391, 0x440da6da),
8734 TOBN(0xcfa778ac, 0xb591ffa3), TOBN(0x027ca9c5, 0x4cdfebce),
8735 TOBN(0xbe8e05a5, 0x444ea6b3), TOBN(0x8aab4e69, 0xa78d8254),
8736 TOBN(0x2437f04f, 0xb474d6b8), TOBN(0x6597ffd4, 0x045b3855),
8737 TOBN(0xbb0aea4e, 0xca47ecaa), TOBN(0x568aae83, 0x85c7ebfc),
8738 TOBN(0x0e966e64, 0xc73b2383), TOBN(0x49eb3447, 0xd17d8762),
8739 TOBN(0xde107821, 0x8da05dab), TOBN(0x443d8baa, 0x016b7236),
8740 TOBN(0x163b63a5, 0xea7610d6), TOBN(0xe47e4185, 0xce1ca979),
8741 TOBN(0xae648b65, 0x80baa132), TOBN(0xebf53de2, 0x0e0d5b64),
8742 TOBN(0x8d3bfcb4, 0xd3c8c1ca), TOBN(0x0d914ef3, 0x5d04b309),
8743 TOBN(0x55ef6415, 0x3de7d395), TOBN(0xbde1666f, 0x26b850e8),
8744 TOBN(0xdbe1ca6e, 0xd449ab19), TOBN(0x8902b322, 0xe89a2672),
8745 TOBN(0xb1674b7e, 0xdacb7a53), TOBN(0x8e9faf6e, 0xf52523ff),
8746 TOBN(0x6ba535da, 0x9a85788b), TOBN(0xd21f03ae, 0xbd0626d4),
8747 TOBN(0x099f8c47, 0xe873dc64), TOBN(0xcda8564d, 0x018ec97e),
8748 TOBN(0x3e8d7a5c, 0xde92c68c), TOBN(0x78e035a1, 0x73323cc4),
8749 TOBN(0x3ef26275, 0xf880ff7c), TOBN(0xa4ee3dff, 0x273eedaa),
8750 TOBN(0x58823507, 0xaf4e18f8), TOBN(0x967ec9b5, 0x0672f328),
8751 TOBN(0x9ded19d9, 0x559d3186), TOBN(0x5e2ab3de, 0x6cdce39c),
8752 TOBN(0xabad6e4d, 0x11c226df), TOBN(0xf9783f43, 0x87723014),
8753 TOBN(0x9a49a0cf, 0x1a885719), TOBN(0xfc0c1a5a, 0x90da9dbf),
8754 TOBN(0x8bbaec49, 0x571d92ac), TOBN(0x569e85fe, 0x4692517f),
8755 TOBN(0x8333b014, 0xa14ea4af), TOBN(0x32f2a62f, 0x12e5c5ad),
8756 TOBN(0x98c2ce3a, 0x06d89b85), TOBN(0xb90741aa, 0x2ff77a08),
8757 TOBN(0x2530defc, 0x01f795a2), TOBN(0xd6e5ba0b, 0x84b3c199),
8758 TOBN(0x7d8e8451, 0x12e4c936), TOBN(0xae419f7d, 0xbd0be17b),
8759 TOBN(0xa583fc8c, 0x22262bc9), TOBN(0x6b842ac7, 0x91bfe2bd),
8760 TOBN(0x33cef4e9, 0x440d6827), TOBN(0x5f69f4de, 0xef81fb14),
8761 TOBN(0xf16cf6f6, 0x234fbb92), TOBN(0x76ae3fc3, 0xd9e7e158),
8762 TOBN(0x4e89f6c2, 0xe9740b33), TOBN(0x677bc85d, 0x4962d6a1),
8763 TOBN(0x6c6d8a7f, 0x68d10d15), TOBN(0x5f9a7224, 0x0257b1cd),
8764 TOBN(0x7096b916, 0x4ad85961), TOBN(0x5f8c47f7, 0xe657ab4a),
8765 TOBN(0xde57d7d0, 0xf7461d7e), TOBN(0x7eb6094d, 0x80ce5ee2),
8766 TOBN(0x0b1e1dfd, 0x34190547), TOBN(0x8a394f43, 0xf05dd150),
8767 TOBN(0x0a9eb24d, 0x97df44e6), TOBN(0x78ca06bf, 0x87675719),
8768 TOBN(0x6f0b3462, 0x6ffeec22), TOBN(0x9d91bcea, 0x36cdd8fb),
8769 TOBN(0xac83363c, 0xa105be47), TOBN(0x81ba76c1, 0x069710e3),
8770 TOBN(0x3d1b24cb, 0x28c682c6), TOBN(0x27f25228, 0x8612575b),
8771 TOBN(0xb587c779, 0xe8e66e98), TOBN(0x7b0c03e9, 0x405eb1fe),
8772 TOBN(0xfdf0d030, 0x15b548e7), TOBN(0xa8be76e0, 0x38b36af7),
8773 TOBN(0x4cdab04a, 0x4f310c40), TOBN(0x6287223e, 0xf47ecaec),
8774 TOBN(0x678e6055, 0x8b399320), TOBN(0x61fe3fa6, 0xc01e4646),
8775 TOBN(0xc482866b, 0x03261a5e), TOBN(0xdfcf45b8, 0x5c2f244a),
8776 TOBN(0x8fab9a51, 0x2f684b43), TOBN(0xf796c654, 0xc7220a66),
8777 TOBN(0x1d90707e, 0xf5afa58f), TOBN(0x2c421d97, 0x4fdbe0de),
8778 TOBN(0xc4f4cda3, 0xaf2ebc2f), TOBN(0xa0af843d, 0xcb4efe24),
8779 TOBN(0x53b857c1, 0x9ccd10b1), TOBN(0xddc9d1eb, 0x914d3e04),
8780 TOBN(0x7bdec8bb, 0x62771deb), TOBN(0x829277aa, 0x91c5aa81),
8781 TOBN(0x7af18dd6, 0x832391ae), TOBN(0x1740f316, 0xc71a84ca),
8782 },
8783 {
8784 TOBN(0x8928e99a, 0xeeaf8c49), TOBN(0xee7aa73d, 0x6e24d728),
8785 TOBN(0x4c5007c2, 0xe72b156c), TOBN(0x5fcf57c5, 0xed408a1d),
8786 TOBN(0x9f719e39, 0xb6057604), TOBN(0x7d343c01, 0xc2868bbf),
8787 TOBN(0x2cca254b, 0x7e103e2d), TOBN(0xe6eb38a9, 0xf131bea2),
8788 TOBN(0xb33e624f, 0x8be762b4), TOBN(0x2a9ee4d1, 0x058e3413),
8789 TOBN(0x968e6369, 0x67d805fa), TOBN(0x9848949b, 0x7db8bfd7),
8790 TOBN(0x5308d7e5, 0xd23a8417), TOBN(0x892f3b1d, 0xf3e29da5),
8791 TOBN(0xc95c139e, 0x3dee471f), TOBN(0x8631594d, 0xd757e089),
8792 TOBN(0xe0c82a3c, 0xde918dcc), TOBN(0x2e7b5994, 0x26fdcf4b),
8793 TOBN(0x82c50249, 0x32cb1b2d), TOBN(0xea613a9d, 0x7657ae07),
8794 TOBN(0xc2eb5f6c, 0xf1fdc9f7), TOBN(0xb6eae8b8, 0x879fe682),
8795 TOBN(0x253dfee0, 0x591cbc7f), TOBN(0x000da713, 0x3e1290e6),
8796 TOBN(0x1083e2ea, 0x1f095615), TOBN(0x0a28ad77, 0x14e68c33),
8797 TOBN(0x6bfc0252, 0x3d8818be), TOBN(0xb585113a, 0xf35850cd),
8798 TOBN(0x7d935f0b, 0x30df8aa1), TOBN(0xaddda07c, 0x4ab7e3ac),
8799 TOBN(0x92c34299, 0x552f00cb), TOBN(0xc33ed1de, 0x2909df6c),
8800 TOBN(0x22c2195d, 0x80e87766), TOBN(0x9e99e6d8, 0x9ddf4ac0),
8801 TOBN(0x09642e4e, 0x65e74934), TOBN(0x2610ffa2, 0xff1ff241),
8802 TOBN(0x4d1d47d4, 0x751c8159), TOBN(0x697b4985, 0xaf3a9363),
8803 TOBN(0x0318ca46, 0x87477c33), TOBN(0xa90cb565, 0x9441eff3),
8804 TOBN(0x58bb3848, 0x36f024cb), TOBN(0x85be1f77, 0x36016168),
8805 TOBN(0x6c59587c, 0xdc7e07f1), TOBN(0x191be071, 0xaf1d8f02),
8806 TOBN(0xbf169fa5, 0xcca5e55c), TOBN(0x3864ba3c, 0xf7d04eac),
8807 TOBN(0x915e367f, 0x8d7d05db), TOBN(0xb48a876d, 0xa6549e5d),
8808 TOBN(0xef89c656, 0x580e40a2), TOBN(0xf194ed8c, 0x728068bc),
8809 TOBN(0x74528045, 0xa47990c9), TOBN(0xf53fc7d7, 0x5e1a4649),
8810 TOBN(0xbec5ae9b, 0x78593e7d), TOBN(0x2cac4ee3, 0x41db65d7),
8811 TOBN(0xa8c1eb24, 0x04a3d39b), TOBN(0x53b7d634, 0x03f8f3ef),
8812 TOBN(0x2dc40d48, 0x3e07113c), TOBN(0x6e4a5d39, 0x7d8b63ae),
8813 TOBN(0x5582a94b, 0x79684c2b), TOBN(0x932b33d4, 0x622da26c),
8814 TOBN(0xf534f651, 0x0dbbf08d), TOBN(0x211d07c9, 0x64c23a52),
8815 TOBN(0x0eeece0f, 0xee5bdc9b), TOBN(0xdf178168, 0xf7015558),
8816 TOBN(0xd4294635, 0x0a712229), TOBN(0x93cbe448, 0x09273f8c),
8817 TOBN(0x00b095ef, 0x8f13bc83), TOBN(0xbb741972, 0x8798978c),
8818 TOBN(0x9d7309a2, 0x56dbe6e7), TOBN(0xe578ec56, 0x5a5d39ec),
8819 TOBN(0x3961151b, 0x851f9a31), TOBN(0x2da7715d, 0xe5709eb4),
8820 TOBN(0x867f3017, 0x53dfabf0), TOBN(0x728d2078, 0xb8e39259),
8821 TOBN(0x5c75a0cd, 0x815d9958), TOBN(0xf84867a6, 0x16603be1),
8822 TOBN(0xc865b13d, 0x70e35b1c), TOBN(0x02414468, 0x19b03e2c),
8823 TOBN(0xe46041da, 0xac1f3121), TOBN(0x7c9017ad, 0x6f028a7c),
8824 TOBN(0xabc96de9, 0x0a482873), TOBN(0x4265d6b1, 0xb77e54d4),
8825 TOBN(0x68c38e79, 0xa57d88e7), TOBN(0xd461d766, 0x9ce82de3),
8826 TOBN(0x817a9ec5, 0x64a7e489), TOBN(0xcc5675cd, 0xa0def5f2),
8827 TOBN(0x9a00e785, 0x985d494e), TOBN(0xc626833f, 0x1b03514a),
8828 TOBN(0xabe7905a, 0x83cdd60e), TOBN(0x50602fb5, 0xa1170184),
8829 TOBN(0x689886cd, 0xb023642a), TOBN(0xd568d090, 0xa6e1fb00),
8830 TOBN(0x5b1922c7, 0x0259217f), TOBN(0x93831cd9, 0xc43141e4),
8831 TOBN(0xdfca3587, 0x0c95f86e), TOBN(0xdec2057a, 0x568ae828),
8832 TOBN(0xc44ea599, 0xf98a759a), TOBN(0x55a0a7a2, 0xf7c23c1d),
8833 TOBN(0xd5ffb6e6, 0x94c4f687), TOBN(0x3563cce2, 0x12848478),
8834 TOBN(0x812b3517, 0xe7b1fbe1), TOBN(0x8a7dc979, 0x4f7338e0),
8835 TOBN(0x211ecee9, 0x52d048db), TOBN(0x2eea4056, 0xc86ea3b8),
8836 TOBN(0xd8cb68a7, 0xba772b34), TOBN(0xe16ed341, 0x5f4e2541),
8837 TOBN(0x9b32f6a6, 0x0fec14db), TOBN(0xeee376f7, 0x391698be),
8838 TOBN(0xe9a7aa17, 0x83674c02), TOBN(0x65832f97, 0x5843022a),
8839 TOBN(0x29f3a8da, 0x5ba4990f), TOBN(0x79a59c3a, 0xfb8e3216),
8840 TOBN(0x9cdc4d2e, 0xbd19bb16), TOBN(0xc6c7cfd0, 0xb3262d86),
8841 TOBN(0xd4ce14d0, 0x969c0b47), TOBN(0x1fa352b7, 0x13e56128),
8842 TOBN(0x383d55b8, 0x973db6d3), TOBN(0x71836850, 0xe8e5b7bf),
8843 TOBN(0xc7714596, 0xe6bb571f), TOBN(0x259df31f, 0x2d5b2dd2),
8844 TOBN(0x568f8925, 0x913cc16d), TOBN(0x18bc5b6d, 0xe1a26f5a),
8845 TOBN(0xdfa413be, 0xf5f499ae), TOBN(0xf8835dec, 0xc3f0ae84),
8846 TOBN(0xb6e60bd8, 0x65a40ab0), TOBN(0x65596439, 0x194b377e),
8847 TOBN(0xbcd85625, 0x92084a69), TOBN(0x5ce433b9, 0x4f23ede0),
8848 TOBN(0xe8e8f04f, 0x6ad65143), TOBN(0x11511827, 0xd6e14af6),
8849 TOBN(0x3d390a10, 0x8295c0c7), TOBN(0x71e29ee4, 0x621eba16),
8850 TOBN(0xa588fc09, 0x63717b46), TOBN(0x02be02fe, 0xe06ad4a2),
8851 TOBN(0x931558c6, 0x04c22b22), TOBN(0xbb4d4bd6, 0x12f3c849),
8852 TOBN(0x54a4f496, 0x20efd662), TOBN(0x92ba6d20, 0xc5952d14),
8853 TOBN(0x2db8ea1e, 0xcc9784c2), TOBN(0x81cc10ca, 0x4b353644),
8854 TOBN(0x40b570ad, 0x4b4d7f6c), TOBN(0x5c9f1d96, 0x84a1dcd2),
8855 TOBN(0x01379f81, 0x3147e797), TOBN(0xe5c6097b, 0x2bd499f5),
8856 TOBN(0x40dcafa6, 0x328e5e20), TOBN(0xf7b5244a, 0x54815550),
8857 TOBN(0xb9a4f118, 0x47bfc978), TOBN(0x0ea0e79f, 0xd25825b1),
8858 TOBN(0xa50f96eb, 0x646c7ecf), TOBN(0xeb811493, 0x446dea9d),
8859 TOBN(0x2af04677, 0xdfabcf69), TOBN(0xbe3a068f, 0xc713f6e8),
8860 TOBN(0x860d523d, 0x42e06189), TOBN(0xbf077941, 0x4e3aff13),
8861 TOBN(0x0b616dca, 0xc1b20650), TOBN(0xe66dd6d1, 0x2131300d),
8862 TOBN(0xd4a0fd67, 0xff99abde), TOBN(0xc9903550, 0xc7aac50d),
8863 TOBN(0x022ecf8b, 0x7c46b2d7), TOBN(0x3333b1e8, 0x3abf92af),
8864 TOBN(0x11cc113c, 0x6c491c14), TOBN(0x05976688, 0x80dd3f88),
8865 TOBN(0xf5b4d9e7, 0x29d932ed), TOBN(0xe982aad8, 0xa2c38b6d),
8866 TOBN(0x6f925347, 0x8be0dcf0), TOBN(0x700080ae, 0x65ca53f2),
8867 TOBN(0xd8131156, 0x443ca77f), TOBN(0xe92d6942, 0xec51f984),
8868 TOBN(0xd2a08af8, 0x85dfe9ae), TOBN(0xd825d9a5, 0x4d2a86ca),
8869 TOBN(0x2c53988d, 0x39dff020), TOBN(0xf38b135a, 0x430cdc40),
8870 TOBN(0x0c918ae0, 0x62a7150b), TOBN(0xf31fd8de, 0x0c340e9b),
8871 TOBN(0xafa0e7ae, 0x4dbbf02e), TOBN(0x5847fb2a, 0x5eba6239),
8872 TOBN(0x6b1647dc, 0xdccbac8b), TOBN(0xb642aa78, 0x06f485c8),
8873 TOBN(0x873f3765, 0x7038ecdf), TOBN(0x2ce5e865, 0xfa49d3fe),
8874 TOBN(0xea223788, 0xc98c4400), TOBN(0x8104a8cd, 0xf1fa5279),
8875 TOBN(0xbcf7cc7a, 0x06becfd7), TOBN(0x49424316, 0xc8f974ae),
8876 TOBN(0xc0da65e7, 0x84d6365d), TOBN(0xbcb7443f, 0x8f759fb8),
8877 TOBN(0x35c712b1, 0x7ae81930), TOBN(0x80428dff, 0x4c6e08ab),
8878 TOBN(0xf19dafef, 0xa4faf843), TOBN(0xced8538d, 0xffa9855f),
8879 TOBN(0x20ac409c, 0xbe3ac7ce), TOBN(0x358c1fb6, 0x882da71e),
8880 TOBN(0xafa9c0e5, 0xfd349961), TOBN(0x2b2cfa51, 0x8421c2fc),
8881 TOBN(0x2a80db17, 0xf3a28d38), TOBN(0xa8aba539, 0x5d138e7e),
8882 TOBN(0x52012d1d, 0x6e96eb8d), TOBN(0x65d8dea0, 0xcbaf9622),
8883 TOBN(0x57735447, 0xb264f56c), TOBN(0xbeebef3f, 0x1b6c8da2),
8884 TOBN(0xfc346d98, 0xce785254), TOBN(0xd50e8d72, 0xbb64a161),
8885 TOBN(0xc03567c7, 0x49794add), TOBN(0x15a76065, 0x752c7ef6),
8886 TOBN(0x59f3a222, 0x961f23d6), TOBN(0x378e4438, 0x73ecc0b0),
8887 TOBN(0xc74be434, 0x5a82fde4), TOBN(0xae509af2, 0xd8b9cf34),
8888 TOBN(0x4a61ee46, 0x577f44a1), TOBN(0xe09b748c, 0xb611deeb),
8889 TOBN(0xc0481b2c, 0xf5f7b884), TOBN(0x35626678, 0x61acfa6b),
8890 TOBN(0x37f4c518, 0xbf8d21e6), TOBN(0x22d96531, 0xb205a76d),
8891 TOBN(0x37fb85e1, 0x954073c0), TOBN(0xbceafe4f, 0x65b3a567),
8892 TOBN(0xefecdef7, 0xbe42a582), TOBN(0xd3fc6080, 0x65046be6),
8893 TOBN(0xc9af13c8, 0x09e8dba9), TOBN(0x1e6c9847, 0x641491ff),
8894 TOBN(0x3b574925, 0xd30c31f7), TOBN(0xb7eb72ba, 0xac2a2122),
8895 TOBN(0x776a0dac, 0xef0859e7), TOBN(0x06fec314, 0x21900942),
8896 TOBN(0x2464bc10, 0xf8c22049), TOBN(0x9bfbcce7, 0x875ebf69),
8897 TOBN(0xd7a88e2a, 0x4336326b), TOBN(0xda05261c, 0x5bc2acfa),
8898 TOBN(0xc29f5bdc, 0xeba7efc8), TOBN(0x471237ca, 0x25dbbf2e),
8899 TOBN(0xa72773f2, 0x2975f127), TOBN(0xdc744e8e, 0x04d0b326),
8900 TOBN(0x38a7ed16, 0xa56edb73), TOBN(0x64357e37, 0x2c007e70),
8901 TOBN(0xa167d15b, 0x5080b400), TOBN(0x07b41164, 0x23de4be1),
8902 TOBN(0xb2d91e32, 0x74c89883), TOBN(0x3c162821, 0x2882e7ed),
8903 TOBN(0xad6b36ba, 0x7503e482), TOBN(0x48434e8e, 0x0ea34331),
8904 TOBN(0x79f4f24f, 0x2c7ae0b9), TOBN(0xc46fbf81, 0x1939b44a),
8905 TOBN(0x76fefae8, 0x56595eb1), TOBN(0x417b66ab, 0xcd5f29c7),
8906 TOBN(0x5f2332b2, 0xc5ceec20), TOBN(0xd69661ff, 0xe1a1cae2),
8907 TOBN(0x5ede7e52, 0x9b0286e6), TOBN(0x9d062529, 0xe276b993),
8908 TOBN(0x324794b0, 0x7e50122b), TOBN(0xdd744f8b, 0x4af07ca5),
8909 TOBN(0x30a12f08, 0xd63fc97b), TOBN(0x39650f1a, 0x76626d9d),
8910 TOBN(0x101b47f7, 0x1fa38477), TOBN(0x3d815f19, 0xd4dc124f),
8911 TOBN(0x1569ae95, 0xb26eb58a), TOBN(0xc3cde188, 0x95fb1887),
8912 TOBN(0x54e9f37b, 0xf9539a48), TOBN(0xb0100e06, 0x7408c1a5),
8913 TOBN(0x821d9811, 0xea580cbb), TOBN(0x8af52d35, 0x86e50c56),
8914 TOBN(0xdfbd9d47, 0xdbbf698b), TOBN(0x2961a1ea, 0x03dc1c73),
8915 TOBN(0x203d38f8, 0xe76a5df8), TOBN(0x08a53a68, 0x6def707a),
8916 TOBN(0x26eefb48, 0x1bee45d4), TOBN(0xb3cee346, 0x3c688036),
8917 TOBN(0x463c5315, 0xc42f2469), TOBN(0x19d84d2e, 0x81378162),
8918 TOBN(0x22d7c3c5, 0x1c4d349f), TOBN(0x65965844, 0x163d59c5),
8919 TOBN(0xcf198c56, 0xb8abceae), TOBN(0x6fb1fb1b, 0x628559d5),
8920 TOBN(0x8bbffd06, 0x07bf8fe3), TOBN(0x46259c58, 0x3467734b),
8921 TOBN(0xd8953cea, 0x35f7f0d3), TOBN(0x1f0bece2, 0xd65b0ff1),
8922 TOBN(0xf7d5b4b3, 0xf3c72914), TOBN(0x29e8ea95, 0x3cb53389),
8923 TOBN(0x4a365626, 0x836b6d46), TOBN(0xe849f910, 0xea174fde),
8924 TOBN(0x7ec62fbb, 0xf4737f21), TOBN(0xd8dba5ab, 0x6209f5ac),
8925 TOBN(0x24b5d7a9, 0xa5f9adbe), TOBN(0x707d28f7, 0xa61dc768),
8926 TOBN(0x7711460b, 0xcaa999ea), TOBN(0xba7b174d, 0x1c92e4cc),
8927 TOBN(0x3c4bab66, 0x18d4bf2d), TOBN(0xb8f0c980, 0xeb8bd279),
8928 TOBN(0x024bea9a, 0x324b4737), TOBN(0xfba9e423, 0x32a83bca),
8929 TOBN(0x6e635643, 0xa232dced), TOBN(0x99619367, 0x2571c8ba),
8930 TOBN(0xe8c9f357, 0x54b7032b), TOBN(0xf936b3ba, 0x2442d54a),
8931 TOBN(0x2263f0f0, 0x8290c65a), TOBN(0x48989780, 0xee2c7fdb),
8932 TOBN(0xadc5d55a, 0x13d4f95e), TOBN(0x737cff85, 0xad9b8500),
8933 TOBN(0x271c557b, 0x8a73f43d), TOBN(0xbed617a4, 0xe18bc476),
8934 TOBN(0x66245401, 0x7dfd8ab2), TOBN(0xae7b89ae, 0x3a2870aa),
8935 TOBN(0x1b555f53, 0x23a7e545), TOBN(0x6791e247, 0xbe057e4c),
8936 TOBN(0x860136ad, 0x324fa34d), TOBN(0xea111447, 0x4cbeae28),
8937 TOBN(0x023a4270, 0xbedd3299), TOBN(0x3d5c3a7f, 0xc1c35c34),
8938 TOBN(0xb0f6db67, 0x8d0412d2), TOBN(0xd92625e2, 0xfcdc6b9a),
8939 TOBN(0x92ae5ccc, 0x4e28a982), TOBN(0xea251c36, 0x47a3ce7e),
8940 TOBN(0x9d658932, 0x790691bf), TOBN(0xed610589, 0x06b736ae),
8941 TOBN(0x712c2f04, 0xc0d63b6e), TOBN(0x5cf06fd5, 0xc63d488f),
8942 TOBN(0x97363fac, 0xd9588e41), TOBN(0x1f9bf762, 0x2b93257e),
8943 TOBN(0xa9d1ffc4, 0x667acace), TOBN(0x1cf4a1aa, 0x0a061ecf),
8944 TOBN(0x40e48a49, 0xdc1818d0), TOBN(0x0643ff39, 0xa3621ab0),
8945 TOBN(0x5768640c, 0xe39ef639), TOBN(0x1fc099ea, 0x04d86854),
8946 TOBN(0x9130b9c3, 0xeccd28fd), TOBN(0xd743cbd2, 0x7eec54ab),
8947 TOBN(0x052b146f, 0xe5b475b6), TOBN(0x058d9a82, 0x900a7d1f),
8948 TOBN(0x65e02292, 0x91262b72), TOBN(0x96f924f9, 0xbb0edf03),
8949 TOBN(0x5cfa59c8, 0xfe206842), TOBN(0xf6037004, 0x5eafa720),
8950 TOBN(0x5f30699e, 0x18d7dd96), TOBN(0x381e8782, 0xcbab2495),
8951 TOBN(0x91669b46, 0xdd8be949), TOBN(0xb40606f5, 0x26aae8ef),
8952 TOBN(0x2812b839, 0xfc6751a4), TOBN(0x16196214, 0xfba800ef),
8953 TOBN(0x4398d5ca, 0x4c1a2875), TOBN(0x720c00ee, 0x653d8349),
8954 TOBN(0xc2699eb0, 0xd820007c), TOBN(0x880ee660, 0xa39b5825),
8955 TOBN(0x70694694, 0x471f6984), TOBN(0xf7d16ea8, 0xe3dda99a),
8956 TOBN(0x28d675b2, 0xc0519a23), TOBN(0x9ebf94fe, 0x4f6952e3),
8957 TOBN(0xf28bb767, 0xa2294a8a), TOBN(0x85512b4d, 0xfe0af3f5),
8958 TOBN(0x18958ba8, 0x99b16a0d), TOBN(0x95c2430c, 0xba7548a7),
8959 TOBN(0xb30d1b10, 0xa16be615), TOBN(0xe3ebbb97, 0x85bfb74c),
8960 TOBN(0xa3273cfe, 0x18549fdb), TOBN(0xf6e200bf, 0x4fcdb792),
8961 TOBN(0x54a76e18, 0x83aba56c), TOBN(0x73ec66f6, 0x89ef6aa2),
8962 TOBN(0x8d17add7, 0xd1b9a305), TOBN(0xa959c5b9, 0xb7ae1b9d),
8963 TOBN(0x88643522, 0x6bcc094a), TOBN(0xcc5616c4, 0xd7d429b9),
8964 TOBN(0xa6dada01, 0xe6a33f7c), TOBN(0xc6217a07, 0x9d4e70ad),
8965 TOBN(0xd619a818, 0x09c15b7c), TOBN(0xea06b329, 0x0e80c854),
8966 TOBN(0x174811ce, 0xa5f5e7b9), TOBN(0x66dfc310, 0x787c65f4),
8967 TOBN(0x4ea7bd69, 0x3316ab54), TOBN(0xc12c4acb, 0x1dcc0f70),
8968 TOBN(0xe4308d1a, 0x1e407dd9), TOBN(0xe8a3587c, 0x91afa997),
8969 TOBN(0xea296c12, 0xab77b7a5), TOBN(0xb5ad49e4, 0x673c0d52),
8970 TOBN(0x40f9b2b2, 0x7006085a), TOBN(0xa88ff340, 0x87bf6ec2),
8971 TOBN(0x978603b1, 0x4e3066a6), TOBN(0xb3f99fc2, 0xb5e486e2),
8972 TOBN(0x07b53f5e, 0xb2e63645), TOBN(0xbe57e547, 0x84c84232),
8973 TOBN(0xd779c216, 0x7214d5cf), TOBN(0x617969cd, 0x029a3aca),
8974 TOBN(0xd17668cd, 0x8a7017a0), TOBN(0x77b4d19a, 0xbe9b7ee8),
8975 TOBN(0x58fd0e93, 0x9c161776), TOBN(0xa8c4f4ef, 0xd5968a72),
8976 TOBN(0x296071cc, 0x67b3de77), TOBN(0xae3c0b8e, 0x634f7905),
8977 TOBN(0x67e440c2, 0x8a7100c9), TOBN(0xbb8c3c1b, 0xeb4b9b42),
8978 TOBN(0x6d71e8ea, 0xc51b3583), TOBN(0x7591f5af, 0x9525e642),
8979 TOBN(0xf73a2f7b, 0x13f509f3), TOBN(0x618487aa, 0x5619ac9b),
8980 TOBN(0x3a72e5f7, 0x9d61718a), TOBN(0x00413bcc, 0x7592d28c),
8981 TOBN(0x7d9b11d3, 0x963c35cf), TOBN(0x77623bcf, 0xb90a46ed),
8982 TOBN(0xdeef273b, 0xdcdd2a50), TOBN(0x4a741f9b, 0x0601846e),
8983 TOBN(0x33b89e51, 0x0ec6e929), TOBN(0xcb02319f, 0x8b7f22cd),
8984 TOBN(0xbbe1500d, 0x084bae24), TOBN(0x2f0ae8d7, 0x343d2693),
8985 TOBN(0xacffb5f2, 0x7cdef811), TOBN(0xaa0c030a, 0x263fb94f),
8986 TOBN(0x6eef0d61, 0xa0f442de), TOBN(0xf92e1817, 0x27b139d3),
8987 TOBN(0x1ae6deb7, 0x0ad8bc28), TOBN(0xa89e38dc, 0xc0514130),
8988 TOBN(0x81eeb865, 0xd2fdca23), TOBN(0x5a15ee08, 0xcc8ef895),
8989 TOBN(0x768fa10a, 0x01905614), TOBN(0xeff5b8ef, 0x880ee19b),
8990 TOBN(0xf0c0cabb, 0xcb1c8a0e), TOBN(0x2e1ee9cd, 0xb8c838f9),
8991 TOBN(0x0587d8b8, 0x8a4a14c0), TOBN(0xf6f27896, 0x2ff698e5),
8992 TOBN(0xed38ef1c, 0x89ee6256), TOBN(0xf44ee1fe, 0x6b353b45),
8993 TOBN(0x9115c0c7, 0x70e903b3), TOBN(0xc78ec0a1, 0x818f31df),
8994 TOBN(0x6c003324, 0xb7dccbc6), TOBN(0xd96dd1f3, 0x163bbc25),
8995 TOBN(0x33aa82dd, 0x5cedd805), TOBN(0x123aae4f, 0x7f7eb2f1),
8996 TOBN(0x1723fcf5, 0xa26262cd), TOBN(0x1f7f4d5d, 0x0060ebd5),
8997 TOBN(0xf19c5c01, 0xb2eaa3af), TOBN(0x2ccb9b14, 0x9790accf),
8998 TOBN(0x1f9c1cad, 0x52324aa6), TOBN(0x63200526, 0x7247df54),
8999 TOBN(0x5732fe42, 0xbac96f82), TOBN(0x52fe771f, 0x01a1c384),
9000 TOBN(0x546ca13d, 0xb1001684), TOBN(0xb56b4eee, 0xa1709f75),
9001 TOBN(0x266545a9, 0xd5db8672), TOBN(0xed971c90, 0x1e8f3cfb),
9002 TOBN(0x4e7d8691, 0xe3a07b29), TOBN(0x7570d9ec, 0xe4b696b9),
9003 TOBN(0xdc5fa067, 0x7bc7e9ae), TOBN(0x68b44caf, 0xc82c4844),
9004 TOBN(0x519d34b3, 0xbf44da80), TOBN(0x283834f9, 0x5ab32e66),
9005 TOBN(0x6e608797, 0x6278a000), TOBN(0x1e62960e, 0x627312f6),
9006 TOBN(0x9b87b27b, 0xe6901c55), TOBN(0x80e78538, 0x24fdbc1f),
9007 TOBN(0xbbbc0951, 0x2facc27d), TOBN(0x06394239, 0xac143b5a),
9008 TOBN(0x35bb4a40, 0x376c1944), TOBN(0x7cb62694, 0x63da1511),
9009 TOBN(0xafd29161, 0xb7148a3b), TOBN(0xa6f9d9ed, 0x4e2ea2ee),
9010 TOBN(0x15dc2ca2, 0x880dd212), TOBN(0x903c3813, 0xa61139a9),
9011 TOBN(0x2aa7b46d, 0x6c0f8785), TOBN(0x36ce2871, 0x901c60ff),
9012 TOBN(0xc683b028, 0xe10d9c12), TOBN(0x7573baa2, 0x032f33d3),
9013 TOBN(0x87a9b1f6, 0x67a31b58), TOBN(0xfd3ed11a, 0xf4ffae12),
9014 TOBN(0x83dcaa9a, 0x0cb2748e), TOBN(0x8239f018, 0x5d6fdf16),
9015 TOBN(0xba67b49c, 0x72753941), TOBN(0x2beec455, 0xc321cb36),
9016 TOBN(0x88015606, 0x3f8b84ce), TOBN(0x76417083, 0x8d38c86f),
9017 TOBN(0x054f1ca7, 0x598953dd), TOBN(0xc939e110, 0x4e8e7429),
9018 TOBN(0x9b1ac2b3, 0x5a914f2f), TOBN(0x39e35ed3, 0xe74b8f9c),
9019 TOBN(0xd0debdb2, 0x781b2fb0), TOBN(0x1585638f, 0x2d997ba2),
9020 TOBN(0x9c4b646e, 0x9e2fce99), TOBN(0x68a21081, 0x1e80857f),
9021 TOBN(0x06d54e44, 0x3643b52a), TOBN(0xde8d6d63, 0x0d8eb843),
9022 TOBN(0x70321563, 0x42146a0a), TOBN(0x8ba826f2, 0x5eaa3622),
9023 TOBN(0x227a58bd, 0x86138787), TOBN(0x43b6c03c, 0x10281d37),
9024 TOBN(0x6326afbb, 0xb54dde39), TOBN(0x744e5e8a, 0xdb6f2d5f),
9025 TOBN(0x48b2a99a, 0xcff158e1), TOBN(0xa93c8fa0, 0xef87918f),
9026 TOBN(0x2182f956, 0xde058c5c), TOBN(0x216235d2, 0x936f9e7a),
9027 TOBN(0xace0c0db, 0xd2e31e67), TOBN(0xc96449bf, 0xf23ac3e7),
9028 TOBN(0x7e9a2874, 0x170693bd), TOBN(0xa28e14fd, 0xa45e6335),
9029 TOBN(0x5757f6b3, 0x56427344), TOBN(0x822e4556, 0xacf8edf9),
9030 TOBN(0x2b7a6ee2, 0xe6a285cd), TOBN(0x5866f211, 0xa9df3af0),
9031 TOBN(0x40dde2dd, 0xf845b844), TOBN(0x986c3726, 0x110e5e49),
9032 TOBN(0x73680c2a, 0xf7172277), TOBN(0x57b94f0f, 0x0cccb244),
9033 TOBN(0xbdff7267, 0x2d438ca7), TOBN(0xbad1ce11, 0xcf4663fd),
9034 TOBN(0x9813ed9d, 0xd8f71cae), TOBN(0xf43272a6, 0x961fdaa6),
9035 TOBN(0xbeff0119, 0xbd6d1637), TOBN(0xfebc4f91, 0x30361978),
9036 TOBN(0x02b37a95, 0x2f41deff), TOBN(0x0e44a59a, 0xe63b89b7),
9037 TOBN(0x673257dc, 0x143ff951), TOBN(0x19c02205, 0xd752baf4),
9038 TOBN(0x46c23069, 0xc4b7d692), TOBN(0x2e6392c3, 0xfd1502ac),
9039 TOBN(0x6057b1a2, 0x1b220846), TOBN(0xe51ff946, 0x0c1b5b63),
9040 },
9041 {
9042 TOBN(0x6e85cb51, 0x566c5c43), TOBN(0xcff9c919, 0x3597f046),
9043 TOBN(0x9354e90c, 0x4994d94a), TOBN(0xe0a39332, 0x2147927d),
9044 TOBN(0x8427fac1, 0x0dc1eb2b), TOBN(0x88cfd8c2, 0x2ff319fa),
9045 TOBN(0xe2d4e684, 0x01965274), TOBN(0xfa2e067d, 0x67aaa746),
9046 TOBN(0xb6d92a7f, 0x3e5f9f11), TOBN(0x9afe153a, 0xd6cb3b8e),
9047 TOBN(0x4d1a6dd7, 0xddf800bd), TOBN(0xf6c13cc0, 0xcaf17e19),
9048 TOBN(0x15f6c58e, 0x325fc3ee), TOBN(0x71095400, 0xa31dc3b2),
9049 TOBN(0x168e7c07, 0xafa3d3e7), TOBN(0x3f8417a1, 0x94c7ae2d),
9050 TOBN(0xec234772, 0x813b230d), TOBN(0x634d0f5f, 0x17344427),
9051 TOBN(0x11548ab1, 0xd77fc56a), TOBN(0x7fab1750, 0xce06af77),
9052 TOBN(0xb62c10a7, 0x4f7c4f83), TOBN(0xa7d2edc4, 0x220a67d9),
9053 TOBN(0x1c404170, 0x921209a0), TOBN(0x0b9815a0, 0xface59f0),
9054 TOBN(0x2842589b, 0x319540c3), TOBN(0x18490f59, 0xa283d6f8),
9055 TOBN(0xa2731f84, 0xdaae9fcb), TOBN(0x3db6d960, 0xc3683ba0),
9056 TOBN(0xc85c63bb, 0x14611069), TOBN(0xb19436af, 0x0788bf05),
9057 TOBN(0x905459df, 0x347460d2), TOBN(0x73f6e094, 0xe11a7db1),
9058 TOBN(0xdc7f938e, 0xb6357f37), TOBN(0xc5d00f79, 0x2bd8aa62),
9059 TOBN(0xc878dcb9, 0x2ca979fc), TOBN(0x37e83ed9, 0xeb023a99),
9060 TOBN(0x6b23e273, 0x1560bf3d), TOBN(0x1086e459, 0x1d0fae61),
9061 TOBN(0x78248316, 0x9a9414bd), TOBN(0x1b956bc0, 0xf0ea9ea1),
9062 TOBN(0x7b85bb91, 0xc31b9c38), TOBN(0x0c5aa90b, 0x48ef57b5),
9063 TOBN(0xdedeb169, 0xaf3bab6f), TOBN(0xe610ad73, 0x2d373685),
9064 TOBN(0xf13870df, 0x02ba8e15), TOBN(0x0337edb6, 0x8ca7f771),
9065 TOBN(0xe4acf747, 0xb62c036c), TOBN(0xd921d576, 0xb6b94e81),
9066 TOBN(0xdbc86439, 0x2c422f7a), TOBN(0xfb635362, 0xed348898),
9067 TOBN(0x83084668, 0xc45bfcd1), TOBN(0xc357c9e3, 0x2b315e11),
9068 TOBN(0xb173b540, 0x5b2e5b8c), TOBN(0x7e946931, 0xe102b9a4),
9069 TOBN(0x17c890eb, 0x7b0fb199), TOBN(0xec225a83, 0xd61b662b),
9070 TOBN(0xf306a3c8, 0xee3c76cb), TOBN(0x3cf11623, 0xd32a1f6e),
9071 TOBN(0xe6d5ab64, 0x6863e956), TOBN(0x3b8a4cbe, 0x5c005c26),
9072 TOBN(0xdcd529a5, 0x9ce6bb27), TOBN(0xc4afaa52, 0x04d4b16f),
9073 TOBN(0xb0624a26, 0x7923798d), TOBN(0x85e56df6, 0x6b307fab),
9074 TOBN(0x0281893c, 0x2bf29698), TOBN(0x91fc19a4, 0xd7ce7603),
9075 TOBN(0x75a5dca3, 0xad9a558f), TOBN(0x40ceb3fa, 0x4d50bf77),
9076 TOBN(0x1baf6060, 0xbc9ba369), TOBN(0x927e1037, 0x597888c2),
9077 TOBN(0xd936bf19, 0x86a34c07), TOBN(0xd4cf10c1, 0xc34ae980),
9078 TOBN(0x3a3e5334, 0x859dd614), TOBN(0x9c475b5b, 0x18d0c8ee),
9079 TOBN(0x63080d1f, 0x07cd51d5), TOBN(0xc9c0d0a6, 0xb88b4326),
9080 TOBN(0x1ac98691, 0xc234296f), TOBN(0x2a0a83a4, 0x94887fb6),
9081 TOBN(0x56511427, 0x0cea9cf2), TOBN(0x5230a6e8, 0xa24802f5),
9082 TOBN(0xf7a2bf0f, 0x72e3d5c1), TOBN(0x37717446, 0x4f21439e),
9083 TOBN(0xfedcbf25, 0x9ce30334), TOBN(0xe0030a78, 0x7ce202f9),
9084 TOBN(0x6f2d9ebf, 0x1202e9ca), TOBN(0xe79dde6c, 0x75e6e591),
9085 TOBN(0xf52072af, 0xf1dac4f8), TOBN(0x6c8d087e, 0xbb9b404d),
9086 TOBN(0xad0fc73d, 0xbce913af), TOBN(0x909e587b, 0x458a07cb),
9087 TOBN(0x1300da84, 0xd4f00c8a), TOBN(0x425cd048, 0xb54466ac),
9088 TOBN(0xb59cb9be, 0x90e9d8bf), TOBN(0x991616db, 0x3e431b0e),
9089 TOBN(0xd3aa117a, 0x531aecff), TOBN(0x91af92d3, 0x59f4dc3b),
9090 TOBN(0x9b1ec292, 0xe93fda29), TOBN(0x76bb6c17, 0xe97d91bc),
9091 TOBN(0x7509d95f, 0xaface1e6), TOBN(0x3653fe47, 0xbe855ae3),
9092 TOBN(0x73180b28, 0x0f680e75), TOBN(0x75eefd1b, 0xeeb6c26c),
9093 TOBN(0xa4cdf29f, 0xb66d4236), TOBN(0x2d70a997, 0x6b5821d8),
9094 TOBN(0x7a3ee207, 0x20445c36), TOBN(0x71d1ac82, 0x59877174),
9095 TOBN(0x0fc539f7, 0x949f73e9), TOBN(0xd05cf3d7, 0x982e3081),
9096 TOBN(0x8758e20b, 0x7b1c7129), TOBN(0xffadcc20, 0x569e61f2),
9097 TOBN(0xb05d3a2f, 0x59544c2d), TOBN(0xbe16f5c1, 0x9fff5e53),
9098 TOBN(0x73cf65b8, 0xaad58135), TOBN(0x622c2119, 0x037aa5be),
9099 TOBN(0x79373b3f, 0x646fd6a0), TOBN(0x0e029db5, 0x0d3978cf),
9100 TOBN(0x8bdfc437, 0x94fba037), TOBN(0xaefbd687, 0x620797a6),
9101 TOBN(0x3fa5382b, 0xbd30d38e), TOBN(0x7627cfbf, 0x585d7464),
9102 TOBN(0xb2330fef, 0x4e4ca463), TOBN(0xbcef7287, 0x3566cc63),
9103 TOBN(0xd161d2ca, 0xcf780900), TOBN(0x135dc539, 0x5b54827d),
9104 TOBN(0x638f052e, 0x27bf1bc6), TOBN(0x10a224f0, 0x07dfa06c),
9105 TOBN(0xe973586d, 0x6d3321da), TOBN(0x8b0c5738, 0x26152c8f),
9106 TOBN(0x07ef4f2a, 0x34606074), TOBN(0x80fe7fe8, 0xa0f7047a),
9107 TOBN(0x3d1a8152, 0xe1a0e306), TOBN(0x32cf43d8, 0x88da5222),
9108 TOBN(0xbf89a95f, 0x5f02ffe6), TOBN(0x3d9eb9a4, 0x806ad3ea),
9109 TOBN(0x012c17bb, 0x79c8e55e), TOBN(0xfdcd1a74, 0x99c81dac),
9110 TOBN(0x7043178b, 0xb9556098), TOBN(0x4090a1df, 0x801c3886),
9111 TOBN(0x759800ff, 0x9b67b912), TOBN(0x3e5c0304, 0x232620c8),
9112 TOBN(0x4b9d3c4b, 0x70dceeca), TOBN(0xbb2d3c15, 0x181f648e),
9113 TOBN(0xf981d837, 0x6e33345c), TOBN(0xb626289b, 0x0cf2297a),
9114 TOBN(0x766ac659, 0x8baebdcf), TOBN(0x1a28ae09, 0x75df01e5),
9115 TOBN(0xb71283da, 0x375876d8), TOBN(0x4865a96d, 0x607b9800),
9116 TOBN(0x25dd1bcd, 0x237936b2), TOBN(0x332f4f4b, 0x60417494),
9117 TOBN(0xd0923d68, 0x370a2147), TOBN(0x497f5dfb, 0xdc842203),
9118 TOBN(0x9dc74cbd, 0x32be5e0f), TOBN(0x7475bcb7, 0x17a01375),
9119 TOBN(0x438477c9, 0x50d872b1), TOBN(0xcec67879, 0xffe1d63d),
9120 TOBN(0x9b006014, 0xd8578c70), TOBN(0xc9ad99a8, 0x78bb6b8b),
9121 TOBN(0x6799008e, 0x11fb3806), TOBN(0xcfe81435, 0xcd44cab3),
9122 TOBN(0xa2ee1582, 0x2f4fb344), TOBN(0xb8823450, 0x483fa6eb),
9123 TOBN(0x622d323d, 0x652c7749), TOBN(0xd8474a98, 0xbeb0a15b),
9124 TOBN(0xe43c154d, 0x5d1c00d0), TOBN(0x7fd581d9, 0x0e3e7aac),
9125 TOBN(0x2b44c619, 0x2525ddf8), TOBN(0x67a033eb, 0xb8ae9739),
9126 TOBN(0x113ffec1, 0x9ef2d2e4), TOBN(0x1bf6767e, 0xd5a0ea7f),
9127 TOBN(0x57fff75e, 0x03714c0a), TOBN(0xa23c422e, 0x0a23e9ee),
9128 TOBN(0xdd5f6b2d, 0x540f83af), TOBN(0xc2c2c27e, 0x55ea46a7),
9129 TOBN(0xeb6b4246, 0x672a1208), TOBN(0xd13599f7, 0xae634f7a),
9130 TOBN(0xcf914b5c, 0xd7b32c6e), TOBN(0x61a5a640, 0xeaf61814),
9131 TOBN(0x8dc3df8b, 0x208a1bbb), TOBN(0xef627fd6, 0xb6d79aa5),
9132 TOBN(0x44232ffc, 0xc4c86bc8), TOBN(0xe6f9231b, 0x061539fe),
9133 TOBN(0x1d04f25a, 0x958b9533), TOBN(0x180cf934, 0x49e8c885),
9134 TOBN(0x89689595, 0x9884aaf7), TOBN(0xb1959be3, 0x07b348a6),
9135 TOBN(0x96250e57, 0x3c147c87), TOBN(0xae0efb3a, 0xdd0c61f8),
9136 TOBN(0xed00745e, 0xca8c325e), TOBN(0x3c911696, 0xecff3f70),
9137 TOBN(0x73acbc65, 0x319ad41d), TOBN(0x7b01a020, 0xf0b1c7ef),
9138 TOBN(0xea32b293, 0x63a1483f), TOBN(0x89eabe71, 0x7a248f96),
9139 TOBN(0x9c6231d3, 0x343157e5), TOBN(0x93a375e5, 0xdf3c546d),
9140 TOBN(0xe76e9343, 0x6a2afe69), TOBN(0xc4f89100, 0xe166c88e),
9141 TOBN(0x248efd0d, 0x4f872093), TOBN(0xae0eb3ea, 0x8fe0ea61),
9142 TOBN(0xaf89790d, 0x9d79046e), TOBN(0x4d650f2d, 0x6cee0976),
9143 TOBN(0xa3935d9a, 0x43071eca), TOBN(0x66fcd2c9, 0x283b0bfe),
9144 TOBN(0x0e665eb5, 0x696605f1), TOBN(0xe77e5d07, 0xa54cd38d),
9145 TOBN(0x90ee050a, 0x43d950cf), TOBN(0x86ddebda, 0xd32e69b5),
9146 TOBN(0x6ad94a3d, 0xfddf7415), TOBN(0xf7fa1309, 0x3f6e8d5a),
9147 TOBN(0xc4831d1d, 0xe9957f75), TOBN(0x7de28501, 0xd5817447),
9148 TOBN(0x6f1d7078, 0x9e2aeb6b), TOBN(0xba2b9ff4, 0xf67a53c2),
9149 TOBN(0x36963767, 0xdf9defc3), TOBN(0x479deed3, 0x0d38022c),
9150 TOBN(0xd2edb89b, 0x3a8631e8), TOBN(0x8de855de, 0x7a213746),
9151 TOBN(0xb2056cb7, 0xb00c5f11), TOBN(0xdeaefbd0, 0x2c9b85e4),
9152 TOBN(0x03f39a8d, 0xd150892d), TOBN(0x37b84686, 0x218b7985),
9153 TOBN(0x36296dd8, 0xb7375f1a), TOBN(0x472cd4b1, 0xb78e898e),
9154 TOBN(0x15dff651, 0xe9f05de9), TOBN(0xd4045069, 0x2ce98ba9),
9155 TOBN(0x8466a7ae, 0x9b38024c), TOBN(0xb910e700, 0xe5a6b5ef),
9156 TOBN(0xae1c56ea, 0xb3aa8f0d), TOBN(0xbab2a507, 0x7eee74a6),
9157 TOBN(0x0dca11e2, 0x4b4c4620), TOBN(0xfd896e2e, 0x4c47d1f4),
9158 TOBN(0xeb45ae53, 0x308fbd93), TOBN(0x46cd5a2e, 0x02c36fda),
9159 TOBN(0x6a3d4e90, 0xbaa48385), TOBN(0xdd55e62e, 0x9dbe9960),
9160 TOBN(0xa1406aa0, 0x2a81ede7), TOBN(0x6860dd14, 0xf9274ea7),
9161 TOBN(0xcfdcb0c2, 0x80414f86), TOBN(0xff410b10, 0x22f94327),
9162 TOBN(0x5a33cc38, 0x49ad467b), TOBN(0xefb48b6c, 0x0a7335f1),
9163 TOBN(0x14fb54a4, 0xb153a360), TOBN(0x604aa9d2, 0xb52469cc),
9164 TOBN(0x5e9dc486, 0x754e48e9), TOBN(0x693cb455, 0x37471e8e),
9165 TOBN(0xfb2fd7cd, 0x8d3b37b6), TOBN(0x63345e16, 0xcf09ff07),
9166 TOBN(0x9910ba6b, 0x23a5d896), TOBN(0x1fe19e35, 0x7fe4364e),
9167 TOBN(0x6e1da8c3, 0x9a33c677), TOBN(0x15b4488b, 0x29fd9fd0),
9168 TOBN(0x1f439254, 0x1a1f22bf), TOBN(0x920a8a70, 0xab8163e8),
9169 TOBN(0x3fd1b249, 0x07e5658e), TOBN(0xf2c4f79c, 0xb6ec839b),
9170 TOBN(0x1abbc3d0, 0x4aa38d1b), TOBN(0x3b0db35c, 0xb5d9510e),
9171 TOBN(0x1754ac78, 0x3e60dec0), TOBN(0x53272fd7, 0xea099b33),
9172 TOBN(0x5fb0494f, 0x07a8e107), TOBN(0x4a89e137, 0x6a8191fa),
9173 TOBN(0xa113b7f6, 0x3c4ad544), TOBN(0x88a2e909, 0x6cb9897b),
9174 TOBN(0x17d55de3, 0xb44a3f84), TOBN(0xacb2f344, 0x17c6c690),
9175 TOBN(0x32088168, 0x10232390), TOBN(0xf2e8a61f, 0x6c733bf7),
9176 TOBN(0xa774aab6, 0x9c2d7652), TOBN(0xfb5307e3, 0xed95c5bc),
9177 TOBN(0xa05c73c2, 0x4981f110), TOBN(0x1baae31c, 0xa39458c9),
9178 TOBN(0x1def185b, 0xcbea62e7), TOBN(0xe8ac9eae, 0xeaf63059),
9179 TOBN(0x098a8cfd, 0x9921851c), TOBN(0xd959c3f1, 0x3abe2f5b),
9180 TOBN(0xa4f19525, 0x20e40ae5), TOBN(0x320789e3, 0x07a24aa1),
9181 TOBN(0x259e6927, 0x7392b2bc), TOBN(0x58f6c667, 0x1918668b),
9182 TOBN(0xce1db2bb, 0xc55d2d8b), TOBN(0x41d58bb7, 0xf4f6ca56),
9183 TOBN(0x7650b680, 0x8f877614), TOBN(0x905e16ba, 0xf4c349ed),
9184 TOBN(0xed415140, 0xf661acac), TOBN(0x3b8784f0, 0xcb2270af),
9185 TOBN(0x3bc280ac, 0x8a402cba), TOBN(0xd53f7146, 0x0937921a),
9186 TOBN(0xc03c8ee5, 0xe5681e83), TOBN(0x62126105, 0xf6ac9e4a),
9187 TOBN(0x9503a53f, 0x936b1a38), TOBN(0x3d45e2d4, 0x782fecbd),
9188 TOBN(0x69a5c439, 0x76e8ae98), TOBN(0xb53b2eeb, 0xbfb4b00e),
9189 TOBN(0xf1674712, 0x72386c89), TOBN(0x30ca34a2, 0x4268bce4),
9190 TOBN(0x7f1ed86c, 0x78341730), TOBN(0x8ef5beb8, 0xb525e248),
9191 TOBN(0xbbc489fd, 0xb74fbf38), TOBN(0x38a92a0e, 0x91a0b382),
9192 TOBN(0x7a77ba3f, 0x22433ccf), TOBN(0xde8362d6, 0xa29f05a9),
9193 TOBN(0x7f6a30ea, 0x61189afc), TOBN(0x693b5505, 0x59ef114f),
9194 TOBN(0x50266bc0, 0xcd1797a1), TOBN(0xea17b47e, 0xf4b7af2d),
9195 TOBN(0xd6c4025c, 0x3df9483e), TOBN(0x8cbb9d9f, 0xa37b18c9),
9196 TOBN(0x91cbfd9c, 0x4d8424cf), TOBN(0xdb7048f1, 0xab1c3506),
9197 TOBN(0x9eaf641f, 0x028206a3), TOBN(0xf986f3f9, 0x25bdf6ce),
9198 TOBN(0x262143b5, 0x224c08dc), TOBN(0x2bbb09b4, 0x81b50c91),
9199 TOBN(0xc16ed709, 0xaca8c84f), TOBN(0xa6210d9d, 0xb2850ca8),
9200 TOBN(0x6d8df67a, 0x09cb54d6), TOBN(0x91eef6e0, 0x500919a4),
9201 TOBN(0x90f61381, 0x0f132857), TOBN(0x9acede47, 0xf8d5028b),
9202 TOBN(0x844d1b71, 0x90b771c3), TOBN(0x563b71e4, 0xba6426be),
9203 TOBN(0x2efa2e83, 0xbdb802ff), TOBN(0x3410cbab, 0xab5b4a41),
9204 TOBN(0x555b2d26, 0x30da84dd), TOBN(0xd0711ae9, 0xee1cc29a),
9205 TOBN(0xcf3e8c60, 0x2f547792), TOBN(0x03d7d5de, 0xdc678b35),
9206 TOBN(0x071a2fa8, 0xced806b8), TOBN(0x222e6134, 0x697f1478),
9207 TOBN(0xdc16fd5d, 0xabfcdbbf), TOBN(0x44912ebf, 0x121b53b8),
9208 TOBN(0xac943674, 0x2496c27c), TOBN(0x8ea3176c, 0x1ffc26b0),
9209 TOBN(0xb6e224ac, 0x13debf2c), TOBN(0x524cc235, 0xf372a832),
9210 TOBN(0xd706e1d8, 0x9f6f1b18), TOBN(0x2552f005, 0x44cce35b),
9211 TOBN(0x8c8326c2, 0xa88e31fc), TOBN(0xb5468b2c, 0xf9552047),
9212 TOBN(0xce683e88, 0x3ff90f2b), TOBN(0x77947bdf, 0x2f0a5423),
9213 TOBN(0xd0a1b28b, 0xed56e328), TOBN(0xaee35253, 0xc20134ac),
9214 TOBN(0x7e98367d, 0x3567962f), TOBN(0x379ed61f, 0x8188bffb),
9215 TOBN(0x73bba348, 0xfaf130a1), TOBN(0x6c1f75e1, 0x904ed734),
9216 TOBN(0x18956642, 0x3b4a79fc), TOBN(0xf20bc83d, 0x54ef4493),
9217 TOBN(0x836d425d, 0x9111eca1), TOBN(0xe5b5c318, 0x009a8dcf),
9218 TOBN(0x3360b25d, 0x13221bc5), TOBN(0x707baad2, 0x6b3eeaf7),
9219 TOBN(0xd7279ed8, 0x743a95a1), TOBN(0x7450a875, 0x969e809f),
9220 TOBN(0x32b6bd53, 0xe5d0338f), TOBN(0x1e77f7af, 0x2b883bbc),
9221 TOBN(0x90da12cc, 0x1063ecd0), TOBN(0xe2697b58, 0xc315be47),
9222 TOBN(0x2771a5bd, 0xda85d534), TOBN(0x53e78c1f, 0xff980eea),
9223 TOBN(0xadf1cf84, 0x900385e7), TOBN(0x7d3b14f6, 0xc9387b62),
9224 TOBN(0x170e74b0, 0xcb8f2bd2), TOBN(0x2d50b486, 0x827fa993),
9225 TOBN(0xcdbe8c9a, 0xf6f32bab), TOBN(0x55e906b0, 0xc3b93ab8),
9226 TOBN(0x747f22fc, 0x8fe280d1), TOBN(0xcd8e0de5, 0xb2e114ab),
9227 TOBN(0x5ab7dbeb, 0xe10b68b0), TOBN(0x9dc63a9c, 0xa480d4b2),
9228 TOBN(0x78d4bc3b, 0x4be1495f), TOBN(0x25eb3db8, 0x9359122d),
9229 TOBN(0x3f8ac05b, 0x0809cbdc), TOBN(0xbf4187bb, 0xd37c702f),
9230 TOBN(0x84cea069, 0x1416a6a5), TOBN(0x8f860c79, 0x43ef881c),
9231 TOBN(0x41311f8a, 0x38038a5d), TOBN(0xe78c2ec0, 0xfc612067),
9232 TOBN(0x494d2e81, 0x5ad73581), TOBN(0xb4cc9e00, 0x59604097),
9233 TOBN(0xff558aec, 0xf3612cba), TOBN(0x35beef7a, 0x9e36c39e),
9234 TOBN(0x1845c7cf, 0xdbcf41b9), TOBN(0x5703662a, 0xaea997c0),
9235 TOBN(0x8b925afe, 0xe402f6d8), TOBN(0xd0a1b1ae, 0x4dd72162),
9236 TOBN(0x9f47b375, 0x03c41c4b), TOBN(0xa023829b, 0x0391d042),
9237 TOBN(0x5f5045c3, 0x503b8b0a), TOBN(0x123c2688, 0x98c010e5),
9238 TOBN(0x324ec0cc, 0x36ba06ee), TOBN(0xface3115, 0x3dd2cc0c),
9239 TOBN(0xb364f3be, 0xf333e91f), TOBN(0xef8aff73, 0x28e832b0),
9240 TOBN(0x1e9bad04, 0x2d05841b), TOBN(0x42f0e3df, 0x356a21e2),
9241 TOBN(0xa3270bcb, 0x4add627e), TOBN(0xb09a8158, 0xd322e711),
9242 TOBN(0x86e326a1, 0x0fee104a), TOBN(0xad7788f8, 0x3703f65d),
9243 TOBN(0x7e765430, 0x47bc4833), TOBN(0x6cee582b, 0x2b9b893a),
9244 TOBN(0x9cd2a167, 0xe8f55a7b), TOBN(0xefbee3c6, 0xd9e4190d),
9245 TOBN(0x33ee7185, 0xd40c2e9d), TOBN(0x844cc9c5, 0xa380b548),
9246 TOBN(0x323f8ecd, 0x66926e04), TOBN(0x0001e38f, 0x8110c1ba),
9247 TOBN(0x8dbcac12, 0xfc6a7f07), TOBN(0xd65e1d58, 0x0cec0827),
9248 TOBN(0xd2cd4141, 0xbe76ca2d), TOBN(0x7895cf5c, 0xe892f33a),
9249 TOBN(0x956d230d, 0x367139d2), TOBN(0xa91abd3e, 0xd012c4c1),
9250 TOBN(0x34fa4883, 0x87eb36bf), TOBN(0xc5f07102, 0x914b8fb4),
9251 TOBN(0x90f0e579, 0xadb9c95f), TOBN(0xfe6ea8cb, 0x28888195),
9252 TOBN(0x7b9b5065, 0xedfa9284), TOBN(0x6c510bd2, 0x2b8c8d65),
9253 TOBN(0xd7b8ebef, 0xcbe8aafd), TOBN(0xedb3af98, 0x96b1da07),
9254 TOBN(0x28ff779d, 0x6295d426), TOBN(0x0c4f6ac7, 0x3fa3ad7b),
9255 TOBN(0xec44d054, 0x8b8e2604), TOBN(0x9b32a66d, 0x8b0050e1),
9256 TOBN(0x1f943366, 0xf0476ce2), TOBN(0x7554d953, 0xa602c7b4),
9257 TOBN(0xbe35aca6, 0x524f2809), TOBN(0xb6881229, 0xfd4edbea),
9258 TOBN(0xe8cd0c8f, 0x508efb63), TOBN(0x9eb5b5c8, 0x6abcefc7),
9259 TOBN(0xf5621f5f, 0xb441ab4f), TOBN(0x79e6c046, 0xb76a2b22),
9260 TOBN(0x74a4792c, 0xe37a1f69), TOBN(0xcbd252cb, 0x03542b60),
9261 TOBN(0x785f65d5, 0xb3c20bd3), TOBN(0x8dea6143, 0x4fabc60c),
9262 TOBN(0x45e21446, 0xde673629), TOBN(0x57f7aa1e, 0x703c2d21),
9263 TOBN(0xa0e99b7f, 0x98c868c7), TOBN(0x4e42f66d, 0x8b641676),
9264 TOBN(0x602884dc, 0x91077896), TOBN(0xa0d690cf, 0xc2c9885b),
9265 TOBN(0xfeb4da33, 0x3b9a5187), TOBN(0x5f789598, 0x153c87ee),
9266 TOBN(0x2192dd47, 0x52b16dba), TOBN(0xdeefc0e6, 0x3524c1b1),
9267 TOBN(0x465ea76e, 0xe4383693), TOBN(0x79401711, 0x361b8d98),
9268 TOBN(0xa5f9ace9, 0xf21a15cb), TOBN(0x73d26163, 0xefee9aeb),
9269 TOBN(0xcca844b3, 0xe677016c), TOBN(0x6c122b07, 0x57eaee06),
9270 TOBN(0xb782dce7, 0x15f09690), TOBN(0x508b9b12, 0x2dfc0fc9),
9271 TOBN(0x9015ab4b, 0x65d89fc6), TOBN(0x5e79dab7, 0xd6d5bb0f),
9272 TOBN(0x64f021f0, 0x6c775aa2), TOBN(0xdf09d8cc, 0x37c7eca1),
9273 TOBN(0x9a761367, 0xef2fa506), TOBN(0xed4ca476, 0x5b81eec6),
9274 TOBN(0x262ede36, 0x10bbb8b5), TOBN(0x0737ce83, 0x0641ada3),
9275 TOBN(0x4c94288a, 0xe9831ccc), TOBN(0x487fc1ce, 0x8065e635),
9276 TOBN(0xb13d7ab3, 0xb8bb3659), TOBN(0xdea5df3e, 0x855e4120),
9277 TOBN(0xb9a18573, 0x85eb0244), TOBN(0x1a1b8ea3, 0xa7cfe0a3),
9278 TOBN(0x3b837119, 0x67b0867c), TOBN(0x8d5e0d08, 0x9d364520),
9279 TOBN(0x52dccc1e, 0xd930f0e3), TOBN(0xefbbcec7, 0xbf20bbaf),
9280 TOBN(0x99cffcab, 0x0263ad10), TOBN(0xd8199e6d, 0xfcd18f8a),
9281 TOBN(0x64e2773f, 0xe9f10617), TOBN(0x0079e8e1, 0x08704848),
9282 TOBN(0x1169989f, 0x8a342283), TOBN(0x8097799c, 0xa83012e6),
9283 TOBN(0xece966cb, 0x8a6a9001), TOBN(0x93b3afef, 0x072ac7fc),
9284 TOBN(0xe6893a2a, 0x2db3d5ba), TOBN(0x263dc462, 0x89bf4fdc),
9285 TOBN(0x8852dfc9, 0xe0396673), TOBN(0x7ac70895, 0x3af362b6),
9286 TOBN(0xbb9cce4d, 0x5c2f342b), TOBN(0xbf80907a, 0xb52d7aae),
9287 TOBN(0x97f3d3cd, 0x2161bcd0), TOBN(0xb25b0834, 0x0962744d),
9288 TOBN(0xc5b18ea5, 0x6c3a1dda), TOBN(0xfe4ec7eb, 0x06c92317),
9289 TOBN(0xb787b890, 0xad1c4afe), TOBN(0xdccd9a92, 0x0ede801a),
9290 TOBN(0x9ac6ddda, 0xdb58da1f), TOBN(0x22bbc12f, 0xb8cae6ee),
9291 TOBN(0xc6f8bced, 0x815c4a43), TOBN(0x8105a92c, 0xf96480c7),
9292 TOBN(0x0dc3dbf3, 0x7a859d51), TOBN(0xe3ec7ce6, 0x3041196b),
9293 TOBN(0xd9f64b25, 0x0d1067c9), TOBN(0xf2321321, 0x3d1f8dd8),
9294 TOBN(0x8b5c619c, 0x76497ee8), TOBN(0x5d2b0ac6, 0xc717370e),
9295 TOBN(0x98204cb6, 0x4fcf68e1), TOBN(0x0bdec211, 0x62bc6792),
9296 TOBN(0x6973ccef, 0xa63b1011), TOBN(0xf9e3fa97, 0xe0de1ac5),
9297 TOBN(0x5efb693e, 0x3d0e0c8b), TOBN(0x037248e9, 0xd2d4fcb4),
9298 },
9299 {TOBN(0x80802dc9, 0x1ec34f9e), TOBN(0xd8772d35, 0x33810603),
9300 TOBN(0x3f06d66c, 0x530cb4f3), TOBN(0x7be5ed0d, 0xc475c129),
9301 TOBN(0xcb9e3c19, 0x31e82b10), TOBN(0xc63d2857, 0xc9ff6b4c),
9302 TOBN(0xb92118c6, 0x92a1b45e), TOBN(0x0aec4414, 0x7285bbca),
9303 TOBN(0xfc189ae7, 0x1e29a3ef), TOBN(0xcbe906f0, 0x4c93302e),
9304 TOBN(0xd0107914, 0xceaae10e), TOBN(0xb7a23f34, 0xb68e19f8),
9305 TOBN(0xe9d875c2, 0xefd2119d), TOBN(0x03198c6e, 0xfcadc9c8),
9306 TOBN(0x65591bf6, 0x4da17113), TOBN(0x3cf0bbf8, 0x3d443038),
9307 TOBN(0xae485bb7, 0x2b724759), TOBN(0x945353e1, 0xb2d4c63a),
9308 TOBN(0x82159d07, 0xde7d6f2c), TOBN(0x389caef3, 0x4ec5b109),
9309 TOBN(0x4a8ebb53, 0xdb65ef14), TOBN(0x2dc2cb7e, 0xdd99de43),
9310 TOBN(0x816fa3ed, 0x83f2405f), TOBN(0x73429bb9, 0xc14208a3),
9311 TOBN(0xb618d590, 0xb01e6e27), TOBN(0x047e2ccd, 0xe180b2dc),
9312 TOBN(0xd1b299b5, 0x04aea4a9), TOBN(0x412c9e1e, 0x9fa403a4),
9313 TOBN(0x88d28a36, 0x79407552), TOBN(0x49c50136, 0xf332b8e3),
9314 TOBN(0x3a1b6fcc, 0xe668de19), TOBN(0x178851bc, 0x75122b97),
9315 TOBN(0xb1e13752, 0xfb85fa4c), TOBN(0xd61257ce, 0x383c8ce9),
9316 TOBN(0xd43da670, 0xd2f74dae), TOBN(0xa35aa23f, 0xbf846bbb),
9317 TOBN(0x5e74235d, 0x4421fc83), TOBN(0xf6df8ee0, 0xc363473b),
9318 TOBN(0x34d7f52a, 0x3c4aa158), TOBN(0x50d05aab, 0x9bc6d22e),
9319 TOBN(0x8c56e735, 0xa64785f4), TOBN(0xbc56637b, 0x5f29cd07),
9320 TOBN(0x53b2bb80, 0x3ee35067), TOBN(0x50235a0f, 0xdc919270),
9321 TOBN(0x191ab6d8, 0xf2c4aa65), TOBN(0xc3475831, 0x8396023b),
9322 TOBN(0x80400ba5, 0xf0f805ba), TOBN(0x8881065b, 0x5ec0f80f),
9323 TOBN(0xc370e522, 0xcc1b5e83), TOBN(0xde2d4ad1, 0x860b8bfb),
9324 TOBN(0xad364df0, 0x67b256df), TOBN(0x8f12502e, 0xe0138997),
9325 TOBN(0x503fa0dc, 0x7783920a), TOBN(0xe80014ad, 0xc0bc866a),
9326 TOBN(0x3f89b744, 0xd3064ba6), TOBN(0x03511dcd, 0xcba5dba5),
9327 TOBN(0x197dd46d, 0x95a7b1a2), TOBN(0x9c4e7ad6, 0x3c6341fb),
9328 TOBN(0x426eca29, 0x484c2ece), TOBN(0x9211e489, 0xde7f4f8a),
9329 TOBN(0x14997f6e, 0xc78ef1f4), TOBN(0x2b2c0910, 0x06574586),
9330 TOBN(0x17286a6e, 0x1c3eede8), TOBN(0x25f92e47, 0x0f60e018),
9331 TOBN(0x805c5646, 0x31890a36), TOBN(0x703ef600, 0x57feea5b),
9332 TOBN(0x389f747c, 0xaf3c3030), TOBN(0xe0e5daeb, 0x54dd3739),
9333 TOBN(0xfe24a4c3, 0xc9c9f155), TOBN(0x7e4bf176, 0xb5393962),
9334 TOBN(0x37183de2, 0xaf20bf29), TOBN(0x4a1bd7b5, 0xf95a8c3b),
9335 TOBN(0xa83b9699, 0x46191d3d), TOBN(0x281fc8dd, 0x7b87f257),
9336 TOBN(0xb18e2c13, 0x54107588), TOBN(0x6372def7, 0x9b2bafe8),
9337 TOBN(0xdaf4bb48, 0x0d8972ca), TOBN(0x3f2dd4b7, 0x56167a3f),
9338 TOBN(0x1eace32d, 0x84310cf4), TOBN(0xe3bcefaf, 0xe42700aa),
9339 TOBN(0x5fe5691e, 0xd785e73d), TOBN(0xa5db5ab6, 0x2ea60467),
9340 TOBN(0x02e23d41, 0xdfc6514a), TOBN(0x35e8048e, 0xe03c3665),
9341 TOBN(0x3f8b118f, 0x1adaa0f8), TOBN(0x28ec3b45, 0x84ce1a5a),
9342 TOBN(0xe8cacc6e, 0x2c6646b8), TOBN(0x1343d185, 0xdbd0e40f),
9343 TOBN(0xe5d7f844, 0xcaaa358c), TOBN(0x1a1db7e4, 0x9924182a),
9344 TOBN(0xd64cd42d, 0x9c875d9a), TOBN(0xb37b515f, 0x042eeec8),
9345 TOBN(0x4d4dd409, 0x7b165fbe), TOBN(0xfc322ed9, 0xe206eff3),
9346 TOBN(0x7dee4102, 0x59b7e17e), TOBN(0x55a481c0, 0x8236ca00),
9347 TOBN(0x8c885312, 0xc23fc975), TOBN(0x15715806, 0x05d6297b),
9348 TOBN(0xa078868e, 0xf78edd39), TOBN(0x956b31e0, 0x03c45e52),
9349 TOBN(0x470275d5, 0xff7b33a6), TOBN(0xc8d5dc3a, 0x0c7e673f),
9350 TOBN(0x419227b4, 0x7e2f2598), TOBN(0x8b37b634, 0x4c14a975),
9351 TOBN(0xd0667ed6, 0x8b11888c), TOBN(0x5e0e8c3e, 0x803e25dc),
9352 TOBN(0x34e5d0dc, 0xb987a24a), TOBN(0x9f40ac3b, 0xae920323),
9353 TOBN(0x5463de95, 0x34e0f63a), TOBN(0xa128bf92, 0x6b6328f9),
9354 TOBN(0x491ccd7c, 0xda64f1b7), TOBN(0x7ef1ec27, 0xc47bde35),
9355 TOBN(0xa857240f, 0xa36a2737), TOBN(0x35dc1366, 0x63621bc1),
9356 TOBN(0x7a3a6453, 0xd4fb6897), TOBN(0x80f1a439, 0xc929319d),
9357 TOBN(0xfc18274b, 0xf8cb0ba0), TOBN(0xb0b53766, 0x8078c5eb),
9358 TOBN(0xfb0d4924, 0x1e01d0ef), TOBN(0x50d7c67d, 0x372ab09c),
9359 TOBN(0xb4e370af, 0x3aeac968), TOBN(0xe4f7fee9, 0xc4b63266),
9360 TOBN(0xb4acd4c2, 0xe3ac5664), TOBN(0xf8910bd2, 0xceb38cbf),
9361 TOBN(0x1c3ae50c, 0xc9c0726e), TOBN(0x15309569, 0xd97b40bf),
9362 TOBN(0x70884b7f, 0xfd5a5a1b), TOBN(0x3890896a, 0xef8314cd),
9363 TOBN(0x58e1515c, 0xa5618c93), TOBN(0xe665432b, 0x77d942d1),
9364 TOBN(0xb32181bf, 0xb6f767a8), TOBN(0x753794e8, 0x3a604110),
9365 TOBN(0x09afeb7c, 0xe8c0dbcc), TOBN(0x31e02613, 0x598673a3),
9366 TOBN(0x5d98e557, 0x7d46db00), TOBN(0xfc21fb8c, 0x9d985b28),
9367 TOBN(0xc9040116, 0xb0843e0b), TOBN(0x53b1b3a8, 0x69b04531),
9368 TOBN(0xdd1649f0, 0x85d7d830), TOBN(0xbb3bcc87, 0xcb7427e8),
9369 TOBN(0x77261100, 0xc93dce83), TOBN(0x7e79da61, 0xa1922a2a),
9370 TOBN(0x587a2b02, 0xf3149ce8), TOBN(0x147e1384, 0xde92ec83),
9371 TOBN(0x484c83d3, 0xaf077f30), TOBN(0xea78f844, 0x0658b53a),
9372 TOBN(0x912076c2, 0x027aec53), TOBN(0xf34714e3, 0x93c8177d),
9373 TOBN(0x37ef5d15, 0xc2376c84), TOBN(0x8315b659, 0x3d1aa783),
9374 TOBN(0x3a75c484, 0xef852a90), TOBN(0x0ba0c58a, 0x16086bd4),
9375 TOBN(0x29688d7a, 0x529a6d48), TOBN(0x9c7f250d, 0xc2f19203),
9376 TOBN(0x123042fb, 0x682e2df9), TOBN(0x2b7587e7, 0xad8121bc),
9377 TOBN(0x30fc0233, 0xe0182a65), TOBN(0xb82ecf87, 0xe3e1128a),
9378 TOBN(0x71682861, 0x93fb098f), TOBN(0x043e21ae, 0x85e9e6a7),
9379 TOBN(0xab5b49d6, 0x66c834ea), TOBN(0x3be43e18, 0x47414287),
9380 TOBN(0xf40fb859, 0x219a2a47), TOBN(0x0e6559e9, 0xcc58df3c),
9381 TOBN(0xfe1dfe8e, 0x0c6615b4), TOBN(0x14abc8fd, 0x56459d70),
9382 TOBN(0x7be0fa8e, 0x05de0386), TOBN(0x8e63ef68, 0xe9035c7c),
9383 TOBN(0x116401b4, 0x53b31e91), TOBN(0x0cba7ad4, 0x4436b4d8),
9384 TOBN(0x9151f9a0, 0x107afd66), TOBN(0xafaca8d0, 0x1f0ee4c4),
9385 TOBN(0x75fe5c1d, 0x9ee9761c), TOBN(0x3497a16b, 0xf0c0588f),
9386 TOBN(0x3ee2bebd, 0x0304804c), TOBN(0xa8fb9a60, 0xc2c990b9),
9387 TOBN(0xd14d32fe, 0x39251114), TOBN(0x36bf25bc, 0xcac73366),
9388 TOBN(0xc9562c66, 0xdba7495c), TOBN(0x324d301b, 0x46ad348b),
9389 TOBN(0x9f46620c, 0xd670407e), TOBN(0x0ea8d4f1, 0xe3733a01),
9390 TOBN(0xd396d532, 0xb0c324e0), TOBN(0x5b211a0e, 0x03c317cd),
9391 TOBN(0x090d7d20, 0x5ffe7b37), TOBN(0x3b7f3efb, 0x1747d2da),
9392 TOBN(0xa2cb525f, 0xb54fc519), TOBN(0x6e220932, 0xf66a971e),
9393 TOBN(0xddc160df, 0xb486d440), TOBN(0x7fcfec46, 0x3fe13465),
9394 TOBN(0x83da7e4e, 0x76e4c151), TOBN(0xd6fa48a1, 0xd8d302b5),
9395 TOBN(0xc6304f26, 0x5872cd88), TOBN(0x806c1d3c, 0x278b90a1),
9396 TOBN(0x3553e725, 0xcaf0bc1c), TOBN(0xff59e603, 0xbb9d8d5c),
9397 TOBN(0xa4550f32, 0x7a0b85dd), TOBN(0xdec5720a, 0x93ecc217),
9398 TOBN(0x0b88b741, 0x69d62213), TOBN(0x7212f245, 0x5b365955),
9399 TOBN(0x20764111, 0xb5cae787), TOBN(0x13cb7f58, 0x1dfd3124),
9400 TOBN(0x2dca77da, 0x1175aefb), TOBN(0xeb75466b, 0xffaae775),
9401 TOBN(0x74d76f3b, 0xdb6cff32), TOBN(0x7440f37a, 0x61fcda9a),
9402 TOBN(0x1bb3ac92, 0xb525028b), TOBN(0x20fbf8f7, 0xa1975f29),
9403 TOBN(0x982692e1, 0xdf83097f), TOBN(0x28738f6c, 0x554b0800),
9404 TOBN(0xdc703717, 0xa2ce2f2f), TOBN(0x7913b93c, 0x40814194),
9405 TOBN(0x04924593, 0x1fe89636), TOBN(0x7b98443f, 0xf78834a6),
9406 TOBN(0x11c6ab01, 0x5114a5a1), TOBN(0x60deb383, 0xffba5f4c),
9407 TOBN(0x4caa54c6, 0x01a982e6), TOBN(0x1dd35e11, 0x3491cd26),
9408 TOBN(0x973c315f, 0x7cbd6b05), TOBN(0xcab00775, 0x52494724),
9409 TOBN(0x04659b1f, 0x6565e15a), TOBN(0xbf30f529, 0x8c8fb026),
9410 TOBN(0xfc21641b, 0xa8a0de37), TOBN(0xe9c7a366, 0xfa5e5114),
9411 TOBN(0xdb849ca5, 0x52f03ad8), TOBN(0xc7e8dbe9, 0x024e35c0),
9412 TOBN(0xa1a2bbac, 0xcfc3c789), TOBN(0xbf733e7d, 0x9c26f262),
9413 TOBN(0x882ffbf5, 0xb8444823), TOBN(0xb7224e88, 0x6bf8483b),
9414 TOBN(0x53023b8b, 0x65bef640), TOBN(0xaabfec91, 0xd4d5f8cd),
9415 TOBN(0xa40e1510, 0x079ea1bd), TOBN(0x1ad9addc, 0xd05d5d26),
9416 TOBN(0xdb3f2eab, 0x13e68d4f), TOBN(0x1cff1ae2, 0x640f803f),
9417 TOBN(0xe0e7b749, 0xd4cee117), TOBN(0x8e9f275b, 0x4036d909),
9418 TOBN(0xce34e31d, 0x8f4d4c38), TOBN(0x22b37f69, 0xd75130fc),
9419 TOBN(0x83e0f1fd, 0xb4014604), TOBN(0xa8ce9919, 0x89415078),
9420 TOBN(0x82375b75, 0x41792efe), TOBN(0x4f59bf5c, 0x97d4515b),
9421 TOBN(0xac4f324f, 0x923a277d), TOBN(0xd9bc9b7d, 0x650f3406),
9422 TOBN(0xc6fa87d1, 0x8a39bc51), TOBN(0x82588530, 0x5ccc108f),
9423 TOBN(0x5ced3c9f, 0x82e4c634), TOBN(0x8efb8314, 0x3a4464f8),
9424 TOBN(0xe706381b, 0x7a1dca25), TOBN(0x6cd15a3c, 0x5a2a412b),
9425 TOBN(0x9347a8fd, 0xbfcd8fb5), TOBN(0x31db2eef, 0x6e54cd22),
9426 TOBN(0xc4aeb11e, 0xf8d8932f), TOBN(0x11e7c1ed, 0x344411af),
9427 TOBN(0x2653050c, 0xdc9a151e), TOBN(0x9edbfc08, 0x3bb0a859),
9428 TOBN(0x926c81c7, 0xfd5691e7), TOBN(0x9c1b2342, 0x6f39019a),
9429 TOBN(0x64a81c8b, 0x7f8474b9), TOBN(0x90657c07, 0x01761819),
9430 TOBN(0x390b3331, 0x55e0375a), TOBN(0xc676c626, 0xb6ebc47d),
9431 TOBN(0x51623247, 0xb7d6dee8), TOBN(0x0948d927, 0x79659313),
9432 TOBN(0x99700161, 0xe9ab35ed), TOBN(0x06cc32b4, 0x8ddde408),
9433 TOBN(0x6f2fd664, 0x061ef338), TOBN(0x1606fa02, 0xc202e9ed),
9434 TOBN(0x55388bc1, 0x929ba99b), TOBN(0xc4428c5e, 0x1e81df69),
9435 TOBN(0xce2028ae, 0xf91b0b2a), TOBN(0xce870a23, 0xf03dfd3f),
9436 TOBN(0x66ec2c87, 0x0affe8ed), TOBN(0xb205fb46, 0x284d0c00),
9437 TOBN(0xbf5dffe7, 0x44cefa48), TOBN(0xb6fc37a8, 0xa19876d7),
9438 TOBN(0xbecfa84c, 0x08b72863), TOBN(0xd7205ff5, 0x2576374f),
9439 TOBN(0x80330d32, 0x8887de41), TOBN(0x5de0df0c, 0x869ea534),
9440 TOBN(0x13f42753, 0x3c56ea17), TOBN(0xeb1f6069, 0x452b1a78),
9441 TOBN(0x50474396, 0xe30ea15c), TOBN(0x575816a1, 0xc1494125),
9442 TOBN(0xbe1ce55b, 0xfe6bb38f), TOBN(0xb901a948, 0x96ae30f7),
9443 TOBN(0xe5af0f08, 0xd8fc3548), TOBN(0x5010b5d0, 0xd73bfd08),
9444 TOBN(0x993d2880, 0x53fe655a), TOBN(0x99f2630b, 0x1c1309fd),
9445 TOBN(0xd8677baf, 0xb4e3b76f), TOBN(0x14e51ddc, 0xb840784b),
9446 TOBN(0x326c750c, 0xbf0092ce), TOBN(0xc83d306b, 0xf528320f),
9447 TOBN(0xc4456715, 0x77d4715c), TOBN(0xd30019f9, 0x6b703235),
9448 TOBN(0x207ccb2e, 0xd669e986), TOBN(0x57c824af, 0xf6dbfc28),
9449 TOBN(0xf0eb532f, 0xd8f92a23), TOBN(0x4a557fd4, 0x9bb98fd2),
9450 TOBN(0xa57acea7, 0xc1e6199a), TOBN(0x0c663820, 0x8b94b1ed),
9451 TOBN(0x9b42be8f, 0xf83a9266), TOBN(0xc7741c97, 0x0101bd45),
9452 TOBN(0x95770c11, 0x07bd9ceb), TOBN(0x1f50250a, 0x8b2e0744),
9453 TOBN(0xf762eec8, 0x1477b654), TOBN(0xc65b900e, 0x15efe59a),
9454 TOBN(0x88c96148, 0x9546a897), TOBN(0x7e8025b3, 0xc30b4d7c),
9455 TOBN(0xae4065ef, 0x12045cf9), TOBN(0x6fcb2caf, 0x9ccce8bd),
9456 TOBN(0x1fa0ba4e, 0xf2cf6525), TOBN(0xf683125d, 0xcb72c312),
9457 TOBN(0xa01da4ea, 0xe312410e), TOBN(0x67e28677, 0x6cd8e830),
9458 TOBN(0xabd95752, 0x98fb3f07), TOBN(0x05f11e11, 0xeef649a5),
9459 TOBN(0xba47faef, 0x9d3472c2), TOBN(0x3adff697, 0xc77d1345),
9460 TOBN(0x4761fa04, 0xdd15afee), TOBN(0x64f1f61a, 0xb9e69462),
9461 TOBN(0xfa691fab, 0x9bfb9093), TOBN(0x3df8ae8f, 0xa1133dfe),
9462 TOBN(0xcd5f8967, 0x58cc710d), TOBN(0xfbb88d50, 0x16c7fe79),
9463 TOBN(0x8e011b4c, 0xe88c50d1), TOBN(0x7532e807, 0xa8771c4f),
9464 TOBN(0x64c78a48, 0xe2278ee4), TOBN(0x0b283e83, 0x3845072a),
9465 TOBN(0x98a6f291, 0x49e69274), TOBN(0xb96e9668, 0x1868b21c),
9466 TOBN(0x38f0adc2, 0xb1a8908e), TOBN(0x90afcff7, 0x1feb829d),
9467 TOBN(0x9915a383, 0x210b0856), TOBN(0xa5a80602, 0xdef04889),
9468 TOBN(0x800e9af9, 0x7c64d509), TOBN(0x81382d0b, 0xb8996f6f),
9469 TOBN(0x490eba53, 0x81927e27), TOBN(0x46c63b32, 0x4af50182),
9470 TOBN(0x784c5fd9, 0xd3ad62ce), TOBN(0xe4fa1870, 0xf8ae8736),
9471 TOBN(0x4ec9d0bc, 0xd7466b25), TOBN(0x84ddbe1a, 0xdb235c65),
9472 TOBN(0x5e2645ee, 0x163c1688), TOBN(0x570bd00e, 0x00eba747),
9473 TOBN(0xfa51b629, 0x128bfa0f), TOBN(0x92fce1bd, 0x6c1d3b68),
9474 TOBN(0x3e7361dc, 0xb66778b1), TOBN(0x9c7d249d, 0x5561d2bb),
9475 TOBN(0xa40b28bf, 0x0bbc6229), TOBN(0x1c83c05e, 0xdfd91497),
9476 TOBN(0x5f9f5154, 0xf083df05), TOBN(0xbac38b3c, 0xeee66c9d),
9477 TOBN(0xf71db7e3, 0xec0dfcfd), TOBN(0xf2ecda8e, 0x8b0a8416),
9478 TOBN(0x52fddd86, 0x7812aa66), TOBN(0x2896ef10, 0x4e6f4272),
9479 TOBN(0xff27186a, 0x0fe9a745), TOBN(0x08249fcd, 0x49ca70db),
9480 TOBN(0x7425a2e6, 0x441cac49), TOBN(0xf4a0885a, 0xece5ff57),
9481 TOBN(0x6e2cb731, 0x7d7ead58), TOBN(0xf96cf7d6, 0x1898d104),
9482 TOBN(0xafe67c9d, 0x4f2c9a89), TOBN(0x89895a50, 0x1c7bf5bc),
9483 TOBN(0xdc7cb8e5, 0x573cecfa), TOBN(0x66497eae, 0xd15f03e6),
9484 TOBN(0x6bc0de69, 0x3f084420), TOBN(0x323b9b36, 0xacd532b0),
9485 TOBN(0xcfed390a, 0x0115a3c1), TOBN(0x9414c40b, 0x2d65ca0e),
9486 TOBN(0x641406bd, 0x2f530c78), TOBN(0x29369a44, 0x833438f2),
9487 TOBN(0x996884f5, 0x903fa271), TOBN(0xe6da0fd2, 0xb9da921e),
9488 TOBN(0xa6f2f269, 0x5db01e54), TOBN(0x1ee3e9bd, 0x6876214e),
9489 TOBN(0xa26e181c, 0xe27a9497), TOBN(0x36d254e4, 0x8e215e04),
9490 TOBN(0x42f32a6c, 0x252cabca), TOBN(0x99481487, 0x80b57614),
9491 TOBN(0x4c4dfe69, 0x40d9cae1), TOBN(0x05869580, 0x11a10f09),
9492 TOBN(0xca287b57, 0x3491b64b), TOBN(0x77862d5d, 0x3fd4a53b),
9493 TOBN(0xbf94856e, 0x50349126), TOBN(0x2be30bd1, 0x71c5268f),
9494 TOBN(0x10393f19, 0xcbb650a6), TOBN(0x639531fe, 0x778cf9fd),
9495 TOBN(0x02556a11, 0xb2935359), TOBN(0xda38aa96, 0xaf8c126e),
9496 TOBN(0x47dbe6c2, 0x0960167f), TOBN(0x37bbabb6, 0x501901cd),
9497 TOBN(0xb6e979e0, 0x2c947778), TOBN(0xd69a5175, 0x7a1a1dc6),
9498 TOBN(0xc3ed5095, 0x9d9faf0c), TOBN(0x4dd9c096, 0x1d5fa5f0),
9499 TOBN(0xa0c4304d, 0x64f16ea8), TOBN(0x8b1cac16, 0x7e718623),
9500 TOBN(0x0b576546, 0x7c67f03e), TOBN(0x559cf5ad, 0xcbd88c01),
9501 TOBN(0x074877bb, 0x0e2af19a), TOBN(0x1f717ec1, 0xa1228c92),
9502 TOBN(0x70bcb800, 0x326e8920), TOBN(0xec6e2c5c, 0x4f312804),
9503 TOBN(0x426aea7d, 0x3fca4752), TOBN(0xf12c0949, 0x2211f62a),
9504 TOBN(0x24beecd8, 0x7be7b6b5), TOBN(0xb77eaf4c, 0x36d7a27d),
9505 TOBN(0x154c2781, 0xfda78fd3), TOBN(0x848a83b0, 0x264eeabe),
9506 TOBN(0x81287ef0, 0x4ffe2bc4), TOBN(0x7b6d88c6, 0xb6b6fc2a),
9507 TOBN(0x805fb947, 0xce417d99), TOBN(0x4b93dcc3, 0x8b916cc4),
9508 TOBN(0x72e65bb3, 0x21273323), TOBN(0xbcc1badd, 0x6ea9886e),
9509 TOBN(0x0e223011, 0x4bc5ee85), TOBN(0xa561be74, 0xc18ee1e4),
9510 TOBN(0x762fd2d4, 0xa6bcf1f1), TOBN(0x50e6a5a4, 0x95231489),
9511 TOBN(0xca96001f, 0xa00b500b), TOBN(0x5c098cfc, 0x5d7dcdf5),
9512 TOBN(0xa64e2d2e, 0x8c446a85), TOBN(0xbae9bcf1, 0x971f3c62),
9513 TOBN(0x4ec22683, 0x8435a2c5), TOBN(0x8ceaed6c, 0x4bad4643),
9514 TOBN(0xe9f8fb47, 0xccccf4e3), TOBN(0xbd4f3fa4, 0x1ce3b21e),
9515 TOBN(0xd79fb110, 0xa3db3292), TOBN(0xe28a37da, 0xb536c66a),
9516 TOBN(0x279ce87b, 0x8e49e6a9), TOBN(0x70ccfe8d, 0xfdcec8e3),
9517 TOBN(0x2193e4e0, 0x3ba464b2), TOBN(0x0f39d60e, 0xaca9a398),
9518 TOBN(0x7d7932af, 0xf82c12ab), TOBN(0xd8ff50ed, 0x91e7e0f7),
9519 TOBN(0xea961058, 0xfa28a7e0), TOBN(0xc726cf25, 0x0bf5ec74),
9520 TOBN(0xe74d55c8, 0xdb229666), TOBN(0x0bd9abbf, 0xa57f5799),
9521 TOBN(0x7479ef07, 0x4dfc47b3), TOBN(0xd9c65fc3, 0x0c52f91d),
9522 TOBN(0x8e0283fe, 0x36a8bde2), TOBN(0xa32a8b5e, 0x7d4b7280),
9523 TOBN(0x6a677c61, 0x12e83233), TOBN(0x0fbb3512, 0xdcc9bf28),
9524 TOBN(0x562e8ea5, 0x0d780f61), TOBN(0x0db8b22b, 0x1dc4e89c),
9525 TOBN(0x0a6fd1fb, 0x89be0144), TOBN(0x8c77d246, 0xca57113b),
9526 TOBN(0x4639075d, 0xff09c91c), TOBN(0x5b47b17f, 0x5060824c),
9527 TOBN(0x58aea2b0, 0x16287b52), TOBN(0xa1343520, 0xd0cd8eb0),
9528 TOBN(0x6148b4d0, 0xc5d58573), TOBN(0xdd2b6170, 0x291c68ae),
9529 TOBN(0xa61b3929, 0x1da3b3b7), TOBN(0x5f946d79, 0x08c4ac10),
9530 TOBN(0x4105d4a5, 0x7217d583), TOBN(0x5061da3d, 0x25e6de5e),
9531 TOBN(0x3113940d, 0xec1b4991), TOBN(0xf12195e1, 0x36f485ae),
9532 TOBN(0xa7507fb2, 0x731a2ee0), TOBN(0x95057a8e, 0x6e9e196e),
9533 TOBN(0xa3c2c911, 0x2e130136), TOBN(0x97dfbb36, 0x33c60d15),
9534 TOBN(0xcaf3c581, 0xb300ee2b), TOBN(0x77f25d90, 0xf4bac8b8),
9535 TOBN(0xdb1c4f98, 0x6d840cd6), TOBN(0x471d62c0, 0xe634288c),
9536 TOBN(0x8ec2f85e, 0xcec8a161), TOBN(0x41f37cbc, 0xfa6f4ae2),
9537 TOBN(0x6793a20f, 0x4b709985), TOBN(0x7a7bd33b, 0xefa8985b),
9538 TOBN(0x2c6a3fbd, 0x938e6446), TOBN(0x19042619, 0x2a8d47c1),
9539 TOBN(0x16848667, 0xcc36975f), TOBN(0x02acf168, 0x9d5f1dfb),
9540 TOBN(0x62d41ad4, 0x613baa94), TOBN(0xb56fbb92, 0x9f684670),
9541 TOBN(0xce610d0d, 0xe9e40569), TOBN(0x7b99c65f, 0x35489fef),
9542 TOBN(0x0c88ad1b, 0x3df18b97), TOBN(0x81b7d9be, 0x5d0e9edb),
9543 TOBN(0xd85218c0, 0xc716cc0a), TOBN(0xf4b5ff90, 0x85691c49),
9544 TOBN(0xa4fd666b, 0xce356ac6), TOBN(0x17c72895, 0x4b327a7a),
9545 TOBN(0xf93d5085, 0xda6be7de), TOBN(0xff71530e, 0x3301d34e),
9546 TOBN(0x4cd96442, 0xd8f448e8), TOBN(0x9283d331, 0x2ed18ffa),
9547 TOBN(0x4d33dd99, 0x2a849870), TOBN(0xa716964b, 0x41576335),
9548 TOBN(0xff5e3a9b, 0x179be0e5), TOBN(0x5b9d6b1b, 0x83b13632),
9549 TOBN(0x3b8bd7d4, 0xa52f313b), TOBN(0xc9dd95a0, 0x637a4660),
9550 TOBN(0x30035962, 0x0b3e218f), TOBN(0xce1481a3, 0xc7b28a3c),
9551 TOBN(0xab41b43a, 0x43228d83), TOBN(0x24ae1c30, 0x4ad63f99),
9552 TOBN(0x8e525f1a, 0x46a51229), TOBN(0x14af860f, 0xcd26d2b4),
9553 TOBN(0xd6baef61, 0x3f714aa1), TOBN(0xf51865ad, 0xeb78795e),
9554 TOBN(0xd3e21fce, 0xe6a9d694), TOBN(0x82ceb1dd, 0x8a37b527)}
9555};
9556
9557__END_HIDDEN_DECLS